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

Why is calculated Free & Total drive space capping out at 2G?

本文关键字:空间 2G 驱动器 计算 为什么      更新时间:2023-10-16

我写了一个目录信息实用程序,(因为我和我为收集和使用老式硬件而写的人)使它与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存根中的代码和可执行文件的Windows部分之间的唯一区别是_DOS_getdiskfree改为_getdiskfree。我在上面的代码中使用了无符号__int32变量(或DOS代码中的无符号long。)我使用32位是为了兼容性,并在将DOS代码转换为Windows代码时尽可能减少代码的重写。在WindowsXP+中,我本可以通过使用__int64变量来简化事情,但我不确定Windows9x是否会提供这些变量。我甚至不确定32位版本的Windows XP+是否允许它,我真的不想研究它,只是稍微简化一下。即使在较旧的硬件上,它也能很快地使用环路。

使用Overflow&字节变量都是32位整数,最大大小应该为8 EB(如果你想知道的话,可以是千字节、兆字节、千兆字节、兆兆字节、PB、兆字节),而且由于目前可用的最大驱动器是以个位数的兆字节为单位测量的,所以这个限制在一段时间内不会造成问题。至少在我有生之年这样做是值得怀疑的。

Raymond Chen在评论中提供的答案已经解决了这个问题。使用GetDiskFreeSpaceEx而不是GetDiskFreeSpace产生了正确的结果。