两个递归目录代码有什么不同?

时间:2015-10-30 15:08:20

标签: c

我在下面看到了代码,只更改了检查文件模式,我想使用stat,st_mode。但结果并不相同。区别只是检查功能。

void filelist(const char*loc, int dep){

  DIR*dirpt;
  struct dirent* dir;

  if (!(dirpt = opendir(loc)))
      return;

  while((dir = readdir(dirpt))!=NULL)
  {
    struct stat buf;
    lstat(dir->d_name, &buf);

    if(S_ISDIR(buf.st_mode)){

     char p[1024];
     int l = snprintf(p, sizeof(p)-1, "%s/%s", loc, dir->d_name);
     p[l] = 0;
      if (strcmp(dir->d_name, ".") == 0 || strcmp(dir->d_name, "..") == 0)
                continue;

      printf("%*s[%s]\n", dep*2,"", dir->d_name);
      filelist(p,dep + 1);
    }
    else 
      printf("%*s- %s\n", dep*2,"", dir->d_name);
  }
  closedir(dirpt);
}
int main(void){
   filelist(".",0);
   return 0;
 }

只需更改check file_mode

即可
{{1}}

但结果不一样,无法浏览所有目录....我不知道为什么......

1 个答案:

答案 0 :(得分:0)

lstat(dir->d_name, &buf);

在此次通话中,dir->d_name未捕获完整路径。它只是该目录中条目的名称。您应该捕获函数的返回值,并确保它能够获得您需要的值。

if ( lstat(dir->d_name, &buf) == -1 )
{
   // Deal with error
}

你必须使用类似的东西:

while((dir = readdir(dirpt))!=NULL)
{
   char p[1024];
   struct stat buf;

   int l = snprintf(p, sizeof(p)-1, "%s/%s", loc, dir->d_name);
   p[l] = 0;

   if ( lstat(dir->d_name, &buf) == -1 )
   {
      // Problem
      continue;
   }

   if(S_ISDIR(buf.st_mode)){

      if (strcmp(dir->d_name, ".") == 0 || strcmp(dir->d_name, "..") == 0)
         continue;

      printf("%*s[%s]\n", dep*2,"", dir->d_name);
      filelist(p,dep + 1);
   }
   else 
      printf("%*s- %s\n", dep*2,"", dir->d_name);
}