Как добавить двоеточие к имени файла

Обновлено: 05.07.2024

Действительно ли Linux допускает использование двоеточий в именах файлов даже в разделах NTFS? Почему это? И есть ли возможность исправить это и не разрешать двоеточия (и другие символы, запрещенные Windows) в именах файлов при работе с разделом NTFS? И разрешить ли это для разделов Ext2, Ext3 и Ext4?

Linux записал несколько файлов с двоеточием в имени в мой основной раздел NTFS, где у меня установлена ​​Windows. С тех пор я удалил Linux, но теперь не могу открыть эти файлы в Windows.

Почему: потому что в Linux разрешены любые символы, кроме nul и / в именах файлов. : используется в названии сокета X и еще немного. Я не знаю о части NTFS.

Двоеточие в NT обозначает поток (т. е. "подфайл") — так же, как старые ответвления MAC HFS. (это чертовски хороший способ спрятать вещи в окнах.)

вино использует двоеточие в символических ссылках в ~/.wine/dosdevices, что иронично, не так ли? поскольку эти имена не будут разрешены в разделе NTFS. Вы должны отключить потоки, если хотите использовать их, как на ext4. Насколько я знаю, вы можете сделать это в своем fstab. Или с вашим вопросом (что наоборот) убедитесь, что вы НЕ отключаете его. Вы, вероятно, не хотите этого, хотя, если вы используете раздел для пользовательских или временных каталогов, поскольку многие инструменты там используют двоеточия, такие как спам-убийца (сверху у меня в голове), вы можете удалить эти файлы, я думаю, с помощью пакета sysinternals

2 ответа 2

В случае NTFS-3G проверьте справочную страницу ntfs-3g и найдите «windows_names».

имя_окна

Этот параметр предотвращает создание файлов, каталогов и расширенных атрибутов с именем, не разрешенным Windows, либо потому, что оно содержит недопустимый символ (девять символов ” * / : < >? \ | и тех, чей код меньше 0×20) или потому что последним символом является пробел или точка. Существующие такие файлы по-прежнему можно читать (и переименовывать).

даже на разделах NTFS? Почему?

Помимо имен файлов Win32, NTFS также поддерживает имена DOS и POSIX с помощью механизма пространств имен файлов. Таким образом, в имени файла могут быть не только двоеточия или обратные косые черты, но и несколько имен.

Возможно, вы видели имена файлов DOS, например. в командной строке, например MICROS~1 ниже (или часто встречающееся имя PROGRA~1 для Program Files в корневом каталоге C: ):

В приведенном выше списке каталогов два пространства имен файлов перечислены рядом друг с другом. Записи, имена Win32 которых не конфликтуют с DOS, не имеют имени DOS.

Без параметра windows_names, упомянутого в другом ответе, драйвер Linux NTFS ntfs-3g использует пространство имен POSIX для именования создаваемых им файлов.

Я предполагаю, что файл создается какой-то системой Unix или Linux, но я не уверен, как пользователи сохраняют его с недопустимым именем файла. Я закодировал часть, которая должна переименовывать документ при загрузке. Моя проблема в том, что я не могу проверить это, потому что я не могу получить файл в Windows, в имени которого есть двоеточие.

Есть несколько символов, которые просто не допускаются в именах файлов Windows, двоеточие — один из них. Извините.

Это можно сделать с помощью собственного API или драйвера устройства. Но вы не сможете загрузить файл из приложения Windows или сделать с ним что-либо еще.

Я часто использую двоеточие во всю ширину : в именах файлов. Это символ Unicode, очень похожий на двоеточие, поэтому я использую его там, где Windows не разрешает использовать обычное двоеточие. Он визуально окружен пробелами, которые вы не можете удалить. Я наткнулся на него давным-давно, а теперь просто копирую и вставляю, когда мне это нужно.

7 ответов 7

Я нашел символ, очень похожий на двоеточие, "꞉". Это символ Юникода, который называется буквой-модификатором двоеточия. У него нет пробела, как у полноширинного двоеточия, и он почти такой же, как обычное двоеточие, но символ работает. Вы можете либо скопировать и вставить его сверху, либо использовать кодовую точку U+A789

Отлично. Я уже некоторое время отслеживаю эти замены юникода для имен файлов, так что спасибо! Ты обалденный. Я знаю, что вы не спрашивали, но если вам когда-нибудь понадобится вопросительный знак, вы можете использовать вместо него «⁇». (U+2047). Для косой черты вы можете использовать косую черту деления: '∕' (U+2215). Возможно, кому-то они пригодятся.

Двоеточие — это недопустимый символ для имени файла Windows. Вы не сможете разрешить ':' в имени файла, но вы можете обойти это.

