Почему метод «файл существует» во многих языках возвращает true для каталога? - PullRequest
1 голос
/ 08 сентября 2008

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

Ответы [ 4 ]

3 голосов
/ 08 сентября 2008

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

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

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

2 голосов
/ 08 сентября 2008

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

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

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

1 голос
/ 08 сентября 2008

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

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

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

Частью философии Unix является то, что " все является файлом ". Это в некоторой степени повлияло и на другие среды.

...