gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:46:32 24 4
gpt4 key购买 nike

我写了一个目录信息实用程序,并且(因为我和我写这篇文章的人收集和使用老式硬件)使它与 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com