Я использую 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)  ;

Это возвращает отрицательное значение для диска емкостью более 1 ТБ.
Мне нужно точное значение, представляющее доступное дисковое пространство, чтобы пользователь мог записать фильм, если на этом диске достаточно места.

-5

Решение

Я вижу, ты напечатал 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>,

4

Другие решения

Попробуй использовать __int64 мгновение long int,
Если с большими числами, такими как 1 ТБ, это может быть проблемой, и отрицательные значения являются классическим сигналом этого.

1 ТБ = 1,099,511,627,776 байт

LONG_MAX = 2,147,483,647 байт

Видеть это

0

По вопросам рекламы [email protected]