2017-06-29 55 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