获取磁盘分区的总容量和空闲空间的容量可以使用GetDiskFreeSpace函数或GetDiskFree SpaceEx函数。GetDiskFreeSpace使用DWORD类型作为输出参数,由于DWOR长度为32位,最大只能表示4GB,而一般的磁盘分区大小都大于4GB,所以,GetDiskFreeSpace并不直接返回磁盘的总容量和空闲空间的容量,而是使用总簇数、空闲的簇数、每簇的扇区数、每扇区的字节数来表示。用户在编程时,可以使用它们的乘积来获得最终结果。而GetDiskFreeSpaceEx使用ULARGE_INTEGER (DWORD64)类型的数据来存储磁盘空间总空间和剩余空间,所以可以直接获得结果。DWORD64可以表示约16777216TB的数据量(DWORD64最大可表示2^64Byte,lTB=2^40Byte)
(1)GetDiskFreeSpace
获取驱动器根路径作为输入,获取磁盘空间信息,包括每簇的扇区数,每扇区的字节数,簇数量,空闲的簇数量
♥♥参数:
lpRootPathName:输入参数
lpSectorsPerCluster:输出参数,指针,指向存储每簇扇区数的DWORD类型变量.
lpBytesPerSector:输出参数,指针,指向存储每扇区字节数的DWORD类型变量.
lpNumberOfFreeClusters:输出参数,指针,指向存储空闲簇的DWORD类型变量.
lpTotalNumberOfClusters:输出参数,指针,指向存储总簇数的DWORD类型变量.
♥♥返回值:
返回BOOL值,表示信息获取是否成功. 总簇数乘以每簇扇区数乘以每扇区字节数就是磁盘分区的总容量,空闲簇数乘以每簇扇区数,乘以每扇区字节数就是磁盘 分区的空闲空间容量.
GetDiskFreeSpaceEx
获取驱动器根路径作为输入,获取用户可用的空闲空间的字节数,磁盘总容量的字节数.
♥♥参数:
lpDirectoryName:输入参数,指向所要获取磁盘空间信息的磁盘分区根路径字符串.
lpFreeBytesAvailable:输出参数,指针,指向用于存储可获得的总字节数量的变量.
lpTotalNumberOfBytes:输出参数,指针,指向存储磁盘空间总字节数据的变量.
lpTotalNumberOfFreeBytes:输出参数,指针,指向存储磁盘空闲空间总字节的变量.
♥♥返回值:
返回BOOL,表示信息获取是否成功 ULARGE_INTEGER类型数据可以直接强制转换为DWORD64类型变量.
关键数据结构:
GetDiskFreeSpaceEx函数使用了数据结构ULARGE_INTEGER,数据类型PULARGE_INTEGER是指向它的指针.
typedef union _ULARGE_INTEGER{
struct{
DWORD LowPart;
DWORD HighPart;
};
struct{
DWORD LowPart;
DWORD HighPart;
}U;
ULONGLONG QuadPart;
}ULARGE_INTEGER,*PULARGE_INTEGER;
#include <windows.h>
#include <stdio.h> /* ************************************
* BOOL GetDiskSpaceInfo(LPCSTR pszDrive
* 功能 根据输入的驱动器,获取磁盘总容量
* 空闲空间、簇数量等磁盘信息
* 参数 驱动器根路径,比如“D:\”。
**************************************/
BOOL GetDiskSpaceInfo(LPCSTR pszDrive)
{
DWORD64 qwFreeBytesToCaller, qwTotalBytes, qwFreeBytes;
DWORD dwSectPerClust, dwBytesPerSect, dwFreeClusters, dwTotalClusters;
BOOL bResult; //使用GetDiskFreeSpaceEx获取磁盘信息并打印结果
bResult = GetDiskFreeSpaceExA (pszDrive,
(PULARGE_INTEGER)&qwFreeBytesToCaller,
(PULARGE_INTEGER)&qwTotalBytes,
(PULARGE_INTEGER)&qwFreeBytes); if(bResult)
{
printf("使用GetDiskFreeSpaceEx获取磁盘空间信息\n");
printf("可获得的空闲空间(字节): \t%I64d\n", qwFreeBytesToCaller);
printf("空闲空间(字节): \t\t%I64d\n", qwFreeBytes);
printf("磁盘总容量(字节): \t\t%I64d\n", qwTotalBytes);
} //使用GetDiskFreeSpace获取磁盘信息并打印结果
bResult = GetDiskFreeSpaceA (pszDrive,
&dwSectPerClust,
&dwBytesPerSect,
&dwFreeClusters,
&dwTotalClusters); if(bResult)
{
printf("\n使用GetDiskFreeSpace获取磁盘空间信息\n");
printf("空闲的簇数量 : \t\t\t%d\n",dwFreeClusters);
printf("总簇数量 : \t\t\t%d\n",dwTotalClusters);
printf("每簇的扇区数量 : \t\t%d\n",dwSectPerClust);
printf("每扇区的容量(字节): \t\t%d\n",dwBytesPerSect);
printf("空闲空间(字节): \t\t%I64d\n",
(DWORD64)dwFreeClusters*
(DWORD64)dwSectPerClust*(DWORD64)dwBytesPerSect);
printf("磁盘总容量(字节): \t\t%I64d",
(DWORD64)dwTotalClusters*
(DWORD64)dwSectPerClust*(DWORD64)dwBytesPerSect);
}
return bResult;
} /* ************************************
* int main( int argc, PCHAR argv[] )
* 功能 应用程序主函数,根据输入参数
* 调用GetDiskSpaceInfo函数获取
* 磁盘空间信息
* 参数 驱动器根路径,比如“D:\”。
**************************************/
int main(int argc, PCHAR argv[])
{
GetDiskSpaceInfo (argv[]);
}