C言語:ディレクトリ内のファイルをリストアップする(2)
昨日のプログラムに、サブディレクトリのファイルを再帰的にリストアップする -r オプションをつけてみた。
#include
#include
#include
#include
#include
#include
void listfiles(char *path, int recursive);
void joinpath(char *path, const char *path1, const char *path2);
int main(int argc, char **argv)
{
char path[256];
char result;
int recursive = 0;
while ((result = getopt(argc, argv, "r")) != -1) {
switch(result) {
case 'r':
recursive = 1;
break;
case '?':
exit(1);
}
}
if (argc == optind) {
strcpy(path, ".");
} else {
strcpy(path, argv[optind]);
}
listfiles(path, recursive);
return 0;
}
void listfiles(char *path, int recursive)
{
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)) {
if (recursive) {
listfiles(path2, recursive);
}
} else {
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 -r .
./stack/linkedlist.c
./stack/linkedlist.h
./stack/main.c
./listfiles
./fib.c
./btreesort.c
./linkedlist.c
./web_color_code.c
./strrand.c
./bmp/win-jpeg.bmp
./bmp/dog2.bmp
./bmp/bmp.c
./bmp/win-4.bmp
./bmp/win-16-1.bmp
./bmp/dog.bmp
./bmp/win-32-bf-888.bmp
./bmp/win-8.bmp
./bmp/win-32.bmp
./bmp/win-16-bf-324.bmp
./bmp/win-32-t.bmp
./bmp/win-16-t.bmp
./bmp/bmp.h
./bmp/os-4.bmp
./bmp/os-1.bmp
./bmp/win-32-bf-td.bmp
./bmp/win-1.bmp
./bmp/win-png.bmp
./bmp/win-8-td.bmp
./bmp/os-8.bmp
./bmp/os-24.bmp
./bmp/win-4-rle.bmp
./bmp/win-16.bmp
./bmp/win-32-bf-833.bmp
./bmp/Makefile
./bmp/win-24.bmp
./bmp/pic1.bmp
./bmp/win-8-rle.bmp
./bmp/bmpinfo.c
./code2rgb.c
./btree/btree.c
./btree/btree.h
./btree/main.c
./mergesort.c
./quicksort.c
./transhex.c
./heapsort.c
./filter.c
./greeting.c
./bubblesort.c
./listfiles.c
