那么本文中,我们来在遍历的同时,实现删除空文件夹的功能。有了遍历的基础,那么本文就不再探讨遍历本身的技术细节了。我们这里主要讨论处理文件的细节。
我们要删除空文件夹,是因为空文件夹既占用一点点空间,也很碍眼。如果我们一个个的去人工过滤一遍,就太麻烦了。那么这个就交给程序了。
空文件夹就是文件夹中没有子文件夹,也没有文件的文件夹。当然要除开当前文件夹和上一级文件夹的特殊文件夹。为了统计被删除的空文件和临时文件夹的个数,我们使用了两个全局静态变量。代码如下:
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;
}
我将整个函数都列出来了,你可以自由使用。可以根据自己的需要做一些处理。