我遇到'if(S_IFDIR(stbuf.st_mode))'行的问题。这是测试目录递归到的正确方法吗?此时的函数似乎正确地执行1或2个循环,然后失败并且分段出错。
我尝试了以下内容,可能更多的是条件。
S_ISDIR(st_mode)
((st_mode & ST_IFMT) == S_IFDIR)
S_IFDIR(stbuf.st_mode)
我已经包含了整个功能,因为我担心问题可能在其他地方。
void getFolderContents(char *source, int temp){
struct stat stbuf;
int isDir;
dirPnt = opendir(source);
if(dirPnt != NULL){
while(entry = readdir(dirPnt)){
char *c = entry->d_name;
if(strcmp(entry->d_name, cwd) == 0 || strcmp(entry->d_name, parent) == 0){
}
else{
stat(entry->d_name, &stbuf);
printf("%i %i ", S_IFMT, stbuf.st_mode);
if(S_IFDIR(stbuf.st_mode)){ //Test DIR or file
printf("DIR: %s\n", entry->d_name);
getFolderContents(entry->d_name, 0);
}
printf("FILE: %s\n", entry->d_name);
}
}
closedir(dirPnt);
}
答案 0 :(得分:3)
是的,这是正确的。但是,既然你永远不会改变目录,你就找不到它。
考虑以下目录层次结构:
a
|
+- b
| |
| +- c
...
您的代码将扫描其当前目录,并找到“a”。它将确定它是一个目录,并以递归方式调用自身,并打开“a”进行读取。这有效。该扫描将找到一个名为“b”的目录,但尝试仅使用条目名称打开它将失败,因为该路径现在是“a / b”。
我建议在打开之前更改到目录(使用chdir()
)。这意味着您可以opendir(".")
。存储旧路径,并在递归该级别时再次输出chdir()
(而不是在进行递归调用之前更深入)。
答案 1 :(得分:1)
入口在哪里定义?它是一个局部变量吗? 我不明白为什么它会段错误,但可能你应该把它变成局部变量。 它会咬你的一个例子是:
if(S_IFDIR(stbuf.st_mode)){ //Test DIR or file
printf("DIR: %s\n", entry->d_name);
getFolderContents(entry->d_name, 0);
}
printf("FILE: %s\n", entry->d_name);
printf打印错误的名字,所以你应该在这里添加其他内容。
dirpnt也是如此。当你走出while循环中的getFolderContents时, 你最终在封闭的dirpoint上调用readdir,这会让你离开循环。
但正如bahbar所说: 您无法在全局变量
中递归和存储临时变量