自WIN95(OSR2)以后的版本包括WIN98都支持将硬盘格式化为FAT32格式,这种格式支持硬盘的分区可大于2G,原来的FAT16格式无法支持大于2G的硬盘分区,对于FAT32格式的硬盘如果其容量大于2G,那么原来的检测磁盘容量的API函数GetFreeDiskSpace将无法返回正确的容量大小,为此,微软公司新增加了一个检测磁盘容量的API函数GetDiskFreeSpaceEx,此函数对容量大于2G的FAT32格式的硬盘能返回正确的数据。本文给出一个例子,介绍如何使用此新API函数,本例子也可供大家在编写安装程序时检测磁盘空间作为参考。
首先介绍一下API函数GetDiskFreeSpaceEx的参数,它的原型如下: GetDiskFreeSpaceEx( LPCTSTR lpDirectoryName, // 指明哪个磁盘 PULARGE_INTEGER lpFreeBytesAvailableToCaller, // 返回当前用户可使用的自由空间,这里需要说明的是某些操作系统可能对每个用户有一个可使用的磁盘空间的限制,对普通的PC用户来说此参数没有意义。 PULARGE_INTEGER lpTotalNumberOfBytes, //磁盘总容量 PULARGE_INTEGER lpTotalNumberOfFreeBytes //剩余的自由空间,对普通PC用户来说它和lpFreeBytesAvailableToCaller相同。 );
GetDiskFreeSpace和GetDiskFreeSpaceEx之间存在差别:
GetDiskFreeSpaceEx不仅返回指定盘符中“真正”的剩余空间,还能够返回调用者剩余的配额空间,编程的时候有用的往往是后者。当然,如果不在NTFS 5.0下或者没有设置配额,这两个值应该是相同的。 GetDiskFreeSpaceEx还考虑到了磁盘配额系统的发展需求,比如将来增加对每个目录而不仅仅是每个盘符的配额空间的支持。 GetDiskFreeSpaceEx还增加了对UNC路径名的支持,并且即使盘符的容量大于2G(FAT 32或NTFS系统下)也能够返回正确的结果。
WinAPI: GetDiskFreeSpace - 获取磁盘组织与容量信息
//声明:
GetDiskFreeSpace(
lpRootPathName: PChar; {磁盘根路径}
var lpSectorsPerCluster: DWORD; {一个簇内的扇区数}
var lpBytesPerSector: DWORD; {一个扇区内的字节数}
var lpNumberOfFreeClusters: DWORD; {剩余簇数}
var lpTotalNumberOfClusters: DWORD {总簇数}
): BOOL;
//备注:该函数只能得到小于2G的磁盘空间。
如果要得到大于2G的磁盘空间应该用函数GetDiskFreeSpaceEx.
//举例:
procedure TForm1.FormCreate(Sender: TObject);
var
d1,d2,d3,d4: DWORD;
begin
GetDiskFreeSpace('C:',d1,d2,d3,d4);
{以下只是显示}
Memo1.Clear;
with Memo1.Lines do
begin
Add(Format('一个簇内的扇区数: %d',[d1]));
Add(Format('一个扇区内的字节数: %d',[d2]));
Add(Format('剩余簇数: %d',[d3]));
Add(Format('总簇数: %d',[d4]));
Add(Format('剩余空间: %f GB',[d3/1024/1024/1024*d2*d1]));
Add(Format('总空间: %f GB',[d4/1024/1024/1024*d2*d1]));
end;
end;
//效果图: