使用stat()函数测试DIRENT是目录还是文件的正确方法是什么?

我在使用’if(S_IFDIR(stbuf.st_mode))’行时遇到了一些麻烦。 这是测试目录递归的正确方法吗? 此时的函数似乎正确地执行1或2个循环,然后失败并且分段错误。

我尝试过以下内容,可能更多的是条件。

S_ISDIR(st_mode) ((st_mode & ST_IFMT) == S_IFDIR) S_IFDIR(stbuf.st_mode) 

我已经包含了整个function,因为我担心问题可能在其他地方。

 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); } 

对,那是正确的。 但是,既然你永远不会改变目录,你将找不到它。

请考虑以下目录层次结构:

  a | +- b | | | +- c ... 

您的代码将扫描其当前目录,并找到“a”。 它将确定它是一个目录,并以递归方式调用自身,并打开“a”进行读取。 这很有效。 该扫描将找到一个名为“b”的目录,但尝试仅使用条目名称打开它将失败,因为该路径现在是“a / b”。

我建议在打开之前更改到目录(使用chdir() )。 这意味着你可以只是opendir(".") 。 存储旧路径,并在递归该级别时再次将chdir()输出(不是在进行递归调用之前更深入)。

入口在哪里定义? 它是一个局部变量吗? 我不明白为什么会出现段错误,但可能你应该把它变成局部变量。 它会咬你的一个例子是:

  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将打印错误的名称,所以你应该在这里添加一个else。

dirpnt也是如此。 当你走出while循环中的getFolderContents时,你最终会在一个封闭的dirpoint上调用readdir,这会让你退出循环。

但正如bahbar所述:你无法在全局变量中递归和存储临时变量