- ベストアンサー
[C言語]トラバースするプログラム(linux)
- linux(ubuntu11.04)でコマンドラインからもらったディレクトリをトラバースするプログラムを作りたいんですがうまくいきません。
- 例えばディレクトリaにファイルbとディレクトリcがあり、ディレクトリcの中にはファイルdとディレクトリeがあり、ディレクトリeの中にはファイルfがあるとします。
- 僕の理想では$./traverse aとすると.. .b c .. .d e .. .fとなるはずなんですが(表示の順番は適当です)、実際はb .. .cとなってしまいうまくトラバースしてくれませんどうしてこうなるかわかりません誰か助けてくださいお願いします
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
失礼ですが、プログラムが間違ってますよ。 引数pathにディレクトリ名を渡してます。 このままだと"c"をlstatしてしまいます。 カレントにディレクトリ"c"は存在していませんので、ここでエラーです。 正しくはlstat("a/c", &st);ですよね。 そんな風になおして以下のようなテストコードを書いてみたところ 動きましたので貼っておきます。 #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/stat.h> #include<dirent.h> #include<string.h> static void do_traverse(char *patht, int t); int main(int argc, char *argv[]) { int i; if (argc < 2) { fprintf(stderr, "%s: no arguments\n", argv[0]); exit(1); } for (i = 1; i < argc; i++) { do_traverse(argv[i], 0); } return 0; } static void do_traverse(char *path, int t) { DIR *d; struct dirent *ent; int i; d = opendir(path); if (!d) { perror(path); exit(1); } while ((ent = readdir(d)) != NULL) { struct stat st; char newpath[BUFSIZ]; sprintf(newpath, "%s/%s", path, ent->d_name); if (lstat(newpath, &st) < 0) { perror(newpath); exit(1); } for (i = 0; i < t; i++) { printf(" "); } printf("%s\n", ent->d_name); if ((strcmp(".", ent->d_name)) == 0 || (strcmp("..", ent->d_name)) == 0 || S_ISLNK(st.st_mode)) { continue; } if (S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode)) { do_traverse(newpath, t + 1); } } closedir(d); }
補足
どう考えてもこのプログラムに間違いがあると思えません 確認してもどこに間違いがあるのか検討もつきません