Я думаю, что решил проблему, переименовав загруженные файлы на лету, но мне нужно каким-то образом загрузить файл на компьютер с Windows с двоеточием в имени файла. Наши клиенты каким-то образом делают это, поэтому это должно быть возможно.

@David: что заставляет вас думать, что ваши клиенты делают это? Вы уверены, что загрузка идет с компьютеров Windows?

Будьте осторожны - вы можете создать что-то с именем FOO:BAR, но тогда у вас будет файл с именем FOO, содержащий поток данных с именем BAR (а также безымянный поток данных). В списке каталогов вы увидите просто FOO.

Я получаю сообщение об ошибке, связанное с попыткой загрузки имени файла. Я подтвердил, что по крайней мере некоторые из попыток загрузки были с компьютеров Windows.

Я знаю, что это не предназначено, но мне как-то нужно убедиться, что мое решение устранило проблему. Как мне создать файл с именем foo:bar?

Другие замены, которые я нашел для зарезервированных символов,

Например, в Python вы бы сделали:

man 8 ntfs-3g заявляет: Запрещенными символами являются девять символов " * / : < >? \ | . Я насчитал 10 в вашем ответе, для чего он нужен: ⑊ ?

@malat в этом случае это не один символ, это будет замена двух символов \\ одним похожим символом ⑊ , потому что замена его двумя заменяющими односимвольными обратными косыми чертами будет выглядеть так \\

Судя по имени файла, которое вы указали, возможно, что символ, который у вас есть в ваших именах файлов, не является буквальным двоеточием : , который является зарезервированным символом в именах файлов Windows, а двоеточием полной ширины : Вместо этого. Это символ Unicode, очень похожий на двоеточие, визуально окруженный пробелами, которые вы не можете удалить. Вы можете обращаться с ним точно так же, как с любым символом Unicode, кодовая точка U+FF1A .

это не относится к вопросу ОП; хотя совет очень хороший, вы должны либо поместить его в комментарий к вопросу или задать/ответить на него в стиле вопросов и ответов, как в Jeopardy, сначала спросив «Как использовать двоеточие в именах файлов Windows?» вопрос, выбрав ответ в стиле вопросов и ответов и предоставив эту информацию там.

@vaxquis: наоборот, я думаю, что это действительно было причиной проблемы ОП; он думал, что в именах файлов, с которыми он пытался работать, были двоеточия, но они, вероятно, были двоеточиями во всю ширину.

Вы можете использовать CJK (китайский/японский/корейский)

что является довольно общим.

Затем вы можете создать двоеточие в своем дистрибутиве Linux.

КАК НАЗВАТЬ ФАЙЛ ИЛИ ПАПКУ, ИСПОЛЬЗУЯ СИМВОЛ, ПОХОЖИЙ НА ДВОРОТЫ

В приведенном ниже примере размер шрифта равен 12, за исключением символа, для которого заданы значения Subscript, Bold и размер шрифта 16. Код символа для символа, похожего на двоеточие, — 02F8.

Причина установки нижнего индекса заключается в том, чтобы расположить символ ниже относительно его вертикального положения. Параметры полужирного шрифта и более крупного шрифта применяются, чтобы символ был более различим на странице и не влиял на его использование в имени файла или папки.


Недавно я клонировал репозиторий git с конфигурацией puppet, который содержит файлы, в именах которых есть символ двоеточия (:).

Насколько мне известно, некоторые символы (например, / * ? : < >) нельзя было использовать в именах файлов. Когда стал разрешен символ ':'?

Это подводит меня к другому вопросу. какое неприятное возможное имя файла вы можете придумать? Может у вас есть файл с именем "sudo rm -rf/" или что-то в этом роде?


В имени файла нельзя использовать только символы косой черты ('/') и NULL ('\0').

Создание имен файлов, содержащих обратную косую черту ('/'), точку с запятой (';') и вертикальную черту ('|'), может привести к тому, что пользователь будет выполнять произвольные команды.

Это не обратная косая черта.

