1

我编写了一个目录信息实用程序,并且(因为我和我为收集和使用老式硬件而编写此程序的人)使它与 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。我在上面的代码中使用了 unsigned __int32 变量(或者对于 DOS 代码使用 unsigned long)。我使用 32 位是为了兼容性,并在将 DOS 代码转换为 Windows 代码时尽可能减少代码的重写。在 Windows XP+ 中,我可能可以通过使用 __int64 变量来简化事情,但同样,我不确定 Windows 9x 是否会提供这些变量。我什至不确定 32 位版本的 Windows XP+ 是否允许它,并且真的不想研究它,只是稍微简化一下。即使在较旧的硬件上,它的循环速度也足够快。

使用 32 位整数的溢出和字节变量,大小应最大为 8 艾字节(千字节、兆字节、千兆字节、太字节、千兆字节、艾字节,以防您想知道),并且由于当前可用的最大驱动器以个位数测量TB,这个限制暂时不会造成问题。至少在我有生之年这样做是值得怀疑的。

4

1 回答 1

0

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

于 2014-09-03T11:44:52.100 回答