2

Я пытаюсь найти авторитетный ответ по этому вопросу, но это сложно. Википедия как бы танцует вокруг этой проблемы, но не достаточно ясна.

Для .txt (в качестве примера) базовое имя пустое / пустое, а расширение txt? Или базовое имя .txt (включая точку) и расширение null / empty?

А что насчет чего-то странного, такого как .a.b?

Я понимаю, что могут быть некоторые различия в операционной системе, поэтому меня интересует, что они представляют собой + какое рекомендуемое "практическое правило" не зависит от ОС. Я планирую запрограммировать логику синтаксического анализа на сервере для веб-приложения, поэтому оно должно анализировать строки имен файлов, отправленные из разных операционных систем.

1 ответ1

3

Если вы хотите независимость от ОС, не существует такого понятия, как "расширение имени файла". Некоторые операционные системы могут фактически использовать их, чтобы определить программу, с которой нужно открыть файл, или даже пойти так далеко, что явно ограничивают их (например, FAT с максимум 3 символами).

Но информация также может быть собрана из магических чисел или другой эвристики. Расширения имен файлов - это просто метаданные - где эти данные хранятся, не имеет значения с точки зрения ОС. Например, в * nix файл сценария содержит заголовок в верхней части файла. Shebang сообщает вам, с каким интерпретатором должен запускаться файл, например, /bin/bash или /usr/bin/env ruby и т.д.

В мире * nix "базовое имя" - это просто имя файла, в котором удалены все ведущие компоненты (т. Е. Пути, включая последний /). Итак, базовое имя .txt будет .txt . И базовое имя /usr/bin/foo будет foo .

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

Поэтому, если вы хотите оставаться независимым от ОС, попробуйте взять базовое имя (в смысле слова * nix) и сохранить его. Все остальное всегда будет определено неоднозначно.

Кроме того, вы можете попробовать извлечь расширение, которое будет представлять собой все компоненты базового имени, начиная с последней найденной точки, например, foo.tar.gz , очевидно, будет файлом .gz а не .tar.gz . Только когда он разархивирован с помощью gzip, он становится foo.tar , который не подвергается воздействию tar. И так далее.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .