Определение количества файлов и папок в каталоге - PullRequest
1 голос
/ 17 июня 2020

Мне нужно найти, сколько папок и сколько обычных файлов в каталоге. Я что-то пробовал, но даже не смог скомпилировать код. Я даже не знаю, верна моя программа или нет. Когда я пытался скомпилировать свой код, было два типа ошибок. Одна из них - ошибка: struct dirent не имеет члена с именем 'd_type' и необъявленного 'DT_DIR' (первое использование в этой функции, DT_REG необъявлено (первое использование в этой функции).

Я использую CodeBlocks с MinGW , если ошибка связана с моим компилятором; я должен использовать эту IDE.

Как исправить мой код?

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
    int file_count = 0;
    int dir_count = 0;
    struct dirent * entry;
    DIR *dp;

    if (argc != 2)
    {
        printf("usage: give directory_name\n");
        exit(-1);
    }

    if ((dp = opendir(argv[1])) == NULL)
    {
        printf("Error: can't open %s\n", argv[1]);
        exit(-2);
    }
    while ((entry= readdir(dp)) != NULL){

        if (entry->d_type == DT_REG)
         file_count++;

        else if (entry->d_type == DT_DIR)
         dir_count++;
    }

    closedir(dp);

    printf(" %d Number of file ", file_count);
    printf(" %d Number of folders", dir_count);
    exit(0);
}

1 Ответ

1 голос
/ 17 июня 2020

Может быть, вам не хватает некоторых включений?

Вот моя версия

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

int main(int argc, char *argv[]) {
    DIR *dir;
    struct dirent *ent;

    size_t nfiles = 0, ndirs = 0;

    if (argc != 2) {
        fprintf(stderr, "Usage: %s directory\n", argv[0]);
        return -1;
    }

    if (!(dir = opendir(argv[1]))) {
        fprintf(stderr, "[!] Could not open directory `%s': %s\n", argv[1],
                strerror(errno));
        return -2;
    }

    while ((ent = readdir(dir))) {
        // Ignore . and .. entries
        if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) {
            continue;
        }

        if (ent->d_type == DT_REG) {
            ++nfiles;
        } else if (ent->d_type == DT_DIR) {
            ++ndirs;
        }
    }

    closedir(dir);
    printf("%lu Files, %lu Directories\n", nfiles, ndirs);

    return 0;
}
...