加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

WIN32 C++ 遍历文件夹

发布时间:2020-12-14 02:35:53 所属栏目:Windows 来源:网络整理
导读:转自:http://blog.csdn.net/lizhigang770/archive/2010/11/30/6045242.aspx ? 一、先介绍一个结构 WIN32_FIND_DATA typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; // 文件属性 FILETIME ftCreationTime; // 文件创建时间 FILETIME ftLastAcce

转自:http://blog.csdn.net/lizhigang770/archive/2010/11/30/6045242.aspx

?

一、先介绍一个结构 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 参数指定的文件名相符的所有文件

?

其它参考文献:http://www.cnblogs.com/summerRQ/articles/2375749.html

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读