MFC删除空文件夹(含所有子文件夹)

2892 人浏览 | 时间: 2016-01-12 22:43:13 | 作者: codexia 会员文章,禁止转载

    我们在文章《MFC实现递归遍历文件夹内的所有文件夹和文件》已经实现了遍历文件夹下的所有文件和子文件夹。能够遍历,代表了我们可以逐一处理文件了。
    那么本文中,我们来在遍历的同时,实现删除空文件夹的功能。有了遍历的基础,那么本文就不再探讨遍历本身的技术细节了。我们这里主要讨论处理文件的细节。
    我们要删除空文件夹,是因为空文件夹既占用一点点空间,也很碍眼。如果我们一个个的去人工过滤一遍,就太麻烦了。那么这个就交给程序了。
    空文件夹就是文件夹中没有子文件夹,也没有文件的文件夹。当然要除开当前文件夹和上一级文件夹的特殊文件夹。为了统计被删除的空文件和临时文件夹的个数,我们使用了两个全局静态变量。代码如下:

int static iEmptyDir=0;
int static iTemp=0;
    在一个文件夹中,我们要统计子文件夹和文件的总数,所有设置了一个局部变量。当子文件夹为空文件夹时,将会被删掉。删掉之后,就要将上一级所记录的子文件夹和文件的个数减一。
    在遍历的时候,顺便将文件的路径存储在容器中,以便后续可以对文件进行处理。将文件添加到容器中,可以列出这个文件夹下的所有文件。
    下面是所有的代码:
int static iEmptyDir=0;
int static GetFilePath(vector<CString>& vFilePathList,CString strDir)
{
    int ifileCount=0;//当前文件夹下的文件夹和文件的个数
    CFileFind finder;
    BOOL hasFile = finder.FindFile(strDir+_T("*.*"));//总文件夹,开始遍历
    while(hasFile)
    {
        
        hasFile = finder.FindNextFile();//查找文件
        CString filename = finder.GetFilePath();//获取文件的路径,可能是文件夹,可能是文件
        if (!(finder.IsDirectory()))
        {
            ifileCount++;
            //如果是文件则加入文件列表
            vFilePathList.push_back(filename);//将一个文件路径加入容器
        }
        else
        {
            //递归遍历用户文件夹,跳过非用户文件夹
            if(!(finder.IsDots()||finder.IsHidden()||finder.IsReadOnly()))
            {
                ifileCount++;
                if(0==GetFilePath(vFilePathList,filename+_T("/")))//递归调用自己,返回这个文件夹的子文件夹和文件的个数(只有一级)
                {
                    //空文件夹
                    ::RemoveDirectory(filename);//删除空文件夹
                    iEmptyDir++;
                }
            }
        }
    }
    return ifileCount;
}
    我将整个函数都列出来了,你可以自由使用。可以根据自己的需要做一些处理。
当前文章为会员文章,请前往[用户中心]开通会员后继续阅读。

相关阅读