我正在使用GetDiskFreeSpaceExW

时间:2017-06-29 08:41:08

标签: c++ windows winapi diskspace

我正在使用

 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的磁盘的负值 我需要表示可用磁盘空间的准确值,以便用户可以在该磁盘上有足够空间的情况下录制电影。

2 个答案:

答案 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声明为diskFreeSpaceInKBUINT64

答案 1 :(得分:0)

尝试使用__int64的{​​{1}}瞬发。 如果是像1TB这样的大数字,则可能是问题,而负值则是经典信号。

1TB = 1.099.511.627.776字节

LONG_MAX = 2.147.483.647字节

See this