Это обратная косая черта ('\').

Двоеточия запрещены в мире Windows, поскольку они противоречат соглашению об именовании букв дисков (C:). В Linux такого запрета нет. При этом, если вы попытаетесь скопировать указанный файл в систему Windows, результаты будут «интересными».

Это ответ, который вы ищете, ОП. Остальные технически правильны, но не решают вашу конкретную дилемму.

Вы действительно можете скопировать их, если подключите диск Windows под Linux и скопируете их.

Windows сообщит вам, что не может прочитать файл, что имя недействительно или путь неверный.

Windows запрещает использование всех символов, специально интерпретируемых оболочкой, и всех имен, используемых для имен устройств DOS. В Linux разрешено все, кроме «/» (косая черта) и NUL или файлов с именами «.» или "..".

Интересно, что NTFS позволяет создавать файлы с именами, запрещенными Windows. Вы можете сделать это с помощью Cygwin или если вы используете диск в Linux. Файловая система это позволяет, а Windows API — нет. У вас будет странное поведение с программами Windows, но Cygwin прекрасно с этим справится.

Все файловые системы, поддерживаемые Windows, используют концепцию файлов и каталогов для доступа к данным, хранящимся на диске или устройстве.Разработчики Windows, работающие с Windows API для ввода-вывода файлов и устройств, должны понимать различные правила, соглашения и ограничения имен файлов и каталогов.

Доступ к данным можно получить с дисков, устройств и общих сетевых ресурсов с помощью API файлового ввода-вывода. Файлы и каталоги, наряду с пространствами имен, являются частью концепции пути, который представляет собой строковое представление того, где можно получить данные, независимо от того, получены ли они с диска, устройства или сетевого подключения для конкретной операции.

Некоторые файловые системы, такие как NTFS, поддерживают связанные файлы и каталоги, которые также следуют соглашениям и правилам именования файлов, как и обычные файлы или каталоги. Дополнительные сведения см. в разделах «Жесткие ссылки и соединения» и «Точки повторной обработки и операции с файлами».

Дополнительную информацию см. в следующих подразделах:

Чтобы узнать, как настроить Windows 10 для поддержки длинных путей к файлам, см. статью Ограничение максимальной длины пути.

Имена файлов и каталогов

Все файловые системы следуют одним и тем же общим соглашениям об именах для отдельных файлов: базовое имя файла и необязательное расширение, разделенные точкой. Однако каждая файловая система, такая как NTFS, CDFS, exFAT, UDFS, FAT и FAT32, может иметь определенные и отличающиеся правила формирования отдельных компонентов пути к каталогу или файлу. Обратите внимание, что каталог — это просто файл со специальным атрибутом, определяющим его как каталог, но в остальном он должен соответствовать тем же правилам именования, что и обычный файл. Поскольку термин каталог просто относится к особому типу файла в том, что касается файловой системы, в некоторых справочных материалах используется общий термин файл для охвата обеих концепций каталогов. и файлы данных как таковые. По этой причине, если не указано иное, любые правила или примеры именования или использования файла также должны применяться к каталогу. Термин путь относится к одному или нескольким каталогам, обратной косой черте и, возможно, имени тома. Дополнительные сведения см. в разделе «Пути».

Ограничения по количеству символов также могут различаться в зависимости от файловой системы и используемого формата префикса имени пути. Это еще более усложняется поддержкой механизмов обратной совместимости. Например, более старая файловая система MS-DOS FAT поддерживает не более 8 символов для основного имени файла и 3 символа для расширения, всего 12 символов, включая разделитель точек. Это обычно известно как имя файла 8.3. Файловые системы Windows FAT и NTFS не ограничены именами файлов версии 8.3, поскольку они имеют поддержку длинных имен файлов, но они по-прежнему поддерживают версию 8.3 длинных имен файлов.

Соглашения об именах

Следующие основные правила позволяют приложениям создавать и обрабатывать допустимые имена для файлов и каталогов независимо от файловой системы:

Используйте точку, чтобы отделить базовое имя файла от расширения в имени каталога или файла.

Используйте обратную косую черту (\) для разделения компонентов пути. Обратная косая черта отделяет имя файла от пути к нему и одно имя каталога от другого имени каталога в пути. Вы не можете использовать обратную косую черту в имени фактического файла или каталога, потому что это зарезервированный символ, который разделяет имена на компоненты.

При необходимости используйте обратную косую черту в имени тома, например, "C:\" в "C:\path\file" или "\\server\share" в "\\server\share\path". \file" для имен универсального соглашения об именах (UNC). Дополнительные сведения об именах UNC см. в разделе «Ограничение максимальной длины пути».

Не предполагайте чувствительность к регистру. Например, считайте имена OSCAR, Oscar и oscar одинаковыми, хотя некоторые файловые системы (например, POSIX-совместимая файловая система) могут считать их разными. Обратите внимание, что NTFS поддерживает семантику POSIX для учета регистра, но это не поведение по умолчанию. Дополнительные сведения см. в разделе CreateFile.

Обозначения томов (буквы дисков) также нечувствительны к регистру. Например, "D:\" и "d:\" относятся к одному и тому же тому.

Используйте любой символ текущей кодовой страницы для имени, включая символы Unicode и символы расширенного набора символов (128–255), за исключением следующих:

Следующие зарезервированные символы:

  • < (меньше чем)
  • > (больше)
  • : (двоеточие)
  • " (двойные кавычки)
  • / (косая черта)
  • \ (обратная косая черта)
  • | (вертикальная полоса или труба)
  • <ли>? (вопросительный знак)
  • * (звездочка)

Целое значение, равное нулю, иногда называемое символом NUL ASCII.

Символы, целочисленные представления которых находятся в диапазоне от 1 до 31, за исключением альтернативных потоков данных, где эти символы разрешены. Дополнительные сведения о файловых потоках см. в разделе Файловые потоки.

Любой другой символ, который не разрешен целевой файловой системой.

Используйте точку в качестве компонента каталога в пути для представления текущего каталога, например ".\temp.txt". Дополнительные сведения см. в разделе Пути.

Используйте две последовательные точки (..) в качестве компонента каталога в пути для представления родительского каталога текущего каталога, например "..\temp.txt". Дополнительные сведения см. в разделе Пути.

Не используйте следующие зарезервированные имена для имени файла:

CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, ​​COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 и LPT9. Также избегайте этих имен, за которыми сразу следует расширение; например, NUL.txt не рекомендуется. Дополнительные сведения см. в разделе Пространства имен.

Не заканчивайте имя файла или каталога пробелом или точкой. Хотя базовая файловая система может поддерживать такие имена, оболочка Windows и пользовательский интерфейс этого не делают. Однако допустимо указывать точку в качестве первого символа имени. Например, ".temp".

Короткие и длинные имена

Длинным именем файла считается любое имя файла, которое выходит за рамки короткого стиля именования MS-DOS (также называемого 8.3). Когда вы создаете длинное имя файла, Windows также может создать короткую форму имени 8.3, называемую псевдонимом 8.3 или коротким именем, и также сохранить ее на диске. Этот псевдоним 8.3 можно отключить по соображениям производительности либо для всей системы, либо для указанного тома, в зависимости от конкретной файловой системы.

Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: псевдонимы 8.3 нельзя отключить для указанных томов до Windows 7 и Windows Server 2008 R2.

Во многих файловых системах имя файла будет содержать тильду (~) в каждом компоненте имени, которое слишком длинно для соответствия правилам именования 8.3.

Не все файловые системы следуют соглашению о замене тильды, и системы можно настроить таким образом, чтобы отключить создание псевдонима 8.3, даже если они обычно его поддерживают. Поэтому не думайте, что псевдоним 8.3 уже существует на диске.

Чтобы запросить имена файлов 8.3, длинные имена файлов или полный путь к файлу из системы, рассмотрите следующие варианты:

  • Чтобы получить форму длинного имени файла в формате 8.3, используйте функцию GetShortPathName.
  • Чтобы получить версию короткого имени с длинным именем файла, используйте функцию GetLongPathName.
  • Чтобы получить полный путь к файлу, используйте функцию GetFullPathName.

В более новых файловых системах, таких как NTFS, exFAT, UDFS и FAT32, Windows сохраняет длинные имена файлов на диске в кодировке Юникод, что означает, что всегда сохраняется исходное длинное имя файла. Это верно, даже если длинное имя файла содержит расширенные символы, независимо от кодовой страницы, которая активна во время операции чтения или записи с диска.

Файлы с длинными именами файлов можно копировать между разделами файловой системы NTFS и разделами файловой системы Windows FAT без потери информации об именах файлов. Это может быть не так для более старых файловых систем MS-DOS FAT и некоторых типов файловых систем CDFS (CD-ROM), в зависимости от фактического имени файла. В этом случае по возможности заменяется короткое имя файла.

Пути

Путь к указанному файлу состоит из одного или нескольких компонентов, разделенных специальным символом (обратной косой чертой), причем каждый компонент обычно представляет собой имя каталога или файла. имя, но с некоторыми заметными исключениями, обсуждаемыми ниже. Часто для интерпретации пути системой очень важно, как выглядит начало или префикс пути. Этот префикс определяет пространство имен, которое использует путь, и, кроме того, какие специальные символы используются в какой позиции пути, включая последний символ.

Если компонент пути является именем файла, он должен быть последним компонентом.

Каждый компонент пути также будет ограничен максимальной длиной, указанной для конкретной файловой системы. В целом, эти правила делятся на две категории: короткие и длинные. Обратите внимание, что имена каталогов хранятся в файловой системе как файлы особого типа, но правила именования файлов также применяются к именам каталогов. Подводя итог, можно сказать, что путь — это просто строковое представление иерархии между всеми каталогами, существующими для определенного файла или имени каталога.

Полный и относительный пути

Для функций Windows API, управляющих файлами, имена файлов часто могут указываться относительно текущего каталога, а для некоторых API требуется полный путь. Имя файла относится к текущему каталогу, если оно не начинается с одного из следующих символов:

  • Имя UNC любого формата, которое всегда начинается с двух символов обратной косой черты ("\\"). Дополнительные сведения см. в следующем разделе.
  • Обозначение диска с обратной косой чертой, например "C:\" или "d:\".
  • Одна обратная косая черта, например, "\directory" или "\file.txt". Его также называют абсолютным путем.

Если имя файла начинается только с обозначения диска, но не с обратной косой черты после двоеточия, оно интерпретируется как относительный путь к текущему каталогу на диске с указанной буквой. Обратите внимание, что текущий каталог может быть или не быть корневым каталогом в зависимости от того, что он был установлен во время самой последней операции «изменить каталог» на этом диске. Ниже приведены примеры этого формата:

  • «C:tmp.txt» относится к файлу с именем «tmp.txt» в текущем каталоге на диске C.
  • "C:tempdir\tmp.txt" относится к файлу в подкаталоге текущего каталога на диске C.

Путь также считается относительным, если он содержит "двойные точки"; то есть два периода вместе в одном компоненте пути. Этот специальный спецификатор используется для обозначения каталога над текущим каталогом, также известного как «родительский каталог». Ниже приведены примеры этого формата:

  • "..\tmp.txt" указывает файл с именем tmp.txt, расположенный в родительском каталоге текущего каталога.
  • "..\..\tmp.txt" указывает файл, который находится на два каталога выше текущего каталога.
  • "..\tempdir\tmp.txt" указывает файл с именем tmp.txt, расположенный в каталоге с именем tempdir, который является равноправным каталогом для текущего каталога.

Относительные пути могут сочетать оба типа примеров, например "C.\tmp.txt". Это полезно, потому что, хотя система отслеживает текущий диск вместе с текущим каталогом этого диска, она также отслеживает текущие каталоги в каждой из разных букв диска (если в вашей системе их несколько), независимо от какое обозначение диска установлено в качестве текущего диска.

Ограничение максимальной длины пути

В выпусках Windows до Windows 10 версии 1607 максимальная длина пути — MAX_PATH, которая определяется как 260 символов. В более поздних версиях Windows для снятия ограничения требуется изменение раздела реестра или использование инструмента групповой политики. Полную информацию см. в разделе Ограничение максимальной длины пути.

Пространства имен

Существует две основные категории соглашений о пространствах имен, используемых в Windows API, обычно называемых пространствами имен NT и пространствами имен Win32. Пространство имен NT было разработано как пространство имен самого низкого уровня, в котором могут существовать другие подсистемы и пространства имен, включая подсистему Win32 и, соответственно, пространства имен Win32. POSIX — еще один пример подсистемы Windows, созданной на основе пространства имен NT. Ранние версии Windows также определяли несколько предопределенных или зарезервированных имен для определенных специальных устройств, таких как коммуникационные (последовательные и параллельные) порты и консоль дисплея по умолчанию, как часть того, что сейчас называется пространством имен устройств NT, и все еще поддерживаются в текущих версиях. Windows для обратной совместимости.

Пространства имен файлов Win32

В этом и следующем разделах кратко изложены префиксы и соглашения пространства имен Win32 с описанием их использования. Обратите внимание, что эти примеры предназначены для использования с функциями Windows API, и не все они обязательно работают с приложениями оболочки Windows, такими как проводник Windows. По этой причине существует более широкий диапазон возможных путей, чем обычно доступно из приложений оболочки Windows, и приложения Windows, которые используют это преимущество, могут быть разработаны с использованием этих соглашений о пространстве имен.

При файловом вводе-выводе префикс "\\?\" к строке пути указывает API Windows отключить всю строку синтаксического анализа и отправить строку, следующую за ней, прямо в файловую систему. Например, если файловая система поддерживает большие пути и имена файлов, вы можете превысить ограничения MAX_PATH, которые в противном случае применяются API-интерфейсами Windows. Дополнительные сведения об обычном ограничении максимального пути см. в предыдущем разделе Ограничение максимальной длины пути.

Поскольку он отключает автоматическое расширение строки пути, префикс "\\?\" также позволяет использовать ".." и "." в именах путей, что может быть полезно, если вы пытаетесь выполнить операции с файлом с этими в противном случае зарезервированными спецификаторами относительного пути как части полного пути.

Многие, но не все API файлового ввода-вывода поддерживают "\\?\"; вы должны посмотреть справочную тему для каждого API, чтобы быть уверенным.

Обратите внимание, что следует использовать API Unicode, чтобы убедиться, что префикс "\\?\" позволяет превысить MAX_PATH

Пространства имен устройств Win32

Префикс "\\.\" будет обращаться к пространству имен устройств Win32, а не к пространству имен файлов Win32. Так осуществляется доступ к физическим дискам и томам напрямую, минуя файловую систему, если API поддерживает такой тип доступа. Таким образом вы можете получить доступ ко многим устройствам, кроме дисков (например, с помощью функций CreateFile и DefineDosDevice).

Например, если вы хотите открыть последовательный порт 1 системы, вы можете использовать "COM1" в вызове функции CreateFile.Это работает, потому что COM1–COM9 являются частью зарезервированных имен в пространстве имен NT, хотя использование префикса «\\.\» также будет работать с этими именами устройств. Для сравнения, если у вас установлена ​​плата последовательного расширения на 100 портов и вы хотите открыть COM56, вы не сможете открыть ее с помощью «COM56», поскольку для COM56 нет предопределенного пространства имен NT. Вам нужно будет открыть его с помощью "\\.\COM56", потому что "\\.\" переходит непосредственно к пространству имен устройства, не пытаясь найти предопределенный псевдоним.

Другим примером использования пространства имен устройств Win32 является использование функции CreateFile с "\\.\PhysicalDiskX" (где X – допустимое целочисленное значение) или " \\.\CdRomX". Это позволяет вам обращаться к этим устройствам напрямую, минуя файловую систему. Это работает, потому что эти имена устройств создаются системой по мере перечисления этих устройств, а некоторые драйверы также создают другие псевдонимы в системе. Например, драйвер устройства, реализующий имя "C:\", имеет собственное пространство имен, которое также является файловой системой.

API, использующие функцию CreateFile, обычно работают с префиксом "\\.\", поскольку функция CreateFile используется для открытия как файлов, так и устройств, в зависимости от используемых вами параметров.

Если вы работаете с функциями Windows API, вы должны использовать префикс "\\.\" для доступа только к устройствам, а не к файлам.

Большинство API не поддерживают "\\.\"; только те, которые предназначены для работы с пространством имен устройства, распознают его. Всегда проверяйте справочную тему для каждого API, чтобы быть уверенным.

Пространства имен NT

Есть также API, которые позволяют использовать соглашение о пространстве имен NT, но диспетчер объектов Windows в большинстве случаев делает это ненужным. Для иллюстрации полезно просматривать пространства имен Windows в обозревателе системных объектов с помощью инструмента Windows Sysinternals WinObj. Когда вы запускаете этот инструмент, вы видите пространство имен NT, начинающееся с корня, или "\". Подпапка под названием "Global??" где находится пространство имен Win32. Объекты именованных устройств находятся в пространстве имен NT в подкаталоге «Device». Здесь вы также можете найти Serial0 и Serial1, объекты устройства, представляющие первые два COM-порта, если они есть в вашей системе. Объект устройства, представляющий том, может иметь вид HarddiskVolume1, хотя числовой индекс может отличаться. Имя «DR0» в подкаталоге «Harddisk0» является примером объекта устройства, представляющего диск, и т. д.

Чтобы сделать эти объекты устройств доступными для приложений Windows, драйверы устройств создают символическую ссылку (символическую ссылку) в пространстве имен Win32 "Global??" на соответствующие объекты устройств. Например, COM0 и COM1 в разделе "Глобальные??" subdirectory — это просто символические ссылки на Serial0 и Serial1, «C:» — это символическая ссылка на HarddiskVolume1, «Physicaldrive0» — это символическая ссылка на DR0 и так далее. Без символической ссылки указанное устройство «Xxx» не будет доступно ни одному приложению Windows, использующему соглашения о пространстве имен Win32, как описано ранее. Однако дескриптор этого устройства может быть открыт с помощью любых API, поддерживающих абсолютный путь пространства имен NT в формате "\Device\Xxx".

С добавлением многопользовательской поддержки через службы терминалов и виртуальные машины возникла необходимость в виртуализации общесистемного корневого устройства в пространстве имен Win32. Это было достигнуто путем добавления символической ссылки с именем «GLOBALROOT» в пространство имен Win32, которое вы можете увидеть в «Global??» подкаталог инструмента браузера WinObj, который обсуждался ранее, и может получить доступ через путь «\\?\GLOBALROOT». Этот префикс гарантирует, что путь, следующий за ним, соответствует истинному корневому пути диспетчера системных объектов, а не пути, зависящему от сеанса.

Попытка создать имя файла с двоеточием на диске, смонтированном с помощью drvfs, не работает, тогда как я могу создать файл на lxfs:

Подключенный накопитель является внешним USB-накопителем, отформатированным в файловой системе NTFS

Я что-то упустил?

Текст был успешно обновлен, но возникли следующие ошибки:

прокомментировал doehrm 17 декабря 2016 г.

Вариант использования: "chromium-os" ;-)

