я использую
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) ;
Это возвращает отрицательное значение для диска емкостью более 1 ТБ.
Мне нужно точное значение, представляющее доступное дисковое пространство, чтобы пользователь мог записать фильм, если на этом диске достаточно места.
Я вижу, ты напечатал 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 = Объединение, в котором хранится 64-разрядное целое число без знака.
Теперь посмотрим, что ты сделал.
diskFreeSpaceInKB = static_cast<long int>(m_uliTotalNumberOfFreeBytes.QuadPart/ONE_KB_IN_BYTES)
В Windows int
/long
/long int
всегда signed 32-bit
независимо от того, компилируете ли вы 32-битную или 64-битную сборку, потому что Windows использует Модель LLP64. Так что в основном вы бросаете unsigned 64-bit integer
деленное на ONE_KB_IN_BYTES
к signed 32-bit integer
,
Так почему я получаю отрицательное число?
Потому что значение превышает максимальное положительное значение подписанного типа данных.
Как это исправить?
декларировать diskFreeSpaceInKB
как UINT64
, а также static_cast<UINT64>
,
Попробуй использовать __int64
мгновение long int
,
Если с большими числами, такими как 1 ТБ, это может быть проблемой, и отрицательные значения являются классическим сигналом этого.
1 ТБ = 1,099,511,627,776 байт
LONG_MAX = 2,147,483,647 байт