さくらんぼのlambda日記

lambdaちっくなことからゲーム開発までいろいろ書きます。

UNIXでのファイル列挙

あるディレクトリ以下のファイルを再帰的にしらべたい場合がある。
その場合は、ftw関数を使えばよい。

詳しくはman ftw で。

XOPEN_SOURCE
というのは、UNIXの規格がどれかを定めるための定数

サンプルソースは以下

       #define _XOPEN_SOURCE 500
       #include <ftw.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>

       static int
       display_info(const char *fpath, const struct stat *sb,
                    int tflag, struct FTW *ftwbuf)
       {
           printf("%-3s %2d %7lld   %-40s %d %s\n",
               (tflag == FTW_D) ?   "d"   : (tflag == FTW_DNR) ? "dnr" :
               (tflag == FTW_DP) ?  "dp"  : (tflag == FTW_F) ?   "f" :
               (tflag == FTW_DP) ?  "dp"  : (tflag == FTW_SL) ?  "sl" :
               (tflag == FTW_SLN) ? "sln" : "???",
               ftwbuf->level, (long long) sb->st_size,
               fpath, ftwbuf->base, fpath + ftwbuf->base);
           return 0;           /* To tell nftw() to continue */
       }

       int
       main(int argc, char *argv[])
       {
           int flags = 0;

           if (argc > 2 && strchr(argv[2], ’d’) != NULL)
               flags |= FTW_DEPTH;
           if (argc > 2 && strchr(argv[2], ’p’) != NULL)
               flags |= FTW_PHYS;

           nftw((argc < 2) ? "." : argv[1], display_info, 20, flags);
           exit(EXIT_SUCCESS);
       }

実行結果

[sakura@localhost getdir]$ ./a.out 
d    0    4096   .                                        0 .
f    1    1171   ./getftw.c~                              2 getftw.c~
f    1     937   ./getdir.c                               2 getdir.c
f    1       0   ./getdir.c~                              2 getdir.c~
f    1     887   ./getftw.c                               2 getftw.c
f    1    5470   ./a.out                                  2 a.out