3
__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 语句)报告的空闲字节数与驱动器的空闲字节数不匹配(我通过右键单击驱动器来检查)。

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

4

3 回答 3

1

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

lpFreeBytesAvailable [out, optional]-

指向变量的指针,该变量接收与调用线程关联的用户可用的磁盘上可用字节总数。

此参数可以为 NULL。

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

lpTotalNumberOfBytes [out, optional]-

指向变量的指针,该变量接收与调用线程关联的用户可用的磁盘上的总字节数。

此参数可以为 NULL。

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

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

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

于 2009-03-09T19:59:23.963 回答
1

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

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

于 2009-03-09T20:26:46.580 回答
0

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

我不能说这些是否真的是这样,但我会调查一下。

于 2009-03-09T17:09:42.687 回答