Я создал специальную версию для своего старого ноутбука. Официальным хостом сборки является Ubuntu 16.04.1. Вся сборка выполняется в среде chroot, поэтому в ОС необходимо установить лишь несколько инструментов (python, git, curl и некоторые другие), остальные загружаются и компилируются в chroot.

При загрузке описаний репозитория я обнаружил несколько файлов, которые невозможно синхронизировать из-за двоеточия:

Оригинальные источники действительно содержат это двоеточие:

Моя цель состояла в том, чтобы иметь «несколько нативную» возможность компилировать новую версию на моем ноутбуке, а не иметь Hyper-V, виртуальные сетевые карты и коммутаторы, которые возятся с моей нетривиальной настройкой сети/VPN (если вы когда-либо устанавливали полдюжины VPN (SSTP, OpenVPN и PPTP вперемешку с ipv4/ipv6) и ставишь Hyper-V и удивляешься, почему больше ничего не работает, сам поймешь ;-) )

Но я понимаю, что разрешить его будет проблематично, несмотря на то, что я не хочу использовать его как имя каталога, а "просто имя файла".

прокомментировал aasering 17 декабря 2016 г.

Tangent -- : был разделителем пути Mac до OS X. Графические приложения Mac по-прежнему позволяют именам файлов содержать / , а не : . По сути, : странно везде.

