1

该函数搜索当前目录中的文件。如果它跨越一个目录,它会进入并再次搜索除当前'.'之外的文件。和以前的“..”目录。但它不能按我的意愿工作。它没有进入下一个目录。

int foo(char *currDir) 
{
  struct dirent *direntp;
  DIR *dirp;
  char currentDir[250];



  if ((dirp = opendir(currDir)) == NULL) 
  {
      perror ("Failed to open directory");
      return 1;
  }

  //By Sabri Mev at GYTE

  while ((direntp = readdir(dirp)) != NULL)
  {
    printf("%s\n", direntp->d_name);
    if(direntp->d_type == DT_DIR)
    {
        if(strcmp(direntp->d_name,".") !=0  && strcmp(direntp->d_name,"..") != 0)
            foo(direntp->d_name); //Recursive!   
    }
  }
  getcwd(currentDir,250);
  printf("curr Dir : %s\n",currentDir );


  while ((closedir(dirp) == -1) && (errno == EINTR)) ;

  return 0;
}
4

3 回答 3

2

因为你的路径是错误的。

试试这个

if(direntp->d_type == DT_DIR)
{   
    if(strcmp(direntp->d_name,".") !=0  && strcmp(direntp->d_name,"..") != 0) 
    {
        sprintf(currentDir, "%s/%s", currDir, direntp->d_name);
        foo(currentDir); //Recursive!   
    }
}
于 2013-04-02T12:47:31.793 回答
1

当您在循环内对 foo() 进行递归调用时,请注意 direntp->d_name 包含的不是完整路径,而只是子目录名称。您必须将其与 currDir 连接并使用结果调用 foo()。

例如,如果你从 foo("/home") 开始并且第一个子目录是 "root",那么当它应该是 foo("/home/root") 时,你会递归调用 foo("root")。

于 2013-04-02T12:56:30.673 回答
0

direntp->d_name您仅访问本地目录名称时,它不会返回整个路径

功能也getcwd被弃用。请改用符合 ISO C++ 的标准_getcwd(如果您不使用 C++ 编写)。

于 2013-04-02T12:55:50.047 回答