用CfileFind递归搜索目录

【UE 反射】反射的原理是什么?如何使用机制? 静态类型检查确保了类型的早期一致性和高效的代码执行,但减少了灵活性。动态类型检查提供了更大的灵活性,但增加了运行时的开销和潜在的错误。反射作为一种动态特性,无论是在静态类型语言还是动态类型语言中,都提供了强大的运行时类型操作能力,但也伴随着性能和安全性方面的权衡。通过理解这些联系,开发者可以在不同的编程语言和应用场景中选择适合的类型检查方式和反射机制,以实现所需的动态行为和灵活性,同时保证性能和安全性。 阅读详情
我们知道CfileFind未提供直接遍历其子目录的功能,而有时候我们却常常要遍历某一目录下的所有文件及其子目录。如我们要删除一个目录,而这个目录下又有子目录,因为Windows不允许删除非空的目录,因此我们必须能够遍历一个目录下的所有子目录,这可以通过简单的递归实现.

  下面让我们从一个简单的例子开始:如何删除某一目录?(假设我们通过DeleteDirectory(LPCTSTR DirName)函数完成这一功能)

  要删除一个目录,我们要完成下面几步:

  1. 删除该目录下的所有文件

  2. 如果该目录中还有子目录我们要递归地调用DeleteDirectory(LPCTSTR DirName)函数,以删除该子目录下的所有文件

  3. 调用RemoveDirectory(LPCTSTR lpPathName)删除该目录

