Вывод списка содержимого каталога, например, команды Unix 'find'

Работая над измененной / более простой версией утилиты Unix 'find', и, пока я распечатываю файлы, мой формат отключен.

Бег:

./a.out mydir -print

Вывод должен быть похожим, чтобы найти следующее:

mydir
mydir/innerDir
mydir/innerDir/innerFile
mydir/testFile

Тем не менее, мой вывод следующий:

mydir/innerDir
innerFile/testFile

Это функция, которая у меня есть, которая проходит через содержимое каталога:

void printdir(char *dir, int depth) {
   DIR *dp;
   struct dirent *entry;
   struct stat statbuf;
   int spaces = depth * 4;
   char *path;

   if((dp = opendir(dir)) == NULL) {
      fprintf(stderr, "Error! Unable to open: %s\n", dir);
      exit(EXIT_FAILURE);
   }

   chdir(dir);
   while((entry = readdir(dp)) != NULL) {
      lstat(entry->d_name, & statbuf);
      if(S_ISDIR(statbuf.st_mode)) {
         if(strcasecmp(".", entry->d_name) == 0 ||
            strcasecmp("..", entry->d_name) == 0)
            continue;
         path = malloc(strlen(dir) + strlen(entry->d_name) + 2);
         strcpy(path, dir);
         strcat(path, "/");
         strcat(path, entry->d_name);
   //         printf("%*s|-- %s/\n", spaces, "", entry->d_name);
        printf("%s\n", path);
        printdir(entry->d_name, depth + 1);
      }
      else
   //         printf("%*s|-- %s\n", spaces, "", entry->d_name);
         printf("%s/", entry->d_name);
   }
   chdir("..");
   closedir(dp);
}

Закомментированные строки выше выводят аналогичный вывод в утилиту Unix 'tree'. Любая помощь о том, как изменить мою печать, чтобы получить вывод 'find', который я перечислил выше. Спасибо!

1 ответ

Решение

Просто неверный параметр при рекурсивном вызове, отправьте полный путь:

printdir(path, depth + 1);

а затем для записей не из каталога также выведите полный путь:

printf("%s/%s\n", dir, entry->d_name);

----РЕДАКТИРОВАТЬ----

Удалить все звонки на chdir как вы сгенерировали полный путь.

---- РЕДАКТИРОВАТЬ-2----

lstat не вызывается по правильному пути, измените на:

 while((entry = readdir(dp)) != NULL) {
     path = malloc(strlen(dir) + strlen(entry->d_name) + 2);
     strcpy(path, dir);
     strcat(path, "/");
     strcat(path, entry->d_name);
     lstat(path, & statbuf);
Другие вопросы по тегам