2014-12-21 2 views
0

Я написал программу, которая читает каталоги. Он читается только до уровня 2 данного каталога.Чтение каталогов

void 
readDir (char *pth) 
{ 
    char path[1000]; 
    strcpy (path, pth); 
    DIR *dp; 
    DIR *dp2; 
    struct dirent *files; 
    struct dirent *files2; 
    if ((dp = opendir (path)) == NULL) 
    perror ("dir\n"); 

    char newp[1000]; 

    struct stat buf; 

    while ((files = readdir (dp)) != NULL) 
    { 
     if ((strcmp (files->d_name, ".") && strcmp (files->d_name, ".."))) 
     { 
      strcpy (newp, path); 
      strcat (newp, "/"); 
      strcat (newp, files->d_name); 
      printf ("%s\n", newp); 
      if ((dp2 = opendir (newp)) == NULL) 
      perror ("dir\n"); 
      while ((files2 = readdir (dp2)) != NULL) 
      { 
       printf ("%s\n", files2->d_name); 
       if ((strcmp (files2->d_name, ".") 
        && strcmp (files2->d_name, ".."))) 
       { 
        strcat (newp, "/"); 
        strcat (newp, files2->d_name); 
        //printf("%s\n",newp); 
        CheckOutput (newp); 
       } 
      } 
     } 
    } 
} 

Пример directoreis расположения: (В каждой из каталога пользователей есть один текстовый файл.)

Head -> user1 -> a.txt 
    -> user2 -> b.txt 
    -> user3 -> c.txt 

Он работал отлично один раз, а потом что-то странное произошло: я скопировал текстовый файл наклеен, и удалили и напечатали некоторые странные справочники, например:

/home/Desktop/Head/user/a.txt~ 
/home/Desktop/Head/user/a.txt~/b.txt~ 

И я понятия не имею, почему. Может ли кто-нибудь мне помочь?

+0

Вы проверили содержимое каталогов? –

+0

hhh, да ... много раз – frdfg

+0

Я не могу воспроизвести вашу проблему, у вас есть еще один, но вы не называете 'closedir' на' dp' и 'dp2', вы должны называть его' dp' в конце внешнего цикла while и для 'dp2' в конце внутреннего цикла while. –

ответ

1

Тильда в конце имени файла означает, что это файл резервной копии. Мое предположение заключается в том, что проблема не в вашем коде, а в редакторе, который вы использовали для редактирования файлов. Например, редакторы, такие как gedit, оставьте файл резервной копии, который в конце обозначается знаком ~. Вы должны попытаться закрыть редактор и запустить программу еще раз.

+0

Я не использовал такой редактор. Я удалил txt-файл с помощью кнопки delete на клавиатуре – frdfg

+0

Я понял проблему в этой печати @iharob. Я предположил, что в каждом каталоге есть один текстовый файл, но если есть резервная копия - есть еще, и я снова и снова использую strcat. – frdfg

+0

Вы проверили содержимое каталога с помощью файлового браузера? Кроме того, обязательно проверьте опцию _Show hidden files_. – arnaudoff

0

Вы должны начать с инициализацией NEWp [1000] до нуля что-то вроде этого:

char newp[1000] = {0}; 

У вас есть проблемы в цикле, потому что вы используете NEWp как для пути и имени файлов, которые две разные вещи, с которыми вам приходится иметь дело. Действительно, у вас будет проблема при открытии ./user1, затем ./user2, поскольку вы перезаписываете newp с ./user1/a.txt~ и никогда не очищаете его.

Кстати, дело может быть просто резервным файлом в каталоге, в котором вы запускаете свою программу. В зависимости от того, на какой ОС вы работаете, readdir может вернуть вам скрытые файлы с самого первого вызова, что, скорее всего, имеет место здесь, так как ваш файл начинается с «a».

Найдите способ создания правильных путей в цикле while и выполните ls -a в вашем текущем каталоге.

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