我写了一个目录信息实用程序,(因为我和我为收集和使用老式硬件而编写的人员)使它兼容DOS和Windows 9x以及Windows XP / Vista / 7/8 64- bit(因为我们也使用那些。)我遇到的问题是,在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代码使用了unsigned long。)我使用了32位的兼容性,并在将DOS代码转换为Windows代码时尽可能减少重写代码。在Windows XP +中,我可能通过使用__int64变量简化了事情,但同样,我不确定Windows 9x是否会提供这些变量。我甚至不确定32位版本的Windows XP +是否允许它,并且真的不想研究它只是简化它。即使在较旧的硬件上,它也可以在循环中运行得足够快。
随着溢出&amp;字节变量都是32位整数,大小应该最大为8艾字节(千字节,兆字节,千兆字节,兆兆字节,千兆字节,以及你想知道的情况下的exabytes),并且因为当前可用的最大驱动器是以单位数字TB来衡量的,这个限制一段时间不应该引起问题。至少在我的一生中这样做是值得怀疑的。
答案 0 :(得分:0)
answer provided by Raymond Chen in a comment解决了这个问题。使用GetDiskFreeSpaceEx而不是GetDiskFreeSpace产生了正确的结果。