win32下,遍历目录下的文件和子目录 【转】

来源:赵克立博客 分类: Win32 标签:Win32ApiWin32发布时间:2017-12-05 10:15:02最后更新:2017-12-05 10:22:52浏览:1786
版权声明:
本文为博主学习过程中整理发布,如有侵权请告知
更新时间:
2017-12-05 10:22:52
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

下面函数实现啦遍历当前目录下的文件和目录,如果想实现遍历包括子目录的所有文件,在判断出是目录的地方递归调用自己就可以啦。

下面函数只遍历当前目录的文件和目录

/*
* sub_dir.c 遍历目录下的文件和子目录
*/
#include <Windows.h>
#include <stdio.h>
/*
* DWORD EnumerateFileInDirectory(LPSTR szPath)
* 功能:遍历目录下的文件和子目录,将显示文件和文件夹隐藏、加密的属性
*
* 参数:LPSTR szPath,为需遍历的路径
*
* 返回值:0代表执行完成,1代表发送错误
*/
DWORD EnumerateFileInDirectory(LPWSTR szPath)
{
    WIN32_FIND_DATA FindFileData;
    HANDLE hListFile;
    WCHAR szFilePath[MAX_PATH];
    // 构造代表子目录和文件夹路径的字符串,使用通配符"*"
    lstrcpy(szFilePath, szPath);
    // 注释的代码可以用于查找所有以“.txt”结尾的文件
    // lstrcat(szFilePath, "\\*.txt");
    lstrcat(szFilePath, L"\\*");
    // 查找第一个文件/目录,获得查找句柄
    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;
            }
            */
            // 打印文件名、目录名
            printf("%ws\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(int argc, PCHAR argv[])
* 功能:调用ListFileInDirectory遍历目录下的文件和子目录
* 参数:argv[1]为需要遍历的路径,如果为空,则获取当前路径
*/
int main(int argc, PCHAR argv[])
{
    //if (argc == 2)
    //{
    //  EnumerateFileInDirectory(argv[1]);
    //}
    //else
    {
        WCHAR szCurrentPath[MAX_PATH];
        GetCurrentDirectory(MAX_PATH, szCurrentPath);
        EnumerateFileInDirectory(szCurrentPath);
    }
    return 0;
}

遍历结果

image.png


微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python