В любом случае, это интересный вопрос, следует ли разрешить DrvFs (в целях совместимости) создавать имена файлов, которые не разрешены для обычных приложений Windows, и если да, то какой должна быть семантика таких файлов.

прокомментировал aseering 17 декабря 2016 г. •

@doehrm -- нельзя ли встроить $HOME в WSL? Как вы упомянули, он поддерживает: . Кроме того, у него должна быть более высокая производительность.

прокомментировал doehrm 17 декабря 2016 г.

Я до сих пор работаю в ОС с такими именами файлов, как NODE::DKA0:[FOO.BAR.BAR2]foobar.dat;5, где двоеточие является разделителем, нет возможности создать имя файла с двоеточием, и я думаю, это также и то, где глубоко в ядре Windows (NT 4.0) это тоже [было|запрещено].

И да, я попробую это в следующий раз, как только смогу избавиться от некоторых старых инсайдерских сборок, все еще хранящихся на диске, и освободить место.

прокомментировал doehrm 17 декабря 2016 г.

Интересно, что я мог клонировать репозиторий с помощью GIT в Windows:

и кажется, что какая-то семантика уже существует:

Простой каталог показывает первую строку (размер 0, короткое имя файла до двоеточия), каталог /r показывает полное имя с "$DATA" в конце.