DeleteDirectory(LPCTSTR DirName)函数的完整实现如下:
BOOL DeleteDirectory(LPCTSTR DirName)
{
CFileFind tempFind; file://声明一个CFileFind类变量,以用来搜索
char tempFileFind[200]; file://用于定义搜索格式
sprintf(tempFileFind,"%s//*.*",DirName);
file://匹配格式为*.*,即该目录下的所有文件

BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
file://查找第一个文件
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile(); file://递归搜索其他的文件
if(!tempFind.IsDots()) file://如果不是"."目录
{
char foundFileName[200];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200));
if(tempFind.IsDirectory()) file://如果是目录,则递归地调用
{ file://DeleteDirectory
char tempDir[200];
sprintf(tempDir,"%s//%s",DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{ file://如果是文件则直接删除之
char tempFileName[200];
sprintf(tempFileName,"%s//%s",DirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
tempFind.Close();
if(!RemoveDirectory(DirName)) file://删除目录
{
AfxMessageBox("删除目录失败!",MB_OK);
return FALSE;
}
return TRUE;
}


  通过上面的例子,详细读者已学会了如何递归遍历某一目录下的所有文件及子目录了。实际上利用这一点可以作出非常有用的工具。下面我给大家举个小例子。

  用VC编写程序的时候,VC会生成一大堆的中间文件,这些中间文件的体积十分庞大,一般比我们编写的代码要大出10倍以上。当我们想要把我们编写的源代码保留起来,以供以后查阅时,我们不得不手动删除这些中间文件,而有些时候,你想查看以前某个工程的运行结果,于是你编译该工程,经常这样做的话,如果你不删除VC生成的中间文件,你的硬盘很快就会被一大堆的中间文件塞满。于是我编写了一个VC的中间文件清理工具。其原理非常简单:

  首先,让用户指定一个需要清理的目录,然后我们通过CFileFind递归地遍历该目录,查找目录名为Debug和Release的目录(这是VC默认的输出目录,如果你更改了缺省设置的话,必须手动删除之),然后调用上面我们编写的DeleteDirectory函数删除之。

  另外,本工具也能统计源程序的规模(给出整个工程的行数、c文件数、h文件数和cpp文件数及总的文件数目),你可以用它方便地统计出自己源程序的规模。统计源程序规模的原理也是递归地查找某一目录,其原理和上面讲的DeleteDirestory函数是一致的。
 
UE 动态获取 资源缩略图 下载到本地或返回图片信息 UE 动态加载资源缩略图 返回图片信息或保存到本地 阅读详情

相关推荐

CFileFind搜索目录下所有文件的类

/** ===================================================== 功能: CFolderContent类搜索一个目录, 列出该目录下的所有目录名称,列出所有子目录下的文件名称等属性。 作者: jef 作者邮箱: dungeonsnd@126.com 发步时间: 20100311 版本: v1.1 版权: 请遵循GNU. 对外接口: int GetAllSub(CString csPath) csPath: 一个目录或者一个完整的文件名 使用举例: void CGetFolderContentView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CString cs,csSaveFileName,csFileSave,csT,csT1; cs ="C:\\Documents and Settings\\All Users\\Documents\\My Music"; char chModule[8192]; memset(chModule,0,8192); GetModuleFileName(NULL,chModule,8192); csT.Format("%s",chModule); csT =csT.Left( csT.ReverseFind(_T('\\')) ); csSaveFileName =csT+_T("\\FolderContent输出文件.txt"); CRect rtClient; GetClientRect(&rtClient); CClientDC dc(this); dc.SetTextColor(RGB(200,80,80)); dc.FillSolidRect(rtClient,RGB(240,240,240)); CFolderContent fc; fc.GetAllSub(cs); int i,len,k; csT ="-------"; csT =cs+"总大小为"; csT1.Format(" %.4fMB,清单文件已保存在 %s",fc.m_dTotalSize/double(1024*1024),csSaveFileName); csT +=csT1; csT +="-------"; dc.TextOut(5,0,csT); csFileSave +=csT+_T("\r\n"); csT ="-------"; csT +="所有子目录如下:"; csT +="-------"; dc.TextOut(5,25,csT); csFileSave +=csT+_T("\r\n"); len =fc.m_Directory.GetSize(); for (i=0;i<len;i++) { csT.Format(" 大小:%.4fMB",fc.m_vecDirectorySize[i]/double(1024*1024)); csT1.Format(" 创建时间:%d年%d月%d日 ", fc.m_vecFileLastCreationTime[i].wYear, fc.m_vecFileLastCreationTime[i].wMonth, fc.m_vecFileLastCreationTime[i].wDay); csT =csT+csT1; csT =fc.m_Directory.GetAt(i)+csT; dc.TextOut(5,(i+2)*20,csT); csFileSave +=csT+_T("\r\n"); } k =i; csT ="-------"; csT +="所有文件如下:"; csT +="-------"; dc.TextOut(5,(k+3)*20,csT); csFileSave +=csT+_T("\r\n"); len =fc.m_PathNameExt.GetSize(); for (i=0;i<len;i++) { csT.Format(" 大小:%.4fMB",fc.m_vecFileSize[i]/double(1024*1024)); csT1.Format(" 修改时间:%d年%d月%d日 ", fc.m_vecFileLastWriteTime[i].wYear, fc.m_vecFile

CFileFind类的使用总结

1、CFileFind类的声明文件保存在afx.h头文件中。2、该类的实现的功能:执行本地文件的查找(查找某个具体的文件,查找某类文件x*.x*,查找所有文件.)3、CFileFind类是CGopherFileFind和CFtpFileFind类的基类。4、CFileFind类的构造函数::CFileFind()和关闭函数::Close()我会成对使用。5、CFileFind类的成员函数我根据其操作

caimagic的专栏 1518

CFileFind类遍历目录,查找目录内文件

目录树遍历顾名思义就是把目录树中所有的目录及文件依次查找一遍,WINDOWS里的文件查找程序和 SafeClean Utilities(环保卫士)等都用到了目录树遍历。我们当然也可以在自己的程序中加入这一功能。 下面就是该算法的源代码。代码不长,应该很好懂。大家只要在工程中添加一个 Search 类再将代码拷贝 到文件中就可以了。调用时用如下代码: Search find("c:/", "*.exe"); find.Start(); 按 F5 运行后 可以在调试信息窗口看到输出,如有不妥之处还望各位来信指教。

CFileFind类的详解以及应用实例

CFileFind类在afx.h头文件中声明。 功能:执行本地文件的查找,支持通配符。 类的成员函数: 1、查找操作类: 1 //搜索目录下指定的文件,成功返回非0。第二个参数不必理会2 virtual BOOL FindFile(LPCTSTR pstrName = NULL,DWORD dwUnused = 0); 3 vir...

dinggujiao8462的博客 354

CFileFind用法总结

CFileFind用法总结 CFileFind用法总结 注意:CFileFind 在使用时,使用绝对路径,查找Log文件夹下的.log文件 注意: 最后用\\ ,只用\两个时,找不到 CString strd = L"E:\\wokspace\\PROJECT\code_c\\bin\\Log\\\\*.log"; bool bfind = finder.FindFile(strd);// *.txt不能遍历 ...

u012719076的博客 1016

CFileFind的完整用例

 CFileFind finder; BOOL bFind = finder.FindFile(strFilePath); while (bFind) { bFind = finder.FindNextFile(); VString strSubPath = finder.GetFilePath(); VString strFileName = finder.GetFileName(); if (finder.IsDots() || finder.IsHidden())

clwahaha的专栏 1358

VC++中用内存映射文件&用CfileFind递归搜索目录

VC++中用内存映射文件 粟利民·电脑报   在软件的开发过程中,有时需要控制一些程序使他们不能同时运行,也就是多个程序间互斥运行(还包括禁止同一程序运行多个实例)。针对这一问题,我们在 Visual C++6.0中利用内存映射文件实现了多个程序间的互斥运行。内存映射文件可以创建一个没有和磁盘文件相联系的内存对象,将文件的信息映射 到一个进程的地址空间上,我们可以访问该文件中的数据,就如同它位于

Chinawash 专栏 2284

CfileFind递归搜索目录 (转)

CfileFind递归搜索目录 (转)[@more@]我们知道CfileFind未提供直接遍历其子目录的功能,而有时候我们却常常要遍历某一目录下的所有文件及其子目录。如我们要删除一个目录,而这个目录下又有子目录,因为windo...

csd3176的博客 130

CFileFind递归搜索目录

  我们知道CFileFind未提供直接遍历其子目录的功能,而有时候我们却常常要遍历某一目录下的所有文件及其子目录。如我们要删除一个目录,而这个目录下又有子目录,因为Windows不允许删除非空的目录,因此我们必须能够遍历一个目录下的所有子目录,这可以通过简单的递归实现.   下面让我们从一个简单的例子开始:如何删除某一目录?(假设我们通过DeleteDirectory(LPCTSTR DirNa...

straw hat in the wind 168

CfileFind递归搜索目录(包括子目录

CfileFind递归搜索目录   2001-07-04· ·许福··yesky   我们知道CfileFind未提供直接遍历其子目录的功能,而有时候我们却常常要遍历某一目录下的所有文件及其子目录。如我们要删除一个目录,而这个目录下又有子目录,因为Windows不允许删除非空的目录,因此我们必须能够遍历一个目录下的所有子目录,这可以通过简单的

tzmyf234的专栏 1109

CFileFind类成员函数IsDots, IsDirectory

IsDots判断是否为点-- IsDirectory表明这是一个目录, isDots表明这个是.或者…而这两个东西虽然是目录,但是一个表明这个目录本身,一个代表上层目录(但是根目录下面…也是本身) 此时由CFileFind对象引用IsDirectory表明当前的CFileFind对象是否为目录。 这个要说明一下,用过Dos的话,就应该知道,每个目录下都有缺省的两个目录,名称分别为 '. '和 '…...

qq_36633275的博客 1727

CFileFind类实现的目录树遍历

2000年09月22日 08:59:00 用CFileFind类实现的目录树遍历作者:崔晓亮目录树遍历顾名思义就是把目录树中所有的目录及文件依次查找一遍,WINDOWS里的文件查找程序和 SafeClean Utilities(环保卫士)等都用到了目录树遍历。我们当然也可以在自己的程序中加入这一功能。 下面就是该算法的源代码。代码不长,应该很好懂。大家只要在工程中添加一个 Search

秦梦瑶的专栏 297

C++ Windows 获取目录下(包含子目录)所有文件夹

void Recurse(wstring& strPath) { CFileFind finder; // build a string with wildcards strPath += L"\\*.*"; // start working for files BOOL bWorking = finder.FindFile(strPath.c_str()); while (bWorking) { bWorking = finder.FindNextFile(); /.

qiuxue110的专栏 793

统计文件夹和文件个数的递归算法二

int m_iFolder;//文件夹数int m_iFile;//文件数void CCountFileDlg::SearchFolder(CString path){    if(SetCurrentDirectory(path) == TRUE)    {        CFileFind finder;        BOOL bWorking = finder.FindFile(

genius52的专栏 792

VC中遍历指定目录中的所有文件和文件夹

 CFileFind ff; CString FilePath; if (root.Right(1)!="//") {  root+="//"; } root+="*.*"; BOOL res=ff.FindFile(root); while (res) {  res=ff.FindNextFile();  FilePath=ff.GetFilePath();  if (ff.IsDirector

點煙 973

MFC文件遍历类CFileFind例程

参考资料:http://blog.csdn.net/dodream/archive/2007/07/10/1684446.aspx文中对CFileFind类有很详细的介绍,本文主要介绍CFileFind使用的一个具体例程。void CDicomViewerDlg::OnBnClickedButtonFindfile(Cstring root)//实现对文件的遍历{ CFil

flywithmj的专栏 1131

小米用户画像实战.pdf

小米用户画像实战

上一篇: Visual C++编程技巧(二)
下一篇: 如何在VC5下定制多媒体真彩封页
virtualboy
博客等级 码龄25年 2粉丝 12原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值