|
はじめて投稿します。
よろしくお願いします。
のっけから図々しいお願いですが、アドバイスをお願いします。
学校で、「再帰をつかって、ファイル名の一覧をサブフォルダまで表示するプログラムを作成せよ」と言う課題を出されたんですが、うまく行きません。
pathを読みこんで表示するまではうまく行ったんですが、サブフォルダの中身を表示できません。
フォルダを判定する部分が機能していないらしいのですが、あちこち調べてみてもどこが悪いのかが分かりません。
環境は、時代遅れのwin98(SE)です。コンパイラはBCC5.5を使ってます。
ソースは以下です。
どなたか助言をお願い致します。
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#define S_MAX 256 //pathの最大文字数
int f_show(char *p);
int main(void)
{
char path[S_MAX], sel; //pathの入力用
int i;
//pathの入力とヌル文字の追加
printf("調べたいフォルダのパスを入力して下さい\n");
fgets(path, S_MAX, stdin);
i = strlen(path) - 1;
if(path[i] == '\n') path[i] = '\0';
f_show(path);
return 0;
}
int f_show(char *p)
{
struct stat fi;
struct dirent *dp;
DIR *dir;
char pa[S_MAX]; //pathのコピー先
strcpy(pa, p); //pathをコピー
//フォルダを開く
if((dir = opendir(pa)) == NULL){
perror("opendir");
exit(1);
}
while((dp = readdir(dir)) != NULL){
printf("%s\n", dp -> d_name); //ファイル名を表示
// この先の判定では"."と".."も含まれてしまうので、この2つであれば先頭に戻す
if(!(strcmp(dp->d_name, "."))|| !(strcmp(dp->d_name, "..")) )
continue;
stat(dp->d_name, &fi);
/*フォルダであれば再帰になる・・・
筈なのだが、ここの条件判定部が機能していないっぽい */
if(S_ISDIR(fi.st_mode)){
//paの末端に\\を付加してからフォルダ名を追加して新規pathを合成
strcat(strcat(pa, "\\"), dp->d_name);
f_show(pa);
}
}
closedir(dir);
return 0;
}
|