# 6.4 `stat` -- `stat()` の返す内容を解釈する

`stat` モジュールでは、`os.stat()`、 `os.lstat()` および `os.fstat()` (存在すれば) の返す 内容を解釈するための定数や関数を定義しています。`stat()`、 `fstat()`、および `lstat()` の関数呼び出しについての 完全な記述はシステムのドキュメントを参照してください。

`stat` モジュールでは、特殊なファイル型を判別するための以下の 関数を定義しています:

`S_ISDIR`( | mode)

  ファイルのモードがディレクトリの場合にゼロでない値を返します。

`S_ISCHR`( | mode)

  ファイルのモードがキャラクタ型の特殊デバイスファイルの場合にゼロでない値を返します。

`S_ISBLK`( | mode)

  ファイルのモードがブロック型の特殊デバイスファイルの場合にゼロでない値を返します。

`S_ISREG`( | mode)

  ファイルのモードが通常ファイルの場合にゼロでない値を返します。

`S_ISFIFO`( | mode)

  ファイルのモードが FIFO (名前つきパイプ) の場合にゼロでない値を返します。

`S_ISLNK`( | mode)

  ファイルのモードがシンボリックリンクの場合にゼロでない値を返します。

`S_ISSOCK`( | mode)

  ファイルのモードがソケットの場合にゼロでない値を返します。

より一般的なファイルのモードを操作するための二つの関数が定義されています:

`S_IMODE`( | mode)

  `os.chmod()` で設定することのできる一部のファイルモード -- すなわち、ファイルの許可ビット (permission bits) に加え、 (サポートされているシステムでは) スティッキービット (sticky bit)、 実行グループ ID 設定 (set-group-id) および 実行ユーザ ID 設定 (set-user-id) ビット -- を返します。

`S_IFMT`( | mode)

  ファイルの形式を記述しているファイルモードの一部 (上記の `S_IS*()` 関数で使われます) を返します。

通常、ファイルの形式を調べる場合には `os.path.is*()` 関数 を使うことになります; ここで挙げた関数は同じファイルに対して 複数のテストを同時に行いたいが、`stat()` システムコール を何度も呼び出してオーバヘッドが生じるのを避けたい場合に便利です。 これらはまた、ブロック型およびキャラクタ型デバイスに対するテスト のように、`os.path` で扱うことのできないファイルの 情報を調べる際にも便利です。

以下の全ての変数は、`os.stat()`、 `os.fstat()`、または `os.lstat()` が返す 10 要素のタプルにおけるインデクスを単に シンボル定数化したものです。

`ST_MODE`
  I ノードの保護モード。

`ST_INO`
  I ノード番号。

`ST_DEV`
  I ノードが存在するデバイス。

`ST_NLINK`
  該当する I ノードへのリンク数。

`ST_UID`
  ファイルの所持者のユーザ ID。

`ST_GID`
  ファイルの所持者のグループ ID。

`ST_SIZE`
  通常ファイルではバイトサイズ; いくつかの特殊ファイルでは処理待ちの データ量。

`ST_ATIME`
  最後にアクセスした時刻。

`ST_MTIME`
  最後に変更された時刻。

`ST_CTIME`
  オペレーティングシステムから返される``ctime''。あるOS(Unixなど)では最 後にメタデータが更新された時間となり、別のOS(Windowsなど)では作成時間と なります(詳細については各プラットフォームのドキュメントを参照してください)。

``ファイルサイズ'' の解釈はファイルの型によって異なります。 通常のファイルの場合、サイズはファイルの大きさをバイトで表した ものです。ほとんどの Unix 系 (特に Linux) における FIFO やソケット の場合、``サイズ'' は `os.stat()`、 `os.fstat()`、 あるいは `os.lstat()` を呼び出した時点で読み出し待ちであった データのバイト数になります; この値は時に有用で、特に上記の特殊なファイル を非ブロックモードで開いた後にポーリングを行いたいといった場合に 便利です。他のキャラクタ型およびブロック型デバイスにおけるサイズ フィーるの意味はさらに異なっていて、背後のシステムコールの実装に よります。

例を以下に示します:

    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)