我试图以递归方式打印给定目录的每个文件的内容。我的代码中存在一些逻辑错误,我无法弄清楚它出错的地方。
浏览目录/子目录并获取文件名:
char filename[500], filepath[500];
void listdir(char *dir)
{
DIR *dp;
struct dirent *name;
struct stat statbuf;
if((dp = opendir(dir)) == NULL)
{
fprintf(stderr,"cannot open directory: %s\n", dir);
return;
}
chdir(dir);
while((name = readdir(dp)) != NULL)
{
if(lstat(name->d_name, &statbuf) == 0)
{
if(statbuf.st_mode & S_IFDIR)
{
/* Found a directory, but ignore . and .. */
if(strcmp(".", name->d_name) == 0 || strcmp("..", name->d_name) == 0)
continue;
// Directory name
int len = strlen(filepath);
strcat(filepath, name->d_name);
strcat(filepath, "/");
/* Recurse at a new indent level */
listdir(name->d_name);
filepath[len] = '\0';
}
else
{
// Filename
strcpy(filename, filepath);
strcat(filename, name->d_name);
// Prevent double printing
if(file[strlen(filename) - 1] != '~')
readFile(filename);
}
}
}
chdir("..");
closedir(dp);
}
打开/读取文件内容:
void readFile(char *filepath)
{
char ch;
FILE *file;
file = fopen(filepath, "r");
if(file)
{
while((ch = fgetc(file)) != EOF)
printf("%c", ch);
fclose(file);
}
}
主:
int main(int argc, int *argv[])
{
listdir(argv[1]);
return 0;
}
所以,如果我运行这个./fileread ~/Desktop
的程序,我在桌面上有这个:
Songs.txt,test / test.txt,test / random.txt
它将打印出Songs.txt的内容,但不会打印出测试文件夹中的任何内容。如果我拿出"防止双重打印"然后它会打印出两次Songs.txt的内容,但仍然不会打印出测试文件夹中的任何内容。
我做错了什么?任何帮助,将不胜感激!
已更新
我添加了本地字符串:
void getdir(char *dir)
{
char *direct;
char filepath[250];
...
direct = malloc(strlen(dir) + strlen(name->d_name) + 2);
strcpy(direct, dir);
strcat(direct, "/");
strcat(direct, name->d_name);
getdir(direct);
free(direct);
}
else
{
// Concatenate file name
strcpy(filepath, dir);
strcat(filepath, "/");
strcat(filepath, name->d_name);
if(filepath[strlen(filepath) - 1] != '~')
readFile(filepath);
}
这似乎很有效。如果有任何我不应该做的事情,请告诉我。感谢大家的帮助!