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的缓存策略导致后面的文件读取速度大于开始的文件读取速度,但我估计在这个测试中这个策略对测试结果的影响不大