Могут ли пробелы существовать в расширении файла? - PullRequest
10 голосов
/ 27 марта 2011

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

Однако мне трудно определить, имеет ли имя файла, переданное в код,расширение или нет.Я использую Path.HasExtension(filename) и Path.GetExtension(filename), но, похоже, он демонстрирует странное поведение:

File.EXT => .EXT - расширение.Это нормально.

This Is A File.EXT => .EXT это расширение.Это тоже хорошо.

This Is A File. Not An Extension => . Not An Extension - расширение.Тем не менее, я думаю об этом как о файле без расширения.Windows тоже так думает, когда я создаю файл с таким именем (создание файла с нераспознанным расширением заставляет Windows называть его EXTENSIONNAME File, тогда как файлы без расширения, такие как это, просто называются File).

This Is A File.Not An Extension => .Not An Extension - это расширение.Та же проблема, что и выше.

Также обратите внимание, что это же поведение проявляется в Path.GetFileNameWithoutExtension(filename) (например, оно сообщает, что имя файла без расширения в последних двух примерах будет просто This Is A File).

Итак, что я понял из этого, так это то, что .NET и Windows отличаются тем, что они считают расширением.


Вопрос: Мне интересно, нормально ли это длямне реализовать такой код:

if(!Path.HasExtension(filename) || Path.GetExtension(filename).Contains(" ")) {...}

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

Я искал и нашел этот слегка аналогичный вопрос , нов документах, на которые есть ссылки, указано, что расширение не рекомендуется заканчивать пробелом / периодом - они ничего не говорят о пробелах в расширении.

Ответы [ 3 ]

11 голосов
/ 27 марта 2011

Расширение имени файла в Windows - просто соглашение. Методы GetExtension и HasExtension только ищут точку в имени файла и действуют соответственно. Вы можете свободно ставить пробелы в любом месте внутри имени файла (включая расширение).

Когда вы говорите «Windows тоже так думает», это на самом деле просто какой-то код в Explorer, который пытается проанализировать расширения, и он просто использует немного иной алгоритм, чем .NET.

4 голосов
/ 27 марта 2011

Как файловая система обрабатывает имена и как оболочка Windows (т. Е. Проводник) обрабатывает имена файлов - это два совершенно разных зверя.

Файловая система не заботится о пробелах, точках или чем-то еще - для нее,имя файла - только одна непрозрачная строка (с некоторыми ограничениями на допустимые символы).Разделение имени / расширения - это просто условное соглашение.Оболочка, с другой стороны, может свободно составить собственное толкование того, что представляет собой расширение, поскольку ее целью является не хранение и извлечение файловой информации, а скорее предоставление пользователю лучшего опыта.Так что не ищите там ответов.

Я бы посоветовал перейти к тому, что возвращают методы System.IO (потому что следовать соглашению - это хорошо), но вы можете делать все что угодно в своем коде, если естьвеская причина для этого.

4 голосов
/ 27 марта 2011

Официального определения расширения не существует.Общепринятым соглашением является то, что все, что после финального . является расширением.

Однако, если бы вы взяли ОГРОМНЫЙ список всех распространенных расширений, я думаю, вы найдете только несколько примеров, где пробелырасширение используется.

Я бы сказал, запретить пробелы в расширениях.999/1000 раз пользователь не имел в виду это расширение.

Цитировать Википедию по именам файлов :

.(DOT): разрешено, но последнее вхождение будет интерпретироваться как разделитель расширений в VMS, MS-DOS и Windows.В других ОС, обычно рассматриваемых как часть имени файла, допускается более одной полной остановки.

...