Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么计算是免费的;总驱动器空间上限为2G?_C++_Windows_Visual C++_Hdd - Fatal编程技术网

C++ 为什么计算是免费的;总驱动器空间上限为2G?

C++ 为什么计算是免费的;总驱动器空间上限为2G?,c++,windows,visual-c++,hdd,C++,Windows,Visual C++,Hdd,我编写了一个目录信息实用程序(因为我和我为collect&use vintage hardware编写的人员)使其与DOS和Windows 9x以及Windows XP/Vista/7/8 64位兼容(因为我们也使用这些)我遇到的问题是,在Windows 9x中,即使在更大的驱动器上,它也报告可用驱动器空间和总驱动器空间为2G(以及1.9997 G)。在Windows XP及更高版本(32位或64位)上,它会正确报告驱动器大小。当然,在DOS中,这不是一个问题,因为DOS中的最大大小已经是2G了

我编写了一个目录信息实用程序(因为我和我为collect&use vintage hardware编写的人员)使其与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等等):

\u dos\u getdiskfree(DInfo.Path[0]-'A'+1,&Free);
BlockSize=Free.sectors\u per_集群*Free.bytes\u per_扇区;
对于(i=0;i
DOS存根中的代码与可执行文件的Windows部分之间的唯一区别是_DOS_getdiskfree被替换为_getdiskfree。我在上面的代码中使用了unsigned _uint32变量(或DOS代码使用unsigned long)。我使用32位是为了兼容性,并在将DOS代码转换为Windows代码时尽可能减少重新编写代码。在Windows XP+中,我可能可以通过使用_int64变量来简化事情,但我还是不确定Windows 9x是否会提供这些变量。我甚至不确定Windows XP+的32位版本是否允许它,我真的不想研究它,只是简化了一点。即使在较旧的硬件上,它的工作速度也足够快


由于溢出和字节变量都是32位整数,最大大小应为8 EB(千字节、兆字节、千兆字节、兆字节、千兆字节、千兆字节、千兆字节,如果您想知道的话,),并且由于当前可用的最大驱动器是以一位数的兆字节计量的,因此该限制暂时不会引起问题。至少在我有生之年这样做是值得怀疑的。

已经解决了这个问题。使用GetDiskFreeSpaceEx而不是GetDiskFreeSpace产生了正确的结果。

听起来像是向后兼容的东西;Windows 95可能在欺骗您,因为它担心您无法处理真相。代码是以32位还是16位模式运行?您确定它没有运行DOS版本吗?请分别发布您关于DOS 7.0的问题。(虽然我认为答案是不可能的。)也许你可以在这里公布答案,以避免链接腐烂。实际上,这应该是可能的,因为已经有exe和com文件这样做了(chkdsk.exe立即浮现在脑海中。)它们在DOS 7.x中工作得很好,没有加载Windows。问题是,通过对chkdsk的反汇编,它是通过DOS INT调用完成的,到目前为止,我只能找到这些方法。仍在努力使其正常工作(保持0个群集,每个群集0个扇区,每个扇区514字节)。我真的只想在DOS 7.x上这样做,但在运行时获得DOS版本通常没什么大不了的。@Uffailable:差不多了;唯一重要的信息是您需要使用GetDiskFreeSpaceEx而不是GetDiskFreeSpace。@user3399848:chkdsk通过直接分析卷的内容来工作。我假设您不想这样做,因为这意味着锁定卷-但想想看,在您的情况下,这可能不是问题。您仍然需要部分地重新实现FAT,但您可能可以从FreeDOS或其他地方借用代码。
_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;
}