前言
上文介绍了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来实现。