che*_*sam 5 c directory-structure function
我在使用 'if(S_IFDIR(stbuf.st_mode))' 行时遇到一些问题。这是测试要递归到的目录的正确方法吗?目前该函数似乎可以正确执行 1 或 2 个循环,然后失败并出现分段错误。
我已经尝试过以下方法,并且可能更多作为条件。
S_ISDIR(st_mode)
((st_mode & ST_IFMT) == S_IFDIR)
S_IFDIR(stbuf.st_mode)
Run Code Online (Sandbox Code Playgroud)
我已经包含了整个函数,因为我担心问题可能出在其他地方。
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);
}
Run Code Online (Sandbox Code Playgroud)
对,那是正确的。但由于您从未更改过该目录,因此您将找不到它。
考虑以下目录层次结构:
a
|
+- b
| |
| +- c
...
Run Code Online (Sandbox Code Playgroud)
您的代码将扫描其当前目录,并找到“a”。它会判断这是一个目录,并递归调用自身,并打开“a”进行读取。这有效。该扫描将找到一个名为“b”的目录,但尝试仅使用条目名称打开它将会失败,因为路径现在是“a/b”。
chdir()我建议在打开它之前切换到目录(带有)。这意味着您可以opendir(".")。存储旧路径,并chdir()在递归该级别完成时再次输出(而不是在进行递归调用以更深入之前)。