如何搜索当前目录中的文件和当前目录下的目录中的文件?

时间:2013-04-02 12:29:48

标签: c linux unix systems-programming

该功能搜索当前目录中的文件。如果它是一个目录,它会进入并再次搜索除当前“。”之外的文件。和前面的'..'目录。但它并不是我想要的。它没有进入下一个目录。

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

3 个答案:

答案 0 :(得分: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!   
    }
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

也不推荐使用getcwd函数。改为使用符合ISO C ++的_getcwd(如果你用C ++编写的话)。