代码之家  ›  专栏  ›  技术社区  ›  Divya

我正在使用GetDiskFreeSpaceExW[关闭]

  •  -5
  • Divya  · 技术社区  · 7 年前

    我正在使用

     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的磁盘,返回负值。
    我需要表示可用磁盘空间的准确值,以便用户可以在磁盘上有足够空间的情况下录制电影。

    2 回复  |  直到 7 年前
        1
  •  4
  •   raymai97    7 年前

    我看到你打字了 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\u积分仪= An union that stores a 64-bit unsigned integer

    现在让我们看看你做了什么。

    diskFreeSpaceInKB = static_cast<long int>(m_uliTotalNumberOfFreeBytes.QuadPart/ONE_KB_IN_BYTES)
    

    int / long / 长整型 总是 signed 32-bit LLP64 model 所以基本上你是在投一个 unsigned 64-bit integer ONE_KB_IN_BYTES 到a signed 32-bit integer

    为什么我得到了负数?

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

    如何修复?

    diskFreeSpaceInKB UINT64 static_cast<UINT64> .

        2
  •  0
  •   Samega 7Cattac    7 年前

    __int64 瞬间 long int 如果是像1TB这样的大数字,这可能是问题所在,负值是典型的信号。

    1TB=1.099.511.627.776字节

    LONG_MAX=2.147.483.647字节

    See this