递归获取硬盘中的所有文件

问题描述

请我发现很难递归获取目录中的所有文件。我的代码工作正常,只是它仅获取当前目录中的文件。请任何人帮助我查看我的代码,以检查我做错了什么。

这是我的代码:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

int list2() {
    TCHAR currentdir[MAX_PATH];
    WIN32_FIND_DATA findDat2;
    GetCurrentDirectory(MAX_PATH,currentdir);
    strcat_s(currentdir,strlen(currentdir)+strlen("\\*")+1,"\\*");
    HANDLE hFind2 = FindFirstFile(currentdir,&findDat2);
    if (hFind2 == INVALID_HANDLE_VALUE) {
        printf("INVALID HANDLE VALUE");
    }
    else {
        INT dot1 = strncmp(".",findDat2.cFileName,strlen("."));
        INT dot2 = strncmp("..",strlen(".."));
        do {
            if (dot1 !=0 && dot2 != 0) {
                if (findDat2.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
                    SetCurrentDirectory(findDat2.cFileName);                    
                    list2();
                }
                else {
                    printf("%s\n",findDat2.cFileName);
                }
            }
        } while (FindNextFile(hFind2,&findDat2));
    }
}

int list(CHAR *startDir) {
    WIN32_FIND_DATA findDat;
    TCHAR path[MAX_PATH];
    TCHAR cpstartDir[MAX_PATH];
    strcpy_s(cpstartDir,sizeof(cpstartDir),startDir);

    HANDLE hFind = FindFirstFile(startDir,&findDat);
    if (hFind == INVALID_HANDLE_VALUE) {
        printf("INVALID_HANDLE_VALUE with finding file\n");
        return 0;
    }
    else {
        INT dot1 = strncmp(".",findDat.cFileName,strlen(".."));
        do {
            if (dot1 !=0 && dot2 != 0) {
                if (findDat.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
                    SetCurrentDirectory(findDat.cFileName);                 
                    list2();
                }
                else {
                    printf("%s\n",findDat.cFileName);
                }
            }
        } while (FindNextFile(hFind,&findDat));
    }
}

int main() {
    list("C:\\*.*");
    return 0;
}

这只会获取当前目录中的文件

解决方法

您需要的是一个递归函数,该函数递归到找到的每个目录中(...除外)。

我看不到使用SetCurrentDirectory的意义。您不想更改工作目录,而只需要较低级别路径的内容。

因此list应该为每个子目录调用其自身,其参数为:父路径+ \ +子文件夹的名称。

我创建了一个跨平台开源库来遍历整棵树:https://github.com/brechtsanders/libdirtrav 也许这对您很有用,这样您就不必重新发明一切。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...