stat関数は、ファイルやディレクトリの状態を取得します。

この関数は、C言語のライブラリ関数(標準関数)ではありませんので、コンパイラにより、使えない場合があります。

#include <sys/stat.h>
int stat(const char *path, struct stat *buf);

*pathは状態を取得するファイルやディレクトリのパス名を指定します。
*bufは取得した状態を格納するstat構造体を指定します。

戻り値として、処理が成功した場合は0が、エラーの場合は-1を返します。

stat構造体は、次のメンバにより構成されています。

メンバ名 内容
st_dev ファイルがあるデバイスを示すID(デバイスID)です。
st_ino inode番号です。
st_mode ファイルの種類とアクセス保護モード(パーミッション)です。
st_nlink ハードリンクの数です。(ディレクトリの場合、最低でも2です。)
st_uid 所有者のユーザIDです。
st_gid 所有者のグループIDです。
st_rdev 特殊ファイル(デバイスファイル)の場合のデバイスIDです。通常ファイルやディレクトリの場合は0です。
st_size バイト単位の容量です。
st_blksize ファイルシステムが最も効率的に入出力が出来る「好ましい」ブロックサイズです。
st_blocks 割り当てられているブロック数です。
st_atime 最終アクセス時刻です。
st_mtime 最終修正時刻です。
st_ctime 最終状態変更時刻です。(inode情報の更新も含みます。)

また、上記st_modeメンバ用に、次のマクロとフラグが用意されています。

マクロ名 機能
S_ISREG(m) 通常のファイルかをチェックします。
S_ISDIR(m) ディレクトリかをチェックします。
S_ISCHR(m) キャラクター・デバイスかをチェックします。
S_ISBLK(m) ブロック・デバイスかをチェックします。
S_ISFIFO(m) FIFO(名前付きパイプ)かをチェックします。
フラグ名 内容
S_ISUID 0004000:セット・ユーザーID(set user ID)です。
S_ISGID 0002000:セット・グループID(set group ID)です。
S_IRWXU 00700:ファイル所有者(owner)のアクセス許可用のビットマスクです。
S_IRUSR 00400:所有者の読み込み許可です。
S_IWUSR 00200:所有者の書き込み許可です。
S_IXUSR 00100:所有者の実行許可です。
S_IRWXG 00070:グループ(group)のアクセス許可用のビットマスクです。
S_IRGRP 00040:グループの読み込み許可です。
S_IWGRP 00020:グループの書き込み許可です。
S_IXGRP 00010:グループの実行許可です。
S_IRWXO 00007:他人(others)のアクセス許可用のビットマスクです。
S_IROTH 00004:他人の読み込み許可です。
S_IWOTH 00002:他人の書き込み許可です。
S_IXOTH 00001:他人の実行許可です。

プログラム 例

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>

int main(int argc, char **argv)
{
  struct stat      stat_buf;

  if (argc != 2) {
    fprintf(stderr, 'main : 実行時引数の数が不当です\n');
    exit(EXIT_FAILURE);
  }

  if (stat(*(argv + 1), &stat_buf) == 0) {
    /* ファイル情報を表示 */
    printf('デバイスID : %d\n',stat_buf.st_dev);
    printf('inode番号 : %d\n',stat_buf.st_ino);
    printf('アクセス保護 : %o\n',stat_buf.st_mode);
    printf('ハードリンクの数 : %d\n',stat_buf.st_nlink);
    printf('所有者のユーザID : %d\n',stat_buf.st_uid);
    printf('所有者のグループID : %d\n',stat_buf.st_gid);
    printf('デバイスID(特殊ファイルの場合) : %d\n',stat_buf.st_rdev);
    printf('容量(バイト単位) : %d\n',stat_buf.st_size);
    printf('ファイルシステムのブロックサイズ : %d\n',stat_buf.st_blksize);
    printf('割り当てられたブロック数 : %d\n',stat_buf.st_blocks);
    printf('最終アクセス時刻 : %s',ctime(&stat_buf.st_atime));
    printf('最終修正時刻 : %s',ctime(&stat_buf.st_mtime));
    printf('最終状態変更時刻 : %s',ctime(&stat_buf.st_ctime));
 }
  else {
    perror('main ');
  }

  return EXIT_SUCCESS;
}

例の実行結果

$ ls -li stat.c
3211317 -rw-r--r-- 1 user users 1315 2008-08-11 15:53 stat.c
$ ./stat.exe stat.c
デバイスID : 2055
inode番号 : 3211317
アクセス保護 : 100644
ハードリンクの数 : 1
所有者のユーザID : 1001
所有者のグループID : 100
デバイスID(特殊ファイルの場合) : 0
容量(バイト単位) : 1315
ファイルシステムのブロックサイズ : 4096
割り当てられたブロック数 : 8
最終アクセス時刻 : Wed Feb 13 11:13:00 2008
最終修正時刻 : Mon Aug 11 15:53:30 2008
最終状態変更時刻 : Mon Aug 11 15:53:30 2008
$
$ ls -ldi DIR1
3473455 drwxr-xr-x 2 user users 4096 2008-07-31 18:28 DIR1
$ ./stat.exe DIR1
デバイスID : 2055
inode番号 : 3473455
アクセス保護 : 40755
ハードリンクの数 : 2
所有者のユーザID : 1001
所有者のグループID : 100
デバイスID(特殊ファイルの場合) : 0
容量(バイト単位) : 4096
ファイルシステムのブロックサイズ : 4096
割り当てられたブロック数 : 8
最終アクセス時刻 : Tue Jul 29 10:11:23 2008
最終修正時刻 : Thu Jul 31 18:28:21 2008
最終状態変更時刻 : Thu Jul 31 18:28:21 2008
$