# 11.4. `stat` —— 解释`stat()`的结果

源代码： Lib / stat.py

`stat`模块定义用于解释`os.stat()`，`os.fstat()`和`os.lstat()`（如果它们存在）。有关`stat()`，`fstat()`和`lstat()`调用的完整详细信息，请参阅系统文档。

在版本3.4中更改： stat模块由C实现支持。

`stat`模块定义了以下功能来测试特定文件类型：

`stat.``S_ISDIR`(mode)

  如果mode来自一个目录，返回非零。

`stat.``S_ISCHR`(mode)

  如果mode来自特殊的字符设备文件，返回非零。

`stat.``S_ISBLK`(mode)

  如果mode来自特殊的块设备文件，返回非零。

`stat.``S_ISREG`(mode)

  如果mode来自一个正常的文件，返回非零。

`stat.``S_ISFIFO`(mode)

  如果mode来自FIFO（命名管道），返回非零。

`stat.``S_ISLNK`(mode)

  如果mode来自一个符号链接，返回非零。

`stat.``S_ISSOCK`(mode)

  如果mode来自一个套接字，返回非零。

`stat.``S_ISDOOR`(mode)

  如果模式是从门返回非零。

  版本3.4中的新功能。

`stat.``S_ISPORT`(mode)

  如果模式来自事件端口，则返回非零。

  版本3.4中的新功能。

`stat.``S_ISWHT`(mode)

  如果模式来自白光，返回非零。

  版本3.4中的新功能。

还附加定义两个函数用于更一般的文件模式的操作：

`stat.``S_IMODE`(mode)

  返回可以由`os.chmod()`设置的文件模式部分，即文件的权限位，以及sticky位，set-group-id和set-user-id位（在支持它们的系统上）。

`stat.``S_IFMT`(mode)

  返回描述文件类型的文件模式部分（由上面的`S_IS*()`函数使用）。

通常，您可以使用`os.path.is*()`函数来测试文件的类型；当您对同一文件执行多个测试并希望避免每个测试的`stat()`系统调用的开销时，此处的函数非常有用。当检查有关不是由`os.path`处理的文件的信息时，这些也很有用，例如对块和字符设备的测试。

示例：

    import os, sys
    from stat import *

    def walktree(top, callback):
        '''recursively descend the directory tree rooted at top,
           calling the callback function for each regular file'''

        for f in os.listdir(top):
            pathname = os.path.join(top, f)
            mode = os.stat(pathname).st_mode
            if S_ISDIR(mode):
                # It's a directory, recurse into it
                walktree(pathname, callback)
            elif S_ISREG(mode):
                # It's a file, call the callback function
                callback(pathname)
            else:
                # Unknown file type, print a message
                print('Skipping %s' % pathname)

    def visitfile(file):
        print('visiting', file)

    if __name__ == '__main__':
        walktree(sys.argv[1], visitfile)

提供了一个附加的效用函数，用于以可读的字符串转换文件的模式：

`stat.``filemode`(mode)

  将文件的模式转换为格式为'-rwxrwxrwx'的字符串。

  版本3.3中的新功能。

  在版本3.4中更改：此功能支持`S_IFDOOR`，`S_IFPORT`和`S_IFWHT`。

下面的所有变量只是`os.stat()`，`os.fstat()`或`os.lstat()`

`stat.``ST_MODE`

  inode 保护模式。

`stat.``ST_INO`

  inode 节点号。

`stat.``ST_DEV`

  inode 驻留的设备。

`stat.``ST_NLINK`

  inode 的链接数。

`stat.``ST_UID`

  所有者的用户ID。

`stat.``ST_GID`

  所有者的组ID。

`stat.``ST_SIZE`

  一个普通文件的字节大小；等待某些特殊文件的数据量。

`stat.``ST_ATIME`

  上次访问的时间。

`stat.``ST_MTIME`

  最后一次修改的时间。

`stat.``ST_CTIME`

  由操作系统报告的"ctime"。在某些系统上（如Unix）是最新的元数据更改的时间，在其它系统上（如Windows）是创建时间（详细信息参见平台的文档）。

"文件大小"的解释与文件类型有关。对于普通的文件，这是文件以字节为单位的大小。For FIFOs and sockets under most flavors of Unix (including Linux in particular), the “size” is the number of bytes waiting to be read at the time of the call to `os.stat()`, `os.fstat()`, or `os.lstat()`; this can sometimes be useful, especially for polling one of these special files after a non-blocking open. 其他字符和块设备的大小字段的含义变化更大，具体取决于底层的系统调用的实现。

下面的变量定义了`ST_MODE`字段中使用的标志。

使用上述函数比使用下面第一组标志更便携：

`stat.``S_IFSOCK`

  套接字。

`stat.``S_IFLNK`

  符号链接。

`stat.``S_IFREG`

  常规文件。

`stat.``S_IFBLK`

  块设备。

`stat.``S_IFDIR`

  目录。

`stat.``S_IFCHR`

  字符设备。

