文件系统是否有其他组件而不是文件和目录?

时间:2015-09-23 13:33:17

标签: python filesystems

我在视频教程中看到过这个python片段,它检查列出的项目是目录还是文件:

for item in os.listdir("."):
    if os.path.isfile(item):
        # do something
    elif os.path.isdir(item):
        # do somethin
    else:
        # What is this case ?!

是否有可能命中else语句?

3 个答案:

答案 0 :(得分:4)

正如@sisoft所说,简单的答案是肯定的:确实存在支持文件和目录以外的文件类型的文件系统。

如果您感兴趣,较长的答案是文件系统支持的类型与文件系统的差别很大。 UNIX将大量内容视为一个'文件' (意思是文件系统中的一个对象),因此有很多类型。 Windows有一组更受限制的对象(我相信文件,目录和链接(没有来源))

文件系统的POSIX规范(由许多文件系统实现)没有指定它必须支持的对象(source)。

通常,文件系统是一个相当开放的术语,可以引用任何对象存储。它存储的对象可以是任何东西。

如果您想了解有关文件系统的更多信息,可以在Operating Systems中找到一个很好的章节,它提供了一个易于理解的介绍。

答案 1 :(得分:2)

是。还有其他类型,如管道,套接字,设备节点。 例如,对于来自isfile()的大多数文件,isdir()/dev都会返回False。

您最初可以看到https://en.wikipedia.org/wiki/Unix_file_types

答案 2 :(得分:2)

  

是否有可能命中else语句?

您的代码片段使用文件和目录的狭义定义:os.stat(path) (follows symlinks) is successful and either S_ISREG or S_ISDIR are true correspondingly

对于不存在的路径或由于常规文件和目录的权限错误,可能会触发

else子句。

POSIX defines the following marcos

S_ISBLK(m)
Test for a block special file.
S_ISCHR(m)
Test for a character special file.
S_ISDIR(m)
Test for a directory.
S_ISFIFO(m)
Test for a pipe or FIFO special file.
S_ISREG(m)
Test for a regular file.
S_ISLNK(m)
Test for a symbolic link.
S_ISSOCK(m)
Test for a socket.

即,除了常规文件和目录外,还可能有套接字,符号链接,管道,块/字符设备:

>>> import os
>>> import stat
>>> stat.S_ISBLK(os.stat('/dev/sda').st_mode)
True

可能存在仅对特定文件系统有意义的其他对象。