Я не спрашиваю об общих синтаксических правилах для имен файлов. Я имею в виду ловушки, которые выскакивают из ниоткуда и кусают вас. Например, вы пытаетесь назвать файл «COM <n>» в Windows?





Что ж, для MSDOS / Windows, NUL, PRN, LPT <n> и CON. Они даже вызывают проблемы, если используются с расширением: "NUL.TXT"
Я думаю, это такие программы, как LINK.EXE (помните это?), Которые принимают одно базовое имя файла, а затем генерируют три разных файла с разным расширением. Затем вы можете просто ввести «nul» или «prn», и программа может просто вслепую добавить расширение, и все будет по-прежнему работать.
Сложная проблема с Unix, когда вы не знаете:
Файлы, которые начинаются с - или - являются законными, но с ними сложно работать, поскольку многие инструменты командной строки думают, что вы предоставляете им параметры.
Многие из этих инструментов имеют специальный маркер «-», указывающий на окончание выбора:
gzip -9vf -- -mydashedfilename
Если вы не касаетесь специальных каталогов, единственными недопустимыми именами в Linux являются «.» и «..». Возможно любое другое имя, хотя для доступа к некоторым из них из оболочки требуется использование escape-последовательностей.
Обновлено: Как сказал Винко Врсалович, файлы, начинающиеся с «-» и «--», являются болью от оболочки, поскольку эти последовательности символов интерпретируются приложением, а не оболочкой.
Если это правда, как создать имя файла с косой чертой?
Да, / недопустим в имени файла ни для одного типа файловой системы.
@ Базовый Не обязательно. В диспетчере объектов ядра NT, который по сути является виртуальной файловой системой, есть только один запрещенный символ: обратная косая черта. Поскольку он использует счетные строки (строки в стиле Pascal / Rust), даже NUL действителен в путях диспетчера объектов NT.
@ssokolow Верно, однако, нет инструментов пользовательского пространства, которые разрешают доступ для создания этих путей и, следовательно, нет способа фактически использовать их, которые не сломали бы все (включая проводник). Еще в школе мы использовали API для переименования папок в XP и добавления символа возврата каретки. Используется для того, чтобы ломать проводника довольно сильно.
@Basic Исходный вопрос не указывает, предназначен ли вопрос об использовании командной строки, использовании API и т. д. Он просто спрашивает о подводных камнях ... и наличии VFS API, который поддерживает NUL и / в компонентах пути и может быть доступным через портированные / переносимые библиотеки / утилиты, пытаясь вырваться из 260-символьного ограничения длины пути Win32 и получить больше свободы, подобной Linux, для меня, безусловно, звучит как потенциальная ошибка.
От: http://www.grouplogic.com/knowledge/index.cfm/fuseaction/view_Info/docID/111.
The following characters are invalid as file or folder names on Windows using NTFS:
/?<>\:*|"and any character you can type with the Ctrl key.In addition to the above illegal characters the caret
^is also not permitted under Windows Operating Systems using the FAT file system.Under Windows using the FAT file system file and folder names may be up to 255 characters long.
Under Windows using the NTFS file system file and folder names may be up to 256 characters long.
Under Window the length of a full path under both systems is 260 characters.
In addition to these characters, the following conventions are also illegal:
- Placing a space at the end of the name
- Placing a period at the end of the name
The following file names are also reserved under Windows:
aux,com1,com2,- ...
com9,lpt1,lpt2,- ...
lpt9,con,nul,prn
aux также не является допустимым именем файла в Windows согласно статье, упомянутой Адамом
Я считаю легитимность этой статьи сомнительной, поскольку в ней говорится, что в Mac OS X «Имена файлов и папок не могут начинаться с точки '.'», Что абсолютно неверно.
Это не просто имена файлов, которые вы зарезервировали под Windows, это любое из этих имен устройств, за которыми следует любое расширение, например COM5.foo и COM5.bar являются незаконными.
com0 и lpt0 также не разрешены, согласно моим окнам
Full description of legal and illegal filenames on Windows: http://msdn.microsoft.com/en-us/library/aa365247.aspx
Ответы только по ссылкам имеют низкую ценность в Stackoverflow, потому что они могут двигаться / умирать, что делает ваш ответ бесполезным для исследователей.
У boost :: filesystem Руководство по переносимости есть много полезной информации.
Ответы только по ссылкам имеют низкую ценность в Stackoverflow, потому что они могут двигаться / умирать, что делает ваш ответ бесполезным для исследователей.
Как говорили другие, имена устройств, такие как COM1, невозможны в качестве имен файлов в Windows, потому что они являются зарезервированными устройствами.
Однако существует метод выхода для создания файлов с этими зарезервированными именами и доступа к ним, например, эта команда перенаправит вывод команды ver в файл с именем COM1:
ver > "\?\C:\Users\username\COM1"
Теперь у вас будет файл с именем COM1, который 99% программ не смогут открыть и, вероятно, зависнет, если вы попытаетесь получить к нему доступ.
Вот статья Microsoft, который объясняет, как работает это «пространство имен файлов». По сути, он сообщает Windows не выполнять строковую обработку текста и передавать его прямо в файловую систему. Этот прием также можно использовать для работы с путями длиной более 260 символов.
Я снова попытался удалить созданный файл, но del зависает в командной строке ... Обновлено: я не могу убить событие cmd с помощью диспетчера задач или хакера процесса ... Что здесь происходит?
У меня отлично работает. Вы не можете использовать del COM1, потому что, конечно, он попытается получить доступ к последовательному порту вместо файла и вызовет блокировку процесса, ожидая ответа от самого последовательного порта (именно поэтому такие имена файлов зарезервированы и недоступны для используйте в первую очередь.) Если вы использовали метод escape в моем ответе для создания файла, вам придется использовать его и для его удаления: del "\?\C:\Users\username\COM1"
Конечно, я использовал тот же путь \\? \ Для удаления. Просто интересно, почему завис мой cmd. Я сдался и переустановил всю свою ОС. Это исправило это довольно быстро.
Может быть, вы не заключили его в кавычки или допустили опечатку? Переустановка - это немного перебор, перезагрузка устранила бы проблему!
Нарвался сегодня на эту ерунду. Понятия не имею, почему эти имена файлов являются незаконными, если вы добавляете к ним расширения> :(