Как подсчитать количество файлов и подпапок с помощью C (Windows) - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь подсчитать количество файлов и подпапок по заданному пути. Я провел небольшое исследование, но люди делали это в основном для Linux, но мне нужно сделать это в Windows. Это мой код:

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
void listFiles(const char *path);
int main()
{   
    char path[100];
    printf("Enter path to list files: ");
    scanf("%s", path);
    listFiles(path);
    return 0;
}
void listFiles(const char *path)
{
    struct dirent *dp;
    DIR *dir = opendir(path);
    int fileCount = 0;
    int dirCount = 0;
    int i, n;

    if (!dir) 
        return; 

    for(i = 1; i < n; i++){
    while ((dp = readdir(dir)) != NULL)
    {
       if(dir->d_type == DT_REG){
                fileCount++;
          }
          if(dir->d_type == DT_DIR)
                dirCount++;
        }
         printf("%s: file count is: %d and dir count is: %d\n",path, fileCount, dirCount);
    }    
    closedir(dir);
}

И это ошибки, которые я не мог исправить:

28  14      [Error] 'DIR' has no member named 'd_type'
28  26      [Error] 'DT_REG' undeclared (first use in this function)
28  26      [Note] each undeclared identifier is reported only once for each function it appears in
31  17      [Error] 'DIR' has no member named 'd_type'
31  29      [Error] 'DT_DIR' undeclared (first use in this function)
28          recipe for target '2.o' failed

Не могли бы вы помочь мне, как это исправить. Я кое-что видел о _BSD_SOURCE, но не знаю, Linux или Windows.

1 Ответ

0 голосов
/ 19 июня 2020

Ваш вопрос в заголовке указывает на необходимость делать то, что вы делаете на Windows, но некоторые из опубликованных вами кодов (например, readdir () ) требуют соответствия POSIX. На Windows работать не будет.

Windows Функции, которые могут использоваться для подсчета файлов и каталогов, включают следующее:

FindFirstFile

FindNextFile

GetFileAttributes

Вот базовая c работа фрейма, с которой вы можете начать. Он компилируется, но потребует адаптации, прежде чем он будет работать для вас. Ваша адаптация потребует перехода вниз по всем найденным каталогам, чтобы найти больше файлов / подкаталогов, а затем вернуться на верхний уровень. Вы можете использовать атрибуты, как показано, для принятия решения о том, является ли найденный файл либо file, либо directory, и увеличивать соответствующий счетчик, чтобы отслеживать каждый: (Только в этом примере считает каталоги и файлы первого уровня.)

Добавьте #include файлов в соответствии с вашей средой, которые должны включать #include <windows.h> среди прочего.

#include <windows.h>
//include other files as needed for your system

int main(int argc, char *argv[])
{
    FILE *out;
    int fileCount = 0;
    int dirCount = 0;


    DWORD attribute;

    WIN32_FIND_DATA file;
    HANDLE fhandle;

    out = fopen("file_list.txt", "w");
    if(out == NULL){
        printf( "Error creating file\n");
        return 0;
    }
    // Place your own starting point here.  
    fhandle = FindFirstFile("C:\\play\\*", &file);
    if(fhandle == INVALID_HANDLE_VALUE){
        printf("Invalid File Handle.\n");
        return 0;
    } 

    while(FindNextFile(fhandle, &file) != 0){
        attribute = GetFileAttributes(file.cFileName);
        switch(attribute) {
            case FILE_ATTRIBUTE_DIRECTORY:
                dirCount++;
                fprintf(out, "DIR - %s\n", file.cFileName);
                break;
            default:
                fileCount++;
                fprintf(out, "FILE - %s\n", file.cFileName);
                break;
        }                                                
    }
    fprintf(out, "Directories: %d\nFiles      :%d\n", dirCount, fileCount);
    fclose(out);

    return 0;
}
...