很多时我们需要对文件进行遍历,这里我将对其进行简要介绍。
首先,我们来看几个api和结构体,第一个叫WIN32_FIND_DATA结构体,声明如下:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; //文件属性
FILETIME ftCreationTime; //文件创建时间
FILETIME ftLastAccessTime; //文件最后一次访问时间
FILETIME ftLastWriteTime; //文件最后一次修改时间
DWORD nFileSizeHigh; //文件大小,高32位
DWORD nFileSizeLow; //文件大小,低32位
DWORD dwReserved0; //如果第一个参数是FILE_ATTRIBUTE_REPARSE_POINT,则该参数指定了重分析点标志,否则为系统保留
DWORD dwReserved1; //系统保留使用
TCHAR cFileName[ MAX_PATH ]; //文件名
TCHAR cAlternateFileName[ 14 ]; //8.3格式文件名
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;
第二个API是FindFirstFile,声明如下:
HANDLE FindFirstFile(
LPCTSTR lpFileName, // 文件名(要包括路径)
LPWIN32_FIND_DATA lpFindFileData // 文件信息结构体
);
第三个API是FindNextFile,声明如下:
BOOL FindNextFile(
HANDLE hFindFile, // 搜索的文件句柄,该参与上一个API的返回值相同
LPWIN32_FIND_DATA lpFindFileData // 文件信息结构体
);
第四个是FindClose,声明如下:
BOOL FindClose(
HANDLE hFindFile // 文件搜索句柄,该参与FindFirstFile的返回值相同
);
附上搜索指定路径下的所有文件夹及文件的代码:
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
void FindFile(const std::string strPath)
{
WIN32_FIND_DATAA findData = { 0 };
string strFindPath = strPath + "\\*.*";
//查找第一个文件
HANDLE hFindFine = FindFirstFileA(strFindPath.c_str(), &findData);
if (INVALID_HANDLE_VALUE == hFindFine)
printf("Error:%d", GetLastError());
//循环递归查找文件
do
{
//判断该文件是否为文件夹
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (findData.cFileName[0] == '.')
continue;
cout << "在" << strPath << "找到文件夹:\t" << findData.cFileName << endl;
string strNeedFindPaht = strPath + "\\" + findData.cFileName;
//若该文件是文件夹,则递归进行查找该文件夹下的文件
FindFile(strNeedFindPaht);
}
else
{
cout << "在" << strPath << "找到文件:\t" << findData.cFileName << endl;
}
} while (FindNextFileA(hFindFine, &findData));
//关闭文件搜索句柄
FindClose(hFindFine);
}
int _tmain(int argc, _TCHAR* argv[])
{
//搜索D盘下Test文件夹下的所有文件
string strFilePath = "D:\\Test\\";
FindFile(strFilePath);
return 0;
}