我正在使用
if( !GetDiskFreeSpaceEx(
lpDirectoryName, // directory name
&m_uliFreeBytesAvailable, // bytes available to caller
&m_uliTotalNumberOfBytes, // bytes on disk
&m_uliTotalNumberOfFreeBytes) ) // free bytes on disk
return false;
else
diskFreeSpaceInKB = static_cast<long int>(m_uliTotalNumberOfFreeBytes.QuadPart/ONE_KB_IN_BYTES) ;
返回容量大于1TB的磁盘的负值 我需要表示可用磁盘空间的准确值,以便用户可以在该磁盘上有足够空间的情况下录制电影。
答案 0 :(得分:4)
我看到您输入了master
,因此我认为diskFreeSpaceInKB = static_cast<long int>...
是diskFreeSpaceInKB
变量。
首先,让我们看看long int
原型。
GetDiskFreeSpaceEx
BOOL WINAPI GetDiskFreeSpaceEx(
_In_opt_ LPCTSTR lpDirectoryName,
_Out_opt_ PULARGE_INTEGER lpFreeBytesAvailable,
_Out_opt_ PULARGE_INTEGER lpTotalNumberOfBytes,
_Out_opt_ PULARGE_INTEGER lpTotalNumberOfFreeBytes
);
=指向PULARGE_INTEGER
ULARGE_INTERGER = An union that stores a 64-bit unsigned integer
现在让我们看看你做了什么。
ULARGE_INTEGER
在Windows中,diskFreeSpaceInKB = static_cast<long int>(m_uliTotalNumberOfFreeBytes.QuadPart/ONE_KB_IN_BYTES)
/ int
/ long
始终为long int
,无论您是否正在编译32位或64位版本,因为Windows使用{{ 3}}。所以基本上你将signed 32-bit
除以unsigned 64-bit integer
再加上ONE_KB_IN_BYTES
。
为什么我会得到负数?
因为该值超过了签名数据类型的最大正值。
如何解决?
将signed 32-bit integer
声明为diskFreeSpaceInKB
,UINT64
。
答案 1 :(得分:0)
尝试使用__int64
的{{1}}瞬发。
如果是像1TB这样的大数字,则可能是问题,而负值则是经典信号。
1TB = 1.099.511.627.776字节
LONG_MAX = 2.147.483.647字节