Почему метод “файл существует” на многих языках возвращает true для каталога?

StackOverflow https://stackoverflow.com/questions/50148

Вопрос

Я знаю, что это происходит в PHP, и я почти уверен, что это происходит в Java.Я не использовал последние версии .NET, поэтому не буду говорить за них.Это кажется очень неловким, но мне было интересно, была ли для этого какая-то глубинная причина.

Это было полезно?

Решение

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

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

Я подозреваю, что основная причина - обратная совместимость.

Другие советы

Существует также формальная причина, по которой каталог является файлом:

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

Из Википедии, ‘Компьютерный файл’

Обычно используется функция “файл существует” для проверки пути перед записью в него.В этом случае тип файла не имеет значения, если существует каталог с именем “/home /foo”, вы не сможете создать файл с именем “/ home /foo”.

Кроме того, PHP, один из упомянутых вами языков, предоставляет несколько функций в зависимости от того, о каких типах файлов вы заботитесь:

  • file_exists() вернет значение TRUE для файлов, каталогов и символических ссылок
  • is_file() вернет TRUE для файлов, но FALSE для каталогов и символьных ссылок
  • is_dir() вернет TRUE для каталогов, но FALSE для файлов и символьных ссылок
  • is_link() вернет TRUE для символических ссылок, но FALSE для файлов и каталогов

Частью философии Unix является то , что "все представляет собой файл".В какой-то степени это повлияло и на другие условия.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top