2017-06-29 86 views
-4

我使用我使用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的磁盘返回负值。
我需要这些可用的磁盘空间,使得用户可以记录一个电影如果存在磁盘空间不足的准确值。

+1

能否请你告诉你的代码? – KimKulling

+0

该函数返回什么_exact_值?请以十六进制显示值。 –

+0

UGS ::系统:: SYSS_GetDiskFreeSpaceEx( 的getLocation()c_str(),//目录名 &iFreeBytesAvailable, &iTotalNumberOfBytes, &iTotalNumberOfFreeBytes ); diskFreeSpaceInKB = static_cast (iTotalNumberOfFreeBytes.QuadPart/ONE_KB_IN_BYTES); – Divya

回答

3

我看到你输入diskFreeSpaceInKB = static_cast<long int>...,所以我认为diskFreeSpaceInKBlong 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_BYTESsigned 32-bit integer

那么,为什么我得到负数?

因为该值超过签名的数据类型的最大正值。

如何解决?

声明diskFreeSpaceInKBUINT64static_cast<UINT64>

+0

一旦你确定了声明,我认为你不需要演员。 –

0

尝试使用__int64瞬间long int。 如果像1TB这样的大数字,那可能是问题,而负值是一个典型的信号。

1TB = 1.099.511.627.776字节

LONG_MAX = 2.147.483.647字节

See this