トップC言語入門 > ディレクトリ内のファイルリストを得る
ディレクトリ内のファイルリストを得る

1.ディレクトリ内のファイルリストを得る

_findfirst/_findnext/_findclose関数を使う方法は別のページに示した。 これらの関数は WIN32 に含まれるものであり、UNIXマシンでは使用できない。

このページでは POSIX がサポートしている opendir/readdir/closedir関数を使う方法を示す。

下にプログラム例を示す。

[test.c]
#include <stdio.h>
#include <dirent.h>

int main (int argc, char *argv[]) {
    struct dirent *ent; 

    DIR *pDir = opendir(argv[1]);
    if (pDir == NULL) return 1;
    while ((ent = readdir(pDir)) != NULL) {
        if ((ent->d_type & _A_SUBDIR) == 0) printf("%s\n", ent->d_name);
    }
    closedir(pDir);
    return 0;
}

このプログラムを MinGW の GCC でコンパイル・実行した結果を下に示す。

c:\sys>gcc test.c

c:\sys>a ./
a.exe
array.exe
fp2015.exe
  [中略]
test01.py
test02.py

マイクロソフトの VC では、デフォルトでは POSIX をサポートしていない。 includeディレクトリに dirent.h はない。

VC にはラッパーが用意されているようだが、_findfirst/_findnext/_findclose関数を使う方が楽であろう。 上のプログラムの場合、次のように書き変えればよい。

[test2.c]
#include <stdio.h>
#include <io.h>

int main (int argc, char *argv[]) {
    struct _finddata_t fdata;

    intptr_t fh = _findfirst(argv[1], &fdata);
    if (fh == -1) return 1;
    do {
        if ((fdata.attrib & _A_SUBDIR) == 0) printf("%s\n", fdata.name);
    } while (_findnext(fh, &fdata) == 0);
    _findclose(fh);
    return 0;
}

このプログラムを VC でコンパイル・実行すると次のようになる。

c:\sys>cl /nologo test2.c
test2.c

c:\sys>test2 ./*.*
a.exe
array.exe
fp2015.exe
index.html
  [中略]
test2.exe
test2.obj

このプログラム test2.c をGCCでコンパイル・実行すると、上と同様の結果が得られた。

参考文献

[1]