结果截图:
首先介绍FindFirstFile 和 FindNextFile这两个函数,在介绍他们之前,先来了解一个WIN32_FIND_DATA结构
WIN32_FIND_DATA结构描述了由FindFirstFile 和FindNextFile查找到的文件信息
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, *PWIN32_FIND_DATA;
我们再来看FindFirstFile函数:
HANDLE FindFirstFile(
LPCTSTR lpFileName, // 查找的文件类型。例如:.txt .ini .cpp 等后缀
LPWIN32_FIND_DATA lpFindFileData // 得到当前所杳找文件的一些属性,包括文件名,文件 大小创建时间等
);
此函数返回HANDLE类型的值
FindFirstFile返回的 findData 中 dwFileAttributes项的值
可能是
FILE_ATTRIBUTE_ARCHIVE
FILE_ATTRIBUTE_COMPRESSED
FILE_ATTRIBUTE_DIRECTORY //找到的文件是一个目录文件
FILE_ATTRIBUTE_HIDDEN
FILE_ATTRIBUTE_NORMAL
FILE_ATTRIBUTE_OFFLINE
FILE_ATTRIBUTE_READONLY
FILE_ATTRIBUTE_SYSTEM
FILE_ATTRIBUTE_TEMPORARY
BOOL FindNextFile(
HANDLE hFindFile, //FindFirstFile返回的HANDLE
LPWIN32_FIND_DATA lpFindFileData //找到的文件的一些属性
);
如果找到下一个文件返回非零,如果找不到返回零
通过这两个函数我们可以遍历一个文件下的所有文件
- void findFile(string start)
- {
- //start 是遍历的目录,如要遍历D盘下test文件夹下的所有文件,那么start = "d:\\test";
- string strtemp;
- string token = ".";
- string tokend = "..";
- HANDLE hfile;
- WIN32_FIND_DATA fileDate;//WIN32_FIND_DATA结构描述了一个由FindFirstFile, FindFirstFileEx, 或FindNextFile函数查找到的文件信息
- DWORD errorcode = 0;
- hfile = FindFirstFileA((start + "\\*.*").c_str() ,&fileDate);
- //通过FindFirstFileA()函数,根据当前的文件存放路径查找该文件来把待操作文件的相关属性读取到WIN32_FIND_DATA结构中去
- while(hfile!= INVALID_HANDLE_VALUE && errorcode != ERROR_NO_MORE_FILES)
- {
- strtemp = fileDate.cFileName;
- bool flag = false;
- if((fileDate.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)&&(strtemp != token)&& (strtemp != tokend))
- {
- //如果当前文件是目录文件,则递归调用findFile
string strtemp;
string token = ".";
string tokend = "..";
HANDLE hfile;
WIN32_FIND_DATA fileDate;//WIN32_FIND_DATA结构描述了一个由FindFirstFile, FindFirstFileEx, 或FindNextFile函数查找到的文件信息
DWORD errorcode = 0;
hfile = FindFirstFileA((start + "\\*.*").c_str() ,&fileDate);
//通过FindFirstFileA()函数,根据当前的文件存放路径查找该文件来把待操作文件的相关属性读取到WIN32_FIND_DATA结构中去
while(hfile!= INVALID_HANDLE_VALUE && errorcode != ERROR_NO_MORE_FILES)
{
strtemp = fileDate.cFileName;
bool flag = false;
if((fileDate.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)&&(strtemp != token)&& (strtemp != tokend))
{
//如果当前文件是目录文件,则递归调用findFile
- flag = true;
- cout<<strtemp<<" is a direcotry"<<endl;
- findFile(start + "\\" + strtemp);
- }
- else
- cout<<strtemp<<endl;//打印文件名
- bool isNextFile = FindNextFileA(hfile,&fileDate);//判断该目录下是否还有文件
- if(flag == true && isNextFile == true)//如果还有文件,则调用SetLastError,设为NO_ERROR,这样才能继续遍历后面的文件
- SetLastError(NO_ERROR);
- else
- errorcode=GetLastError();
- }
- }