为啥计算的可用和总驱动器空间上限为 2G?
Posted
技术标签:
【中文标题】为啥计算的可用和总驱动器空间上限为 2G?【英文标题】:Why is calculated Free & Total drive space capping out at 2G?为什么计算的可用和总驱动器空间上限为 2G? 【发布时间】:2014-10-27 10:24:08 【问题描述】:我编写了一个目录信息实用程序,并且(因为我和我为收集和使用老式硬件而编写此程序的人)使它与 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 为单位,该限制暂时不会造成问题。至少在我有生之年这样做是值得怀疑的。
【问题讨论】:
听起来有点像向后兼容的东西; Windows 95 可能对您撒谎,因为它担心您将无法处理真相。代码是在 32 位还是 16 位模式下运行的?你确定它不是在运行 DOS 版本吗? 见support.microsoft.com/kb/231497 【参考方案1】:answer provided by Raymond Chen in a comment 已解决此问题。使用 GetDiskFreeSpaceEx 而不是 GetDiskFreeSpace 会产生正确的结果。
【讨论】:
请单独发布有关 DOS 7.0 的问题。 (虽然我认为答案是做不到。) 也许你可以在这里给出答案,以避免链接失效。 实际上,这应该是可能的,因为已经有 exe 和 com 文件可以这样做(chkdsk.exe 立即浮现在脑海。)它们在 DOS 7.x 中工作得很好,无需加载 Windows。问题是,从挖掘 chkdsk 的反汇编开始,它通过 DOS INT 调用来实现,到目前为止,这些是我能找到的唯一方法。仍在尝试使其正常工作(继续获得 0 个集群,每个集群 0 个扇区,每个扇区 514 个字节。)我真的只想在 DOS 7.x 上执行此操作,但在运行时获取 DOS 版本通常不是这么大的事。 @Useless:差不多了;唯一重要的信息是您需要使用 GetDiskFreeSpaceEx 而不是 GetDiskFreeSpace。 @user3399848:chkdsk 的工作原理是直接分析卷的内容。我假设您不想这样做,因为这意味着锁定音量 - 但想想在您的情况下这可能不是问题。你仍然需要部分地重新实现 FAT,但你也许可以从 FreeDOS 或其他地方借用代码。以上是关于为啥计算的可用和总驱动器空间上限为 2G?的主要内容,如果未能解决你的问题,请参考以下文章