本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《
阿里云开发者社区用户服务协议
》和
《
阿里云开发者社区知识产权保护指引
》。如果您发现本社区中有涉嫌抄袭的内容,填写
侵权投诉表单
进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
一、先介绍一个结构
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
结构中去:
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
参数指定的文件名相符的所有文件
四、下面是遍历代码
#include<windows.h>
#include<iostream>
#include<string>
using namespace std;
//只能处理目录:lpPath只能是路径
find(char * lpPath)
{
char szFind[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;
}
if(!FindNextFile(hFind,&FindFileData))
break;
}
FindClose(hFind);
}