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
「C言語:ディレクトリ内のファイルをリストアップする」への1件のフィードバック