TOP - C言語 - sys/stat.h - stat()

ファイル(ディレクトリ)に関する情報を取得します。

戻り値1 = stat(引数1 , 引数2)

戻り値1 : int
          実行が成功した場合   : 0
          成功以外の場合       : -1
引数1   : char *
          情報を取得するファイル(ディレクトリ)のパス
引数2   : struct stat *
          ファイルの情報が返されるstat構造体へのポインタ

          stat構造体のメンバ(主なもの)
              mode_t  st_mode  : ファイルタイプとファイルモードを示す値
              uid_t   st_uid   : ファイルのユーザーID
              gid_t   st_gid   : ファイルのグループID
              off_t   st_size  : ファイルサイズ(バイト)
              struct timespec st_atimespec : ファイルの最終アクセス日時
              struct timespec st_mtimespec : ファイルの最終更新日時
              struct timespec st_ctimespec : ファイルステータス変更日時

              sys/stat.h(Mac OS X 10.6 - [GCC 4.2])の中でのファイルタイプ・ファイルモードの記述
              ※st_modeの戻り値
/* File type */
#define    S_IFMT        0170000        /* [XSI] type of file mask */
#define    S_IFIFO        0010000        /* [XSI] named pipe (fifo) */
#define    S_IFCHR        0020000        /* [XSI] character special */
#define    S_IFDIR        0040000        /* [XSI] directory */
#define    S_IFBLK        0060000        /* [XSI] block special */
#define    S_IFREG        0100000        /* [XSI] regular */
#define    S_IFLNK        0120000        /* [XSI] symbolic link */
#define    S_IFSOCK    0140000        /* [XSI] socket */
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
#define    S_IFWHT        0160000        /* whiteout */
#endif

/* File mode */
/* Read, write, execute/search by owner */
#define    S_IRWXU        0000700        /* [XSI] RWX mask for owner */
#define    S_IRUSR        0000400        /* [XSI] R for owner */
#define    S_IWUSR        0000200        /* [XSI] W for owner */
#define    S_IXUSR        0000100        /* [XSI] X for owner */
/* Read, write, execute/search by group */
#define    S_IRWXG        0000070        /* [XSI] RWX mask for group */
#define    S_IRGRP        0000040        /* [XSI] R for group */
#define    S_IWGRP        0000020        /* [XSI] W for group */
#define    S_IXGRP        0000010        /* [XSI] X for group */
/* Read, write, execute/search by others */
#define    S_IRWXO        0000007        /* [XSI] RWX mask for other */
#define    S_IROTH        0000004        /* [XSI] R for other */
#define    S_IWOTH        0000002        /* [XSI] W for other */
#define    S_IXOTH        0000001        /* [XSI] X for other */

#define    S_ISUID        0004000        /* [XSI] set user id on execution */
#define    S_ISGID        0002000        /* [XSI] set group id on execution */
#define    S_ISVTX        0001000        /* [XSI] directory restrcted delete */

#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
#define    S_ISTXT        S_ISVTX        /* sticky bit: not supported */
#define    S_IREAD        S_IRUSR        /* backward compatability */
#define    S_IWRITE    S_IWUSR        /* backward compatability */
#define    S_IEXEC        S_IXUSR        /* backward compatability */
#endif
#endif    /* !S_IFMT */

(例)
#include <stdio.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>

int main ()
{
    FILE *fp;
    struct dirent *dirst;
    struct stat buf;

    mkdir("test_dir_01", 0755);
    printf("stat()実行 : %d\n\n", stat("test_dir_01", &buf));
    printf("ディレクトリ[test_dir_01]に関する情報\n");
    printf("    st_mode : %#o\n", buf.st_mode);
    printf("    st_uid  : %ld\n", (long)buf.st_uid);
    printf("    st_gid  : %ld\n", (long)buf.st_gid);
    printf("    st_size : %ld\n", (long)buf.st_size);
    printf("    st_atimespec(秒) : %ld\n", (long)buf.st_atimespec.tv_sec);
    printf("    st_mtimespec(秒) : %ld\n", (long)buf.st_mtimespec.tv_sec);
    printf("    st_ctimespec(秒) : %ld\n\n", (long)buf.st_ctimespec.tv_sec);
    
    fp = fopen("test_dir_01/test_file_01.txt", "w");
    fclose(fp);

    DIR *dp = opendir("test_dir_01");
    while((dirst = readdir(dp)) != NULL)
    {
        if ((strcmp(dirst->d_name, ".") != 0) & (strcmp(dirst->d_name, "..") != 0))
        {
            char s_file[100] = "test_dir_01/";
            strcat(s_file, dirst->d_name);
            stat(s_file, &buf);
            printf("ファイル[%s]に関する情報\n", s_file);
            printf("    st_mode : %#o\n", buf.st_mode);
            printf("    st_uid  : %ld\n", (long)buf.st_uid);
            printf("    st_gid  : %ld\n", (long)buf.st_gid);
            printf("    st_size : %ld\n", (long)buf.st_size);
            printf("    st_atimespec(秒) : %ld\n", (long)buf.st_atimespec.tv_sec);
            printf("    st_mtimespec(秒) : %ld\n", (long)buf.st_mtimespec.tv_sec);
            printf("    st_ctimespec(秒) : %ld\n", (long)buf.st_ctimespec.tv_sec);
        }
    }
    closedir(dp);

    remove("test_dir_01/test_file_01.txt");
    remove("test_dir_01");

    return 0;
}

実行結果
stat()実行 : 0

ディレクトリ[test_dir_01]に関する情報
    st_mode : 040755
    st_uid  : 502
    st_gid  : 20
    st_size : 68
    st_atimespec(秒) : 1319810595
    st_mtimespec(秒) : 1319810595
    st_ctimespec(秒) : 1319810595

ファイル[test_dir_01/test_file_01.txt]に関する情報
    st_mode : 0100644
    st_uid  : 502
    st_gid  : 20
    st_size : 0
    st_atimespec(秒) : 1319810595
    st_mtimespec(秒) : 1319810595
    st_ctimespec(秒) : 1319810595


Copyright(C) 2006-2012 CLAYPOT. All Rights Reserved.