为什么许多语言中的“file exists”方法对目录返回 true?

Why does a "file exists" method in many languages return true for a directory?

提问人:Thomas Owens 提问时间:9/9/2008 更新时间:2/22/2012 访问量:310

问:

我知道它在 PHP 中是这样做的,而且我很确定它在 Java 中是这样做的。我没有使用过最新版本的 .NET,所以我不会为它们说话。这似乎很尴尬,但我想知道这是否有根本原因。

File-IO 方法 语言设计

评论


答:

3赞 ColinYounger 9/9/2008 #1

一个原因是兼容性 - 任何做过“检查存在”的人都知道要排除目录;改变这种行为可能会使那些依赖这种行为的人感到困惑。

其次,底层代码通常会在文件系统条目的 catlog 中检查操作系统是否存在 - 对于操作系统来说,目录与文件相同。换句话说,它在目录中查找“xyz”的条目,而不是在目录中查找名为“xyz”的文件。

我怀疑,向后兼容性是主要原因。

1赞 georgebrock 9/9/2008 #2

通常使用“文件存在”函数在写入路径之前检查路径。在此用例中,文件类型无关紧要,如果存在名为“/home/foo”的目录,您将无法创建名为“/home/foo”的文件

此外,PHP 是您提到的语言之一,它提供了多种功能,具体取决于您关心的文件类型:

  • file_exists() 将为文件、目录和符号链接返回 TRUE
  • is_file() 将为文件返回 TRUE,但对目录和符号链接返回 FALSE
  • is_dir() 将为目录返回 TRUE,但对文件和符号链接返回 FALSE
  • is_link() 将返回符号链接的 TRUE,但文件和目录返回 FALSE
2赞 knuton 9/9/2008 #3

目录是文件还有一个正式的原因:

文件(或文件链接)可以是 位于目录中。然而,更多 通常,一个目录可以包含 文件列表或 文件链接。在此范围内 定义,这是最重要的 术语“文件”的重要性 包括目录。这允许 目录层次结构的存在, 即,包含 子。

来自维基百科,“计算机文件”

0赞 Matthew Flaschen 2/22/2012 #4

Unix 哲学的一部分是“一切都是一个文件”。这也在一定程度上影响了其他环境。