Как я могу искать файлы в текущем каталоге и файлы в каталогах, находящихся в текущем каталоге?

Функция ищет файлы в текущем каталоге. Если он попадает в каталог, он входит и снова ищет файл, кроме текущего '.' и предыдущий каталог «..». Но он не работает так, как я хочу. Он не попадает в следующий каталог.

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

person Sabri Meviş    schedule 02.04.2013    source источник
comment
вы проследили код с помощью отладчика? Он даже входит в рекурсивную часть?   -  person Mike    schedule 02.04.2013


Ответы (3)


Потому что твой путь ошибочен.

попробуй это

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!   
    }
}
person Scy    schedule 02.04.2013

Когда вы выполняете рекурсивный вызов foo() внутри цикла, обратите внимание, что direntp->d_name содержит не полный путь, а только имя подкаталога. Вы должны соединить его с currDir и использовать результат для вызова foo().

Например, если вы начинаете с foo("/home") и первым подкаталогом является "root", вы вызываете рекурсивно foo("root") вместо foo("/home/root").

person Fabio Ceconello    schedule 02.04.2013

в direntp->d_name вы получаете доступ только к имени локального каталога, он не возвращает весь путь

также функция getcwd устарела. Вместо этого используйте совместимый с ISO C++ _getcwd. (если вы конечно пишете на С++).

person Kupto    schedule 02.04.2013