readdir() 関数を使う。ファイルとディレクトリの判別には stat() 関数の戻り値(stat 構造体)の st_mode を使う。これにはディレクトリかどうかを判別する S_ISDIR マクロが用意されている。今回はディレクトリでなければファイルだと思うことにした。
あと、「.」で始まるファイル(とディレクトリ)は無視した。
#include <stdio.h> #include <dirent.h> #include <sys stat.h=""> #include <string.h></string.h></sys></dirent.h></stdio.h> void listfiles(char *path); void joinpath(char *path, const char *path1, const char *path2); int main(int argc, char **argv) { char path[256]; if (argc == 1) { strcpy(path, "."); } else { strcpy(path, argv[1]); } listfiles(path); return 0; } void listfiles(char *path) { DIR *dir; struct dirent *dp; struct stat fi; char path2[256]; dir = opendir(path); for (dp = readdir(dir); dp != NULL; dp = readdir(dir)) { if (dp->d_name[0] != '.') { joinpath(path2, path, dp->d_name); stat(path2, &fi); if (!S_ISDIR(fi.st_mode)) { printf("%s\n", path2); } } } closedir(dir); return; } void joinpath(char *path, const char *path1, const char *path2) { strcpy(path, path1); strcat(path, "/"); strcat(path, path2); return; }
実行例:
takatoh@nightschool $ ./listfiles ./listfiles ./fib.c ./btreesort.c ./linkedlist.c ./web_color_code.c ./strrand.c ./code2rgb.c ./mergesort.c ./quicksort.c ./listfiles_r.c ./transhex.c ./heapsort.c ./filter.c ./greeting.c ./bubblesort.c ./listfiles.c
takatoh@nightschool $ ./listfiles btree btree/btree.c btree/btree.h btree/main.c