我正在使用 GetDiskFreeSpaceExW
I am using 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 的磁盘,returns 负值。
我需要表示可用磁盘 space 的准确值,以便用户可以在该磁盘上有足够的 space 时录制电影。
尝试使用 long int
的 __int64
瞬间。
如果是像 1TB 这样的大数字,那可能就是问题所在,负值是典型的信号。
1TB = 1.099.511.627.776 字节
LONG_MAX = 2.147.483.647 字节
我看到你输入了 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>
。
我正在使用
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 的磁盘,returns 负值。
我需要表示可用磁盘 space 的准确值,以便用户可以在该磁盘上有足够的 space 时录制电影。
尝试使用 long int
的 __int64
瞬间。
如果是像 1TB 这样的大数字,那可能就是问题所在,负值是典型的信号。
1TB = 1.099.511.627.776 字节
LONG_MAX = 2.147.483.647 字节
我看到你输入了 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>
。