поиск и печать всех файлов и подпапок каталога - PullRequest
0 голосов
/ 11 мая 2018

Мне нужно написать программу на C, которая принимает каталог в качестве аргумента, рекурсивно печатает дерево со всеми файлами и подкаталогами.Я не знаю, как это сделать, вы можете мне помочь?Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Базиль прав.Это зависит от вашей операционной системы.Есть некоторые программы, написанные для печати каталогов / файлов, отличных от ntfw, называемые walking directories в POSIX.Например,

#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>

void listdir(const char *name, int indent)
{
    DIR *dir;
    struct dirent *entry;

    if (!(dir = opendir(name)))
        return;

    while ((entry = readdir(dir)) != NULL) {
        if (entry->d_type == DT_DIR) {
            char path[1024];
            if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
                continue;
            snprintf(path, sizeof(path), "%s/%s", name, entry->d_name);
            printf("%*s[%s]\n", indent, "", entry->d_name);
            listdir(path, indent + 2);
        } else {
            printf("%*s- %s\n", indent, "", entry->d_name);
        }
    }
    closedir(dir);
}

int main(void) {
    listdir(".", 0);
    return 0;
}
0 голосов
/ 11 мая 2018

Реализации на основе opendir (), readdir () и closedir () почти никогда не обрабатывают случаи, когда каталоги или файлы перемещаются, переименовываются или удаляются во время обхода дерева.nftw () должен обрабатывать их правильно

Для обхода файлового дерева есть две функции.ftw () и nftw ().ftw () проходит по дереву каталогов, которое находится под каталогом dirpath, и вызывает fn () один раз для каждой записи в дереве.По умолчанию каталоги обрабатываются до файлов и подкаталогов, которые они содержат (обход по предварительному заказу).

* int ftw (const char * dirpath, int (* fn) (const char * fpath, conststruct stat sb, int typeflag), int nopenfd);

Функция nftw () такая же, как ftw (), за исключением того, что она имеет один дополнительный аргумент, flags,и вызывает fn () с еще одним аргументом, ftwbuf.Этот аргумент флагов формируется путем ORing нуля или более из следующих флагов:

int nftw (const char * dirpath, int (* fn) (const char * fpath, const struct stat * sb, inttypeflag, struct FTW * ftwbuf), int nopenfd, int flags);

Эти функции возвращают 0 в случае успеха и -1 в случае ошибки.

Следующая программа перебираетдерево каталогов по пути, указанному в первом аргументе командной строки, или по текущему каталогу, если аргумент не указан.Он отображает различную информацию о каждом файле.

   #define _XOPEN_SOURCE 500
   #include <ftw.h>
   #include <stdio.h>
   #include <stdlib.h>
   #include <string.h>
   #include <stdint.h>

   static int display_info(const char *fpath, const struct stat *sb,
   int tflag,struct FTW *ftwbuf)
   {
    printf("%-3s %2d %7jd   %-40s %d %s\n",
    (tflag == FTW_D) ?   "d"   : (tflag == FTW_DNR) ? "dnr" :
    (tflag == FTW_DP) ?  "dp"  : (tflag == FTW_F) ?   "f" :
    (tflag == FTW_NS) ?  "ns"  : (tflag == FTW_SL) ?  "sl" :
    (tflag == FTW_SLN) ? "sln" : "???",
    ftwbuf->level, (intmax_t) sb->st_size,
    fpath, ftwbuf->base, fpath + ftwbuf->base);
    return 0;           /* To tell nftw() to continue */
    }

   int main(int argc, char *argv[])
   {
   int flags = 0;

  if (nftw((argc < 2) ? "." : argv[1], display_info, 20, flags)
        == -1) {
    perror("nftw");
    exit(EXIT_FAILURE);
   }
   exit(EXIT_SUCCESS);
  }
0 голосов
/ 11 мая 2018

В чистом стандарте C вы не можете этого сделать, поскольку стандарт C11 n1570 не упоминает каталоги .

Вам нужны некоторые специфические для операционной системы вещи. В Linux посмотрите на nftw (3) . Он использует вещи более низкого уровня, такие как opendir (3) , readdir (3) , closedir, stat (2) , которые вы можете использовать напрямую.

В Windows API для работы с каталогами очень отличается .

Некоторые фреймворки, такие как Poco , Boost , Qt , ... пытаются определить некоторую общую абстракцию для каталогов, работающих в нескольких ОС. Но точное представление о каталоге и файле отличается в Windows и Unix или Linux. Смотри также this .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...