MFC实现递归遍历文件夹内的所有文件夹和文件

[摘要] 为了简化自己的工作,所以就用MFC快速做了递归遍历文件夹内所有文件夹和文件的功能。因为这个功能非常实用,非常有必要总结出来供大家参考。

使用MFC实现遍历一个文件夹下的所有目录和文件,使用CFileFind类即可。然而要得到一个文件夹下的所有文件,包括子文件夹下的所有文件,就要使用递归了。当然,不一定非得是递归,也可以用循环。只不过使用递归实现比较简单罢了。
    使用CFileFind类来遍历,实际上就是调用成员函数FindFile找到一个头,然后循环调用成员函数FindNextFile来枚举文件夹下的所有文件和文件夹。在文件夹中,包含了各种你没有看到的文件夹,如当前文件夹.和上一级文件夹..,以及隐藏的卷目录等等。而我们只是遍历用户目录,所以要将这些目录排除掉。
    下面是判断找到的文件的类型的函数,其中,文件夹也是文件的一种,所以文件夹也是文件哦。CFileFind类中判断文件类型的成员函数如下:
IsDots():判断文件是否为当前目录.或者为上级目录..
IsHidden():判断文件是否带有隐藏属性,即隐藏的文件。
IsSystem():判断文件是否为系统文件。
IsTemporary():判断文件是否为临时文件。
IsReadOnly():判断文件是否为只读文件。
IsDirectory():判读文件是否为文件夹。
    当然,还有其他几个,就不再列举说明了。你可以查看MSDN来看其他的成员函数说明。这些文件是我们需要过滤的,不是我们的文件类型,不应该列入我们遍历得到的文件列表中。
    只要找到的文件不为空,表示是有效的文件,如果找到的文件是空,表示遍历完毕。我们使用递归遍历,就是在找到文件夹的时候,马上就去遍历文件夹,使用的是深度优先遍历方式。
    我们使用一个vector容器,来存储遍历得到的文件的路径。如果得到的是文件的路径,就直接进入容器存储起来,如果是文件夹,则作为递归传入的子文件夹的路径,来遍历子文件夹。递归的关键就是需要一个终止条件,否则无限递归则会导致栈崩溃。我们的终止条件就是循环中遍历文件结束,返回空,从而结束循环,退出一级目录,继续上一级目录,如此可以终结递归。
    我已经将递归遍历代码封装为一个函数,可以直接使用。代码如下:

void GetFilePath(vector<CString>& vFilePathList,CString strDir) 
{ 
    CFileFind finder; 
    BOOL isNotEmpty = finder.FindFile(strDir+_T("*.*"));//总文件夹,开始遍历 
    while(isNotEmpty) 
    { 
        isNotEmpty = finder.FindNextFile();//查找文件 
        CString filename = finder.GetFilePath();//获取文件的路径,可能是文件夹,可能是文件 
        if (!(finder.IsDirectory())) 
        { 
            //如果是文件则加入文件列表 
            vFilePathList.push_back(filename);//将一个文件路径加入容器 
        } 
        else 
        { 
            //递归遍历用户文件夹,跳过非用户文件夹 
            if(!(finder.IsDots()||finder.IsHidden()||finder.IsSystem()||finder.IsTemporary()||finder.IsReadOnly())) 
            { 
                GetFilePath(vFilePathList,filename+_T("/")); 
            } 
        } 
    } 
}
    如果你想改函数的名称,记得将函数里递归的调用名字一起改。还可以自己加入其它的文件类型判断,去掉不想过滤的文件类型。不过基本骨架就是这样的。各种实现方式都差不多,基于这个结构可以写出各种版本的,比如C/C++语言版的直接调用API,MFC版本,QT版本,Java版本,各种版本无非就是包装了API的工作方式,没什么。搞懂了这个流程,各种版本你也会写了。


  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法哥2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值