Прокомментировано fpqc 17 декабря 2016 г. •

@therealkenc Настоящая причина не имеет ничего общего с DOS iirc. Символ ":" зарезервирован для альтернативных потоков данных в NTFS и на самом деле, возможно, связан с древней подсистемой OS/2.

прокомментировал doehrm 17 декабря 2016 г.

прокомментировал doehrm 17 декабря 2016 г.

Теперь я смог загрузить весь код в $HOME. Когда я пытаюсь войти в chroot, система либо зависает (и мне приходится жестко перезагружаться), либо BSOD :-( с APC_INDEX_MISMATCH.

Я включил полный дамп и воспроизведу проблему снова (если это поможет).

Прокомментировано fpqc 17 декабря 2016 г. •

Кроме того, да, это верно, альтернативные потоки данных — это идея, вдохновленная VMS. Расширенные атрибуты — наследие OS/2.

прокомментировал doehrm 17 декабря 2016 г.

Выполнено, спасибо @fpqc за то, что указал мне направление, и извините за то, что испортил эту проблему с несвязанными BSOD.

Поскольку похоже, что NTFS умеет обрабатывать эти файлы, значит ли это, что и DrvFS должна делать то же самое?

Прокомментировано fpqc 17 декабря 2016 г. •

@doehrm Путь "a:b" относится к альтернативному потоку данных файла "a" в NTFS. Это недопустимый путь в Win32. В Powershell есть командлет (streams), который позволяет вам увидеть, какие ADS прикреплены к файлу. Тип потока по умолчанию называется просто " $DATA ". Знакомо?

iirc, GeoHot несколько лет назад продемонстрировал атаку на Windows с помощью ADS.

прокомментировал doehrm 17 декабря 2016 г.

или он внутренне "сопоставляется" с символом Unicode (U+F000 - U+F0FF).

Прокомментировано fpqc 17 декабря 2016 г. •

Результат вашего каталога /r указывает на то, что были сохранены альтернативные потоки данных.

В нем говорится: «Я создал пустой файл Open+Sans , а затем создал альтернативный поток $DATA для этого файла с именем 300.woff, который содержит фактическое желаемое содержимое файла». Git для Windows не должен этого делать. Это полностью нарушенное поведение.

Я только что проверил это на себе. Вот что он делает. Вероятно, поэтому он сходит с ума от BSOD. Никто (по крайней мере, не относящийся к Microsoft), насколько мне известно, не тестировал функциональность DrvFS с добавлением в смесь потоков с альтернативными именами $DATA.

Это работает в LXFS, поскольку драйверы WSL перехватывают все файловые операции ввода-вывода в среде и при необходимости экранируют символы, когда они оказываются на диске.

прокомментировал benhillis 20 декабря 2016 г. •

@doehrm - Я получил ваш дамп и посмотрел. Причиной синего экрана была проблема блокировки в терминале ioctl. Исправление только что попало в ветку rs_prerelease, поэтому оно должно быть включено в следующую сборку программы предварительной оценки Windows.

Спасибо, что сообщили о проблеме и отправили нам дамп памяти!

bitcrazed прокомментировал 7 апреля 2017 г.

Спасибо за сообщение. Закрытие, поскольку эта проблема должна была быть исправлена ​​в инсайдерской сборке в начале 2017 года, и в последнее время по этой проблеме не было никаких действий.

Комментарий SRGOM от 5 мая 2017 г.

@bitcrazed это "исправление" и в обновлении создателей тоже? Если да, то разрешено ли иметь имя файла с двоеточием в разделе NTFS и быть доступным из WSL?

комментарий therealkenc от 5 мая 2017 г.

Нет, просто неправильно закрыли.

Комментарий SRGOM от 6 мая 2017 г.

Спасибо, @therealkenc Может быть, разработчик не будет возражать, если я открою новый, чтобы внести ясность..

комментарий therealkenc 6 мая 2017 г. •

Комментарий SRGOM от 7 мая 2017 г. •

комментарий therealkenc 7 мая 2017 г. •

Рич, вероятно, просто спутал BSOD, связанный с терминалом ioctl, который был раздавлен выше, с заголовком проблемы. Переключатель реестра для включения и выключения поддержки двоеточия имени файла в DrvFS не имел бы смысла, а даже если бы и имел, это не был бы секретный переключатель. А также. если бы это был секретный переключатель. хорошо. знающие поклялись хранить тайну. не так ли.

therealkenc прокомментировал 14 февраля 2018 г.

Повторное открытие до тех пор, пока зарезервированные символы win32 ( : ? и т. д.) не будут исправлены, чтобы это могло получить тег fixedinsiders. Которые, как я понимаю, могут появиться в ближайшее время.

Benhillis прокомментировал 14 февраля 2018 г.

@therealkenc - Спасибо, не знал, что этот магазин закрыт.

Комментарий Брайана-Перкинса от 15 февраля 2018 г.

Проблема с зарезервированными символами должна быть решена в Insiders Build 17101.

Feaber прокомментировал 25 февраля 2018 г.

У меня Windows 10 Pro N (1803, сборка: 17101.1000)
Похоже, теперь можно создать файл с двоеточием в имени на / (rootfs) и на /mnt/

Тем не менее у меня есть некоторые проблемы с двоеточием в /mnt/
Я запускаю простой скрипт, который подключается к моему удаленному хосту с Debian и выполняет резервное копирование. Скрипт основан на rsync. На сервере у меня есть несколько сервисов, один из них — серверы Dovecot/Postfix.

Файлы, представляющие электронную почту, имеют сложные имена, например:
.1519283136.M726136P495.articode.pl,S=23068,W=23405:2,Sc.KXvFzt

Когда я запускаю свой скрипт из rootfs, все работает нормально. Но когда местом назначения для сохранения является какая-то папка внутри /mnt/, тогда rsync пытается выполнить какие-то странные действия по переименованию несуществующих файлов.

Пример:
rsync: rename "/mnt/e/articode.pl/current/mail/articode.pl/biuro/.Trash/cur/.1519283136.M726136P495.articode.pl,S=23068, W=23405:2,Sc.KXvFzt" -> "articode.pl/biuro/.Trash/cur/1519283136.M726136P495.articode.pl,S=23068,W=23405:2,Sc": Нет такого файла или каталога (2)

Исходные параметры rsync:
rsync -az -e ssh --delete --rsync-path="sudo rsync" "$@$:/var/mail/" "$/current/mail/"< /p>

Читайте также: