打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VC遍历文件夹下所有文件和文件夹
一、先介绍一个结构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参数指定的文件名相符的所有文件
1.使用网上最普通的方法
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);
}
2.利用CFileFind类较简洁的实现该功能
void CModelDlg::FindBmpFile(CString strFoldername)
{
CString m_cstrFileList="";
CFileFind tempFind;
BOOL bFound; //判断是否成功找到文件
bFound=tempFind.FindFile(strFoldername + "\\*.*"); /修改" "内内容给限定查找文件类型
CString strTmp; //如果找到的是文件夹存放文件夹路径
while(bFound) //遍历所有文件
{
bFound=tempFind.FindNextFile(); //第一次执行FindNextFile是选择到第一个文件,以后执行为选择
//到下一个文件
if(!tempFind.IsDots()) continue; //如果找到的是返回上层的目录 则结束本次查找
if(tempFind.IsDirectory()) //找到的是文件夹,则遍历该文件夹下的文件
{
strTmp="";
strTmp=tempFind.GetFilePath();
FindFile(strTmp);
}
else
{
strTmp=tempFind.GetFileName(); //保存文件名,包括后缀名
// 在此处添加对找到文件的处理
}
}
tempFind.Close();
return;
}
=====================================================================
void find(char *lpPath)
{
char szFind[MAX_PATH];
char szFile[MAX_PATH];
CString info;
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
{ //deal with FindFileData.cFileName
}
if(!FindNextFile(hFind,&FindFileData)) break;
}
FindClose(hFind);
}
发现有很多优化软件 在做删除 系统冗余文件时 会把LJ文件的名字 显示在一个列表中 供用户删除.这 就用到了遍历文件夹下所有文件的技术了. 对此函数说明如下:
Call this member function to open a file search.
virtual BOOL FindFile(
LPCTSTR pstrName = NULL,
DWORD dwUnused = 0
);
After calling FindFile to begin the file search, call FindNextFile to retrieve subsequent files. You must call FindNextFile at least once before calling any of the following attribute member functions:
说的是此函数用于开始一个文件查找,当查找到之后,可以调用FindNextFile连续得查找一组文件
=============================
#include <afxwin.h>
#include <iostream>
using namespace std;
void Recurse(LPCTSTR pstr)
{
CFileFind finder;
// build a string with wildcards
CString strWildcard(pstr);
strWildcard += _T("\\*.*");
// start working for files
BOOL bWorking = finder.FindFile(strWildcard);
while (bWorking)
{
bWorking = finder.FindNextFile();
// skip . and .. files; otherwise, we'd
// recur infinitely!
if (finder.IsDots())
continue;
CString sFileName = finder.GetFileName();
cout << (LPCTSTR)sFileName << endl;//输出查找文件夹下的所有文件名
}
finder.Close();
}
int main()
{
if (!AfxWinInit(GetModuleHandle(NULL), NULL, GetCommandLine(), 0))//初始化MFC
cout << "panic!" << endl;
else
Recurse(_T("C:"));
return 0;
}
以上来自http://hi.bccn.net/space-290696-do-blog-id-13874.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
VC 遍历指定目录下的文件
使用FindFirstFile,FindNextFile遍历一个文件夹
文件遍历
FindFirstFile的正确用法
用递归写Win32的文件夹遍历
一段简单的C/C++病毒源程序
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服