C言語:ディレクトリ内のファイルをリストアップする
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
