一、先介绍一个结构 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 ]; // 文件的可选名
} WIN32_FIND_DATA;
可以通过 FindFirstFile ()函数,根据文件路径把待操作文件的相关属性读取到 WIN32_FIND_DATA 结构中去:
四、下面是遍历代码
#include<windows.h>
#include<iostream>
#include<string>
using namespace std;
//只能处理目录:lpPath只能是路径
void find(char *lpPath)
{
char szFind[MAX_PATH];
char szFile[MAX_PATH];
WIN32_FIND_DATA FindFileData;
strcpy(szFind,lpPath);
strcat(szFind,"//*.*");
HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind) return;
while(TRUE)
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(FindFileData.cFileName[0]!='.')
{
strcpy(szFile,lpPath);
strcat(szFile,"//");
strcat(szFile,FindFileData.cFileName);
find(szFile);
}
}
else
{
cout<<FindFileData.cFileName<<endl;
}
if(!FindNextFile(hFind,&FindFileData))
break;
}
FindClose(hFind);
}
//可同时处理目录和文件:path可以是路径,也可以是文件名,或者文件通配符
void _find(string path)
{
//取路径名最后一个"//"之前的部分,包括"//"
string prefix=path.substr(0,path.find_last_of('//')+1);
WIN32_FIND_DATA FindFileData;
HANDLE hFind=::FindFirstFile(path.c_str(),&FindFileData);
if(INVALID_HANDLE_VALUE == hFind)
{
cout<<"文件通配符错误"<<endl;
return;
}
while(TRUE)
{
//目录
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
//不是当前目录,也不是父目录
if(FindFileData.cFileName[0]!='.')
{
//查找下一级目录
_find(prefix+FindFileData.cFileName+'//'+"*.*");
}
}
//文件
else
{
cout<<FindFileData.cFileName<<endl;
}
if(!FindNextFile(hFind,&FindFileData))
break;
}
FindClose(hFind);
}
void main()
{
find("E:");//目录:E盘
_find("E://*.*");//E盘下所有文件
string str=".//";
string path;
cout<<"请输入文件通配符:"<<flush;
cin>>path;
str=str+path;
find((char*)str.c_str());//可以处理".",".." 不可以处理"*","..//*"
_find(str);//可以处理"*","..//*" 不可以处理".",".."
}
WIN32_FIND_DATA ffd;
HANDLE hFind = FindFirstFile("c://test.dat",&ffd);
二、函数 FindFirstFile
1 、声明 : HANDLE FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData);
2 、参数 :
lpFileName String ,欲搜索的文件名。可包含通配符,并可包含一个路径或相对路径名
lpFindFileData WIN32_FIND_DATA ,一个 WIN32_FIND_DATA 指针, 用于装载与找到的文件有关的信息,该结构可用于后续的搜索
3 、返回值 :
如执行成功,返回一个搜索句柄。如果出错,返回一个 INVALID_HANDLE_VALUE 常数,一旦不再需要,应该用 FindClose 函数关闭这个句柄
4 、功能
读取文件信息到一个 WIN32_FIND_DATA 结构中,返回这个文件的句柄
5 、注释:
由这个函数返回的句柄可以作为一个参数用于 FindNextFile 函数。这样一来,就可以方便的枚举出与 lpFileName 参数指定的文件名相符的所有文件(是指文件名含有通配符)
三、函数 FindNextFile
1 、声明 BOOL FindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData);
2 、参数 :
HANDLE hFindFile 搜索的文件句柄,函数执行的时候搜索的是此句柄的下一文件
LPWIN32_FIND_DATA lpFindFileData 一个 WIN32_FIND_DATA 指针,
3 、返回值 :
如果调用成功返回一个非 0 值;调用失败,返回为 0 ,可调用 GetLastError 来获取错误信息
4 、功能
继续查找 FindFirstFile 函数搜索后的文件
5 、注释:
这个函数可以连续调用,以方便的枚举出与 lpFileName 参数指定的文件名相符的所有文件