为什么计算的可用和总驱动器空间上限为2G?
Why is calculated Free & Total drive space capping out at 2G?
我写了一个目录信息实用程序,(因为我和我为收集和使用老式硬件而写的人)使它与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产生了正确的结果。
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- OpenGL相机和相机空间转型的困惑
- CUDA内核和数学函数的显式命名空间
- 打印第二列时的2d字符矢量打印空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- 是否可以将函数导入命名空间,但不能导出它?
- 为什么计算的可用和总驱动器空间上限为2G?