remove、rmdir和DeleteFile、RemoveDirectory的效率

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值