我正在使用 GetDiskFreeSpaceExW

I am using 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 的磁盘,returns 负值。
我需要表示可用磁盘 space 的准确值,以便用户可以在该磁盘上有足够的 space 时录制电影。

尝试使用 long int__int64 瞬间。 如果是像 1TB 这样的大数字,那可能就是问题所在,负值是典型的信号。

1TB = 1.099.511.627.776 字节

LONG_MAX = 2.147.483.647 字节

See this

我看到你输入了 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 = 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_BYTES 转换为 signed 32-bit integer.

为什么我得到负数?

因为该值超过了有符号数据类型的最大正值。

如何解决?

diskFreeSpaceInKB 声明为 UINT64,并且 static_cast<UINT64>