使用Windows API遍历目录

83 阅读1分钟

显示指定目录下的文件

代码

#include <Windows.h>
#include <stdio.h>

DWORD EnumerateFileDirectory(PCTSTR szPath) {

    WIN32_FIND_DATA FindFileData;  // 文件信息的结构体

    HANDLE hListFile;

    TCHAR szFilePath[MAX_PATH];

    // 加上通配符,查找所有的文件
    lstrcpy(szFilePath, szPath);
    lstrcat(szFilePath, TEXT("\\*"));

    hListFile = FindFirstFile(szFilePath, &FindFileData);  // 查找第一个文件

    if (hListFile == INVALID_HANDLE_VALUE) {
        printf("错误: %d\n", GetLastError());
        return 1;
    }
    else {
        do {
            // 显示找到的文件信息
            wprintf(L"%s\t\t", FindFileData.cFileName);  // 输出名称

            if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) {
                // 文件是否是加密的
                printf("加密的文件");

            }

            if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) {
                // 文件是否是隐藏的
                printf("隐藏的文件");
            }

            if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
                // 是否是一个文件夹
                printf("<DIR>");
            }

            printf("\n");


        } while (FindNextFile(hListFile, &FindFileData));
    }

    return 0;
}

int main() {

    EnumerateFileDirectory(TEXT("C:\\Users\\win10\\source\\repos\\Project11"));

    return 0;
}

运行效果

image.png

递归显示指定目录下的所有文件

代码

#include <Windows.h>
#include <stdio.h>

DWORD dwTotalFileNum = 0;  // 文件总数

DWORD ListAllFileInDirectory(PCTSTR szPath) {
    WIN32_FIND_DATA FindFileData;  // 文件信息句柄
    HANDLE hListFile;
    TCHAR szFilePath[MAX_PATH];

    TCHAR szFullPath[MAX_PATH];


    lstrcpy(szFilePath, szPath);

    // 加上通配符, 查找出来所有文件
    lstrcat(szFilePath, TEXT("\\*"));

    hListFile = FindFirstFile(szFilePath, &FindFileData);

    if (hListFile == INVALID_HANDLE_VALUE) {
        printf("错误:%d\n", GetLastError());
        return 1;
    }
    else {

        do
        {
            if (lstrcmp(FindFileData.cFileName, TEXT(".")) == 0 ||
                lstrcmp(FindFileData.cFileName, TEXT("..")) == 0) {
                // 排除.和..
                continue;
            }
            wsprintf(szFullPath, L"%s\\%s", szPath, FindFileData.cFileName);  // 构造全名
            dwTotalFileNum++;
            wprintf(L"\n%d\t%s\t", dwTotalFileNum, szFullPath);  // 打印全名
            if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {  // 如果是文件夹,进行递归
                printf("<DIR>");
                ListAllFileInDirectory(szFullPath);
            }

        } while (FindNextFile(hListFile, &FindFileData));

    }

}


int main() {

    ListAllFileInDirectory(TEXT("C:\\Users\\win10\\source\\repos\\Project13"));

    printf("\n");



    return 0;
}

显示效果

image.png