Я знаю, что это происходит в PHP, и я уверен, что это происходит на Java. Я не использовал последние версии .NET, поэтому я не буду говорить за них. Это кажется очень неудобным, но мне было интересно, есть ли причина для этого.Почему метод «файл существует» на многих языках возвращает true для каталога?
ответ
Одна из причин совместимости - любой, кто сделал «проверка на существование», знает, что исключает каталоги; изменение этого поведения может смутить тех, кто полагается на это поведение.
Во-вторых, базовый код часто выполняет проверку операционной системы на наличие в catlog записей в файловой системе - в ОС, каталог такой же, как файл. Другими словами, он ищет запись «xyz» в каталоге, а не файл с именем «xyz» в каталоге.
Обратная совместимость является основной причиной, я подозреваю.
Общепринято использовать функцию «файл существует», чтобы проверить путь до его записи. В этом случае тип файла не имеет значения, если есть каталог под названием «/ home/foo», вы не сможете создать файл с именем «/ home/foo»
Также PHP, один из языки вы упомянули, обеспечивают несколько функций, в зависимости от того, какого вида (ы) файла, который вы заботитесь о:
file_exists()
возвратит TRUE, файлы, каталоги и символические ссылкиis_file()
возвратит значение TRUE для файлов, но FALSE для справочники и сим-ссылкиis_dir()
вернет TRUE для дирекции s, но FALSE для файлов и симво ссылкиis_link()
возвратит TRUE, для символических ссылок, но FALSE для файлов и каталогов
Существует также формальная причина, почему каталог является файлом:
Файлы (или ссылки на файлы) могут быть , расположенные в каталогах. Однако, более , как правило, каталог может содержать либо список файлов, либо список ссылок на файлы. В пределах этого определения значение имеет важное значение, поскольку термин «файл» включает в себя каталоги. Это позволяет создавать иерархии каталогов , т. Е. Каталоги, содержащие подкаталоги.
Материал из Википедии, ‘Computer file’
Часть философии Unix является то, что "everything is a file". Это также повлияло на другие среды.