`stat.``S_IFIFO`

  先进先出。

`stat.``S_IFDOOR`

  门。

  版本3.4中的新功能。

`stat.``S_IFPORT`

  事件端口。

  版本3.4中的新功能。

`stat.``S_IFWHT`

  Whiteout。

  版本3.4中的新功能。

注意

当平台不支持文件类型时，`S_IFDOOR`，`S_IFPORT`或`S_IFWHT`

以下标志也可以在`os.chmod()`的模式参数中使用：

`stat.``S_ISUID`

  设置 UID 位。

`stat.``S_ISGID`

  设置组 ID 位。这一点有几种特殊用途。对于目录，它指示BSD语义将用于该目录：在那里创建的文件从目录继承其组ID，而不是从创建进程的有效组ID，并且在那里创建的目录也将获得`S_ISGID`位设置。对于没有设置组执行位（`S_IXGRP`）的文件，set-group-ID位表示强制文件/记录锁定（另见`S_ENFMT`）。

`stat.``S_ISVTX`

  粘滞位。当这位被设置在一个目录上，这意味着在该目录中的文件可以被重命名或删除仅由该文件的所有者、 由目录的所有者或特权的进程。

`stat.``S_IRWXU`

  文件所有者权限掩码。

`stat.``S_IRUSR`

  所有者拥有读取权限。

`stat.``S_IWUSR`

  所有者具有写入权限。

`stat.``S_IXUSR`

  所有者具有执行权限。

`stat.``S_IRWXG`

  组权限掩码。

`stat.``S_IRGRP`

  组具有读取权限。

`stat.``S_IWGRP`

  组具有写入权限。

`stat.``S_IXGRP`

  组具有执行权限。

`stat.``S_IRWXO`

  其他人（不在组中的人）的权限掩码。

`stat.``S_IROTH`

  其他人具有读取权限。

`stat.``S_IWOTH`

  其他人具有写入权限。

`stat.``S_IXOTH`

  其他人具有执行权限。

`stat.``S_ENFMT`

  V 系统文件锁定的执法行动。此标志与`S_ISGID`共享：对未设置组执行位（`S_IXGRP`）的文件执行文件/记录锁定。

`stat.``S_IREAD`

  `S_IRUSR`的Unix V7同义词。

`stat.``S_IWRITE`

  `S_IWUSR`的Unix V7同义词。

`stat.``S_IEXEC`

  `S_IXUSR`的Unix V7同义词。

可以在`os.chflags()`的标志参数中使用以下标志：

`stat.``UF_NODUMP`

  不转储文件。

`stat.``UF_IMMUTABLE`

  该文件不能更改。

`stat.``UF_APPEND`

  该文件可能只被追加到。

`stat.``UF_OPAQUE`

  该目录是不透明的通过联盟的堆栈查看时。

`stat.``UF_NOUNLINK`

  该文件可能不能重命名或删除。

`stat.``UF_COMPRESSED`

  该文件存储压缩 （Mac OS X 10.6+）。

`stat.``UF_HIDDEN`

  该文件不应显示在GUI中（Mac OS X 10.5+）。

`stat.``SF_ARCHIVED`

  该文件可能被存档。

`stat.``SF_IMMUTABLE`

  该文件不能更改。

`stat.``SF_APPEND`

  该文件可能只被追加到。

`stat.``SF_NOUNLINK`

  该文件可能不能重命名或删除。

`stat.``SF_SNAPSHOT`

  该文件是一个快照文件。

详细信息请参阅*BSD或Mac OS系统的chflags(2)帮助页。

在Windows上，以下文件属性常量可用于测试由`os.stat()`返回的`st_file_attributes`成员中的位。有关这些常量含义的更多详细信息，请参阅Windows API文档。

`stat.``FILE_ATTRIBUTE_ARCHIVE`
`stat.``FILE_ATTRIBUTE_COMPRESSED`
`stat.``FILE_ATTRIBUTE_DEVICE`
`stat.``FILE_ATTRIBUTE_DIRECTORY`
`stat.``FILE_ATTRIBUTE_ENCRYPTED`
`stat.``FILE_ATTRIBUTE_HIDDEN`
`stat.``FILE_ATTRIBUTE_INTEGRITY_STREAM`
`stat.``FILE_ATTRIBUTE_NORMAL`
`stat.``FILE_ATTRIBUTE_NOT_CONTENT_INDEXED`
`stat.``FILE_ATTRIBUTE_NO_SCRUB_DATA`
`stat.``FILE_ATTRIBUTE_OFFLINE`
`stat.``FILE_ATTRIBUTE_READONLY`
`stat.``FILE_ATTRIBUTE_REPARSE_POINT`
`stat.``FILE_ATTRIBUTE_SPARSE_FILE`
`stat.``FILE_ATTRIBUTE_SYSTEM`
`stat.``FILE_ATTRIBUTE_TEMPORARY`
`stat.``FILE_ATTRIBUTE_VIRTUAL`

  版本3.5中的新功能。