remove、rmdir和DeleteFile、RemoveDirectory的效率

转载来自:https://blog.csdn.net/jszj/article/details/86621571

vs2015 mfc写了一个小工具,用于删除目录中少于指定个数的文件夹,比如有目录 1、2、3、4,里面的文件个数分别是6、7、8、9,现在要删除文件个数少于8的目录,那就是要把1、2两个目录删除。逻辑是对这些目录一个一个处理,对每个目录是先搜索其中的文件个数,如果发现小于指定个数,则此目录要进行删除。

在对目录中的文件进行搜索时,会把这些文件都放到一个vector<CString> vecFileName中,这样在删除时,就不用再另外搜索一遍了。

删除代码如下:

// vecFileName就是当前目录下的文件列表
// strWPath就是当前目录的绝对路径,即少于指定个数文件的目录,是要被删除掉的
while (vecFileName.size())
{
  strText = strWPath + vecFileName[0];
  if (_tremove(strText.GetString()) == -1)
    return false;
  vecFileName.erase(vecFileName.begin());
}

strText = strWPath;
if (_trmdir(strText.GetString()) == -1)
  return false;

通过测试发现,这个删除的速度相当缓慢,一个目录里只有3个文件,一秒钟大概只能删除2、3个这样的目录,我有10万个文件夹需要遍历,这样的速度要等到猴年马月了

然后去查找windows api,修改代码如下:

// vecFileName就是当前目录下的文件列表
// strWPath就是当前目录的绝对路径,即少于指定个数文件的目录,是要被删除掉的
while (vecFileName.size())
{
  strText = strWPath + vecFileName[0];
  if (!DeleteFile(strText))
    return false;
  vecFileName.erase(vecFileName.begin());
}

strText = strWPath;
if (!RemoveDirectory(strText))
  return false;

和第一段代码相比,只是替换了两个删除文件和目录的函数,然后再测试,发现删除速度大大提高,估计一秒钟可以删除20个(因为我测试的目录只有几十个,而且其中要删除的也只是少数(估计有20个左右),所以整个过程瞬间完成)。

如此看来,windows api的效率要比c接口高出许多。当然我是先用c接口测试,然后再用windows api测试的,也许会因为windows的缓存策略导致后面的文件读取速度大于开始的文件读取速度,但我估计在这个测试中这个策略对测试结果的影响不大

posted @ 2021-12-31 10:37  冰糖葫芦很乖  阅读(200)  评论(0编辑  收藏  举报