GetDiskFreeSpaceEx报告错误的空闲字节数

时间:2009-03-09 17:05:07

标签: c++ winapi types windows-ce

__int64 i64FreeBytes
unsigned __int64 lpFreeBytesAvailableToCaller,
                 lpTotalNumberOfBytes,
                 lpTotalNumberOfFreeBytes; // variables used to obtain 
                                           // the free space on the  drive

GetDiskFreeSpaceEx (Manager.capDir,
(PULARGE_INTEGER)&lpFreeBytesAvailableToCaller,
(PULARGE_INTEGER)&lpTotalNumberOfBytes,
(PULARGE_INTEGER)&lpTotalNumberOfFreeBytes);

i64FreeBytes = lpTotalNumberOfFreeBytes;
_tprintf(_T ("Number of bytes free on the drive:%I64u \n"),
     lpTotalNumberOfFreeBytes);

我正在开发一个数据管理例程,它是一个Windows CE命令行应用程序。上面的代码显示了如何获取包含文件夹Manager.capdir的特定驱动器上的空闲字节数(它是包含目录的完整路径名的变量)。

我的问题是,上面代码报告的空闲字节数(_tprintf语句)与驱动器的空闲字节数不匹配(我通过右键单击驱动器来检查)。

我想知道这种差异的原因是什么?

3 个答案:

答案 0 :(得分:1)

引用(编辑)GetDiskFreeSpaceEx的文档,强调我的:

  

lpFreeBytesAvailable [out,optional] -

     

指向接收变量的指针   a上的空闲字节总数   用户可以使用的磁盘   谁与电话有关   线程。

     

此参数可以为NULL。

     

如果正在使用每用户配额,   该值可能小于总值   磁盘上的空闲字节数。

     

lpTotalNumberOfBytes [out,optional] -

     

指向接收变量的指针   磁盘上的总字节数   那些可供用户使用   与调用线程相关联。

     

此参数可以为NULL。

     

如果正在使用每用户配额,   该值可能小于总值   磁盘上的字节数。

     

确定总字节数   在磁盘或卷上,使用   IOCTL_DISK_GET_LENGTH_INFO。

换句话说,这个数字取决于用户,如果你想匹配资源管理器返回的值,请使用lpFreeBytesAvailable

答案 1 :(得分:1)

我有一台没有磁盘配额的单用户计算机。我将您的代码发布到基于对话框的MFC应用程序并运行它,使用“C:\”作为lpDirectoryName参数的单一条件,以便我可以与系统报告的驱动器可用空间进行比较。这似乎是合乎逻辑的,因为可用空间仅对驱动器有意义,而不是文件夹。

起初我以为我遇到了类似的问题,但后来我重新检查了支票(我把它绑在了一个按钮上),并得到了与当时属性对话框相同的结果。似乎驱动器上的可用空间是一个相当动态的数量 - 如果它是系统驱动器,这并不是非常令人惊讶 - 甚至没有其他海报正确报告的标准,您可能看不到与属性完全相同的数字对话框在运行时报告。

答案 2 :(得分:0)

有一种可能性浮现在脑海中。也许有人没有考虑到分区丢失的空间(窗口通常在驱动器末端留下8MB作为松弛)。基本上,物理驱动器上剩余的空间与分区所代表的逻辑空间之间存在差异。或者文件系统本身丢失了空间。

我不知道这些是否真的如此,但我会调查它。