我使用GetDiskFreeSpaceExW
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的磁盘返回负值。
我需要这些可用的磁盘空间,使得用户可以记录一个电影如果存在磁盘空间不足的准确值。
我看到你输入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_INTEGER
ULARGE_INTERGER = An union that stores a 64-bit unsigned integer
现在,让我们看看你做了什么。
diskFreeSpaceInKB = static_cast<long int>(m_uliTotalNumberOfFreeBytes.QuadPart/ONE_KB_IN_BYTES)
在Windows中,int
/long
/long int
总是signed 32-bit
无论你正在编译32位或64位的建设,因为Windows使用LLP64 model。所以基本上你会把unsigned 64-bit integer
除以ONE_KB_IN_BYTES
到signed 32-bit integer
。
那么,为什么我得到负数?
因为该值超过签名的数据类型的最大正值。
如何解决?
声明diskFreeSpaceInKB
为UINT64
和static_cast<UINT64>
。
一旦你确定了声明,我认为你不需要演员。 –
尝试使用__int64
瞬间long int
。 如果像1TB这样的大数字,那可能是问题,而负值是一个典型的信号。
1TB = 1.099.511.627.776字节
LONG_MAX = 2.147.483.647字节
能否请你告诉你的代码? – KimKulling
该函数返回什么_exact_值?请以十六进制显示值。 –
UGS ::系统:: SYSS_GetDiskFreeSpaceEx( 的getLocation()c_str(),//目录名 &iFreeBytesAvailable, &iTotalNumberOfBytes, &iTotalNumberOfFreeBytes ); diskFreeSpaceInKB = static_cast(iTotalNumberOfFreeBytes.QuadPart/ONE_KB_IN_BYTES); –
Divya