2014-03-08 6 views
0

Итак, я пытаюсь обработать список каталогов и файлов внутри них. Моя программа отлично работает до сих пор, за исключением случая, когда в пределах данной директории существует более чем 1 подкаталог. Я абсолютно не могу понять, почему это происходит.Обработка рекурсивных подкаталогов в C

Ниже приведены соответствующие фрагменты кода, который я использую. Любая помощь будет принята с благодарностью.

int i=0; 
    int subcount=0; 
    char temp[256]; 
    struct dirent *directory; 
    DIR *pdirectory; 
    struct stat fileinfo; 

    chdir(path); 
    pdirectory=opendir(path); 
    if (pdirectory==NULL) 
    { 
      perror(path); 
      exit(EXIT_FAILURE); 
    } 
    printf("%s\n",path); 
    while ((directory=readdir(pdirectory)) != NULL) 
    { 

     if (!stat(directory->d_name,&fileinfo)) 
     { 

      if(!strcmp(directory->d_name,".")) 
      continue; 
      if(!strcmp(directory->d_name,"..")) 
      continue; 

     if (S_ISDIR(fileinfo.st_mode) && (!S_ISREG(fileinfo.st_mode))) 
     { 
      (char*)directory->d_name; 
      strcpy(temp,directory->d_name); 
      printf("Dir Name: %s\n",temp); 
      subcount=subcount+1; 
      printf("Sub Count: %d\n",subcount); 


      for (i=0; i < subcount; i++) 
      { 
       strcat(path,"/"); 
       strcat(path,temp);   
       processDir(path); //Recursive Call to Function 

      } 
      closedir(pdirectory); 
      } 
+1

* Он не работает * не очень описателен. что именно происходит? –

+0

Итак, у меня есть родительская папка с 1 подкаталогом с именем Test. Внутри теста есть 2 подкаталога с именем Test 1 и Test2. Моя программа обрабатывает все файлы в родительской папке, в тесте Test и внутри Test2, но по какой-то причине, похоже, пропускает Test1. – user3394907

+0

Обычно вы получите ответы на вопросы о неработающих, если вы опубликуете SCCE: автономный компилируемый пример. В этом случае извлеките код хостинга каталога. – Gene

ответ

0

Объявление функции не отображается, но это, вероятно, выглядит как

void processDir(char *path); 

path не следует считать, чтобы иметь пространство для дополнительной прилагается char, который, к сожалению, это то, что происходит с

strcat(path,"/"); 
strcat(path, temp);   

Кроме того, если есть другой подкаталог, path не восстановлен и следующее добавлено имя подкаталога (@doukremt). Вместо этого используйте рабочую область buffer. BTW: нет необходимости в temp.

char buffer[1024]; 
sprintf(buffer, "%s/%s", path, directory->d_name); 
processDir(buffer); //Recursive Call to Function 

Позже:
Вы делаете хочет использовать snprintf() не страховать нет буфера заскоков и принять отвлекающее действие.
Упрощение: int len = sprintf(buffer, "%s/", path); перед циклом, а затем просто:

strcpy(&buffer[len], directory->d_name); 
processDir(buffer); //Recursive Call to Function 

Опять же, добавить Предотвратить/обнаружить буферы заскоки кода.


Дополнительный подход: если С99 или более поздней версии, используйте VLA

char buffer[strlen(path) + 1 + sizeof(directory->d_name) + 1]; 

или использовать динамическое выделение памяти.

size_t size = strlen(path) + 1 + sizeof(directory->d_name) + 1; 
char *buffer = malloc(size); // TDB add NULL check 
len = sprintf(buffer, "%s/", path);` 
while ((directory=readdir(pdirectory)) != NULL) { 
    ... 
    strcpy(&buffer[len], directory->d_name); 
    processDir(buffer); 
    ... 
} 
free(buffer); 

 Смежные вопросы

  • Нет связанных вопросов^_^