c++ - 为什么计算出的可用和总驱动器空间上限为 2G?

标签 c++ windows visual-c++ hard-drive

我写了一个目录信息实用程序,并且(因为我和我写这篇文章的人收集和使用老式硬件)使它与 DOS 和 Windows 9x 以及 Windows XP/Vista/7/8 64 位兼容(因为我们也使用它们。)我遇到的问题是,在 Windows 9x 中,即使在更大的驱动器上,它也将可用驱动器空间和总驱动器空间报告为 2G(以及 1.9997 G)。在 Windows XP 及更高版本(32 位或 64 位)上,它会正确报告驱动器大小。在 DOS 中,当然,这不是问题,因为 DOS 中的最大大小已经是 2G。

我使用的代码是(DInfo.Path 是正在访问的目录,[0] 是驱动器号 - A、B、C 等...):

_dos_getdiskfree(DInfo.Path[0] - 'A' + 1, &Free);

BlockSize = Free.sectors_per_cluster * Free.bytes_per_sector;

for (i = 0; i < BlockSize; i++) {
    DriveBytes += Free.total_clusters;
    if (DriveBytes < Free.total_clusters) ++DBOverflow;
    FreeBytes += Free.avail_clusters;
    if (FreeBytes < Free.avail_clusters) ++FBOverflow;
}

DOS stub 中的代码与可执行文件的 Windows 部分之间的唯一区别是 _dos_getdiskfree 被替换为 _getdiskfree。我在上面的代码中使用了 unsigned __int32 变量(或 unsigned long 用于 DOS 代码。)我使用 32 位是为了兼容性,并在将 DOS 代码转换为 Windows 代码时尽可能减少重写代码。在 Windows XP+ 中,我可能可以通过使用 __int64 变量来简化事情,但同样,我不确定 Windows 9x 是否会提供这些。我什至不确定 32 位版本的 Windows XP+ 是否允许它,并且真的不想研究它只是稍微简化一下。即使在较旧的硬件上,它也能以足够快的速度运行循环。

Overflow 和 Byte 变量都是 32 位整数,大小应该最大为 8 艾字节(千字节、兆字节、千兆字节、太字节、拍字节、艾字节,如果你想知道的话),并且由于测量了当前可用的最大驱动器在单位数 TB 中,该限制暂时不会引起问题。至少在我有生之年这样做是值得怀疑的。

最佳答案

answer provided by Raymond Chen in a comment已解决问题。使用 GetDiskFreeSpaceEx 而不是 GetDiskFreeSpace 产生了正确的结果。

关于c++ - 为什么计算出的可用和总驱动器空间上限为 2G?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25635498/

相关文章:

c++ - 同时写入内存和磁盘

c++ - 如何将窗口置于通过 CreateProcess 创建的进程之上

php - 关于 C++ 的一些错误

c++ - 未命名类 C++ 中的静态数据成员

c++ - 当 Rtools 安装在 Windows 7 的非默认目录中时,在 R 中编译 Stan 模型

c++ - 在 for 循环中使用 MPI_Irecv 和 MPI_Isend

java - 卡夫卡 : could not find or load main class installation Windows

windows - 如何检测 Electron/ Chrome 应用程序中的 Windows 软键盘?

c++ - 使用 lambda 调用的 move 构造函数

visual-c++ - MSBuild 忽略项目文件中的 CLToolExe 属性