最近在做项目,有个需求是测硬盘剩余空间,并进行预测的。
通常情况下是用GetDiskFreeSpaceEx这个API。
但是问题来了,在测试过程中,我模拟了一个硬盘大小是100MB,然后添加了一个200MB的文件,按照道理应该会提示空间不足。奇怪的事情发生了,这一步被跳过了…
思考了一会,我一度以为是我设计出了问题,排查着问题,突然我想起了以前看过了一个开源对size_t的处理方法以及作者对这段处理的解释。我知道问题所在了,size_t跟DWORD都是无符号类型,我在业务逻辑是这样处理的
DWORD free=xxx;
for(...)
{
free-=use[];
if(free<0)
{
Tip;
return;
}
}
咋一看逻辑上莫得问题,但是DWORD是个无符号类型,那么问题就来了,无符号类型会得到小于0的结果吗?答案必然是不会。以下是一段测试代码,如果大家无法理解可以自己去编译运行下以下的代码
DWORD a = 10;
DWORD b = 11;
if (a - b > 0)
{
std::cout << "测试1 a>b?";
}
else
std::cout << "测试2 a<b?";
运行结果是测试1 a>b为什么呢?其实主要是因为DWORD,本质看a<b,所以可能第一感觉就是a-b<0但是由于a,b所属类型为无符号类型,所以得出结果是-1的补码4294967295,对于这种问题,解决方案需要进行变化
DWORD free=xxx;
for(...)
{
if(free>=use[])
{
free-=use[];
}
else
{
tip;
return;
}
}
处理方式就是这么简单!得不出<0但是可以先对比啊!对比完了如果剩余空间比需要占用的空间大那么就预留空间进行下一个空间预留计算,如果空间不足,那就提示,不得不说那段代码给了我排bug提供了一个很大帮助。