C++ Windos API FindNextFile函数

前言

        上文介绍了FindFirstFile函数,本文介绍与FindFirstFile搭配使用的函数FindNextFile

        两者配合使用能够遍历与指定文件名模式匹配的所有文件或目录;

主要内容

         FindNextFile函数原型

#include <windows.h>  
  
BOOL FindNextFile(  
  HANDLE hFindFile, // 由 FindFirstFile 返回的搜索句柄  
  LPWIN32_FIND_DATA lpFindFileData // 指向用于接收找到的下一个文件信息的结构体的指针  
);

函数参数一:HANDLE

         hFindFile:由 FindFirstFile 函数返回的搜索句柄。这个句柄标识了当前搜索的上下文,使得 FindNextFile 能够继续遍历。

函数参数二:LPWIN32_FIND_DATA

         lpFindFileData:指向 WIN32_FIND_DATA 结构体的指针,该结构体用于接收找到的下一个文件或目录的信息。

        它是一个指向WIN32_FIND_DATA结构体的指针,我们可以从上面关于LP的解释中得到该结论。

        WIN32_FIND_DATA结构体的成员如下:

typedef struct _WIN32_FIND_DATA {  
    DWORD       dwFileAttributes;       // 文件属性  
    FILETIME    ftCreationTime;         // 文件创建时间  
    FILETIME    ftLastAccessTime;       // 文件最后一次访问时间  
    FILETIME    ftLastWriteTime;        // 文件最后一次修改时间  
    DWORD       nFileSizeHigh;          // 文件大小的高32位  
    DWORD       nFileSizeLow;           // 文件大小的低32位  
    DWORD       dwReserved0;            // 系统保留  
    DWORD       dwReserved1;            // 系统保留  
    TCHAR       cFileName[MAX_PATH];    // 长文件名  
    TCHAR       cAlternateFileName[14]; // 8.3格式文件名  
} WIN32_FIND_DATA, *LPWIN32_FIND_DATA;

 函数使用示例

 

void findFile()
{
    WIN32_FIND_DATA findFileData;
    HANDLE hFind = INVALID_HANDLE_VALUE;

    // 查找当前目录下的所有文件
    hFind = FindFirstFile(TEXT("S*"), &findFileData);

    if (hFind == INVALID_HANDLE_VALUE)
    {
        printf("FindFirstFile failed (%d)\n", GetLastError());
        // return 1;
    }

    do
    {
        // 跳过 "." 和 ".." 这两个特殊目录
        // if (strcmp(findFileData.cFileName, ".") == 0 || strcmp(findFileData.cFileName, "..") == 0)
        //     continue;

        printf("%s\n", findFileData.cFileName);
    } while (FindNextFile(hFind, &findFileData) != 0);

    // 检查是否因为遍历完成而退出循环
    if (GetLastError() != ERROR_NO_MORE_FILES)
    {
        printf("FindNextFile failed (%d)\n", GetLastError());
    }

    // 完成后关闭句柄
    FindClose(hFind);

    // return 0;
}

执行结果

// 我当前路径下 仅有这两个符合查询条件
Sample.cpp
Sample.h

结论

         在FindFirstFile中,我们的查询条件是所以S开头命名的任意文件。也就是说,在FindFirstFile找到第一个满足条件的文件后,我们可以使用FindNextFile来查询下一个满足条件的文件

函数使用注意事项

  • 函数传入WIN32_FIND_DATA结构体变量的地址
  • 在使用完FindFirstFile后,应该使用FindClose函数关闭该句柄,以释放与之关联的资源。
  • 在处理文件名时,应注意文件名可能包含空格、特殊字符或Unicode字符,因此应适当处理这些情况。
  • 如果需要搜索具有特定属性的文件(如隐藏文件、只读文件等),则可能需要结合其他函数或API来实现。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直在找资料的菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值