Метод, который гарантирует, как правило, допустимость имени файла Windows - что было бы законно создать файл с таким именем - было бы невозможно реализовать.
Это относительно просто гарантироватьчто имя файла Windows неверно .Некоторые из других регулярных выражений пытаются сделать это.Однако исходный вопрос требует более строгого утверждения: метод, который гарантирует имя файла допустимо в Windows.
Ссылка MSDN , цитируемая в других ответах, указывает, что Windowsимя файла не может содержать «любой другой символ, который целевая файловая система не позволяет».Например, файл, содержащий NUL, будет недействительным в некоторых файловых системах, как и расширенные символы Unicode в некоторых старых файловых системах.Таким образом, файл с именем ☃.txt будет действительным в некоторых случаях, но не в других.То, будет ли гипотетический isValidName(\"☃\")
возвращать true, зависит от базовой файловой системы.
Предположим, однако, что такая функция является консервативной и требует, чтобы имя файла состояло из печатных символов ASCII.Все современные версии Windows изначально поддерживают форматы файлов NTFS, FAT32 и FAT16, которые принимают имена файлов Unicode.Но драйверы для произвольных файловых систем могут быть установлены, и каждый может создать файловую систему, которая не допускает, например, буквы «n».Таким образом, даже простой файл, такой как «snowman.txt», не может быть «гарантированно» действительным.
Но даже за исключением крайних случаев, есть и другие сложности.Например, файл с именем «$ LogFile» не может существовать в корне тома NTFS, но может существовать в другом месте на томе.Таким образом, не зная каталога, мы не можем знать, является ли «$ LogFile» допустимым именем.Но даже «C: \ data \ $ LogFile» может быть недействительным, если, скажем, «c: \ data \» является символической ссылкой на другой корень тома NTFS.(Аналогично, «D: \ $ LogFile» может быть допустимым, если D: является псевдонимом подкаталога тома NTFS.)
Есть еще больше сложностей.Например, альтернативные потоки данных в файлах допустимы для томов NTFS, поэтому может быть допустимым «snowman.txt: ☃».Все три основные файловые системы Windows имеют восстановление длины пути, поэтому допустимость имени файла также является функцией пути.Но длина физического пути может быть даже недоступна для isValidName
, если путь представляет собой виртуальный псевдоним, подключенный сетевой диск или символическую ссылку, а не физический путь на томе.
Некоторые другие предложилиальтернатива: создайте файл с предложенным именем, а затем удалите его, возвращая значение true, если и только если создание успешно завершено.Этот подход имеет несколько практических и теоретических проблем.Одна из них, как указывалось ранее, заключается в том, что валидность является функцией как имени файла, так и пути, поэтому валидность c: \ test \ ☃.txt может отличаться от валидности c: \ test2 \ ☃.txt.Кроме того, функция не сможет записать файл по ряду причин, не связанных с достоверностью файла, таких как отсутствие разрешения на запись в каталог.Третий недостаток заключается в том, что действительность имени файла не обязательно должна быть недетерминированной: гипотетическая файловая система может, например, не разрешать замену удаленного файла или (теоретически) может даже случайным образом решать, является ли имя файла допустимым.
В качестве альтернативы довольно просто создать метод isInvalidFileName(String text)
, который возвращает true, если для файла гарантировано, что не будет действительным в Windows;имена файлов, такие как "aux", "*" и "abc.txt."вернул бы истину.Операция создания файла сначала проверяет, что имя файла гарантированно является недействительным, и, если оно возвращает false, останавливается.В противном случае метод может попытаться создать файл, в то время как он готовится к граничному случаю, когда файл не может быть создан из-за неправильного имени файла.