[WinAPI] API 8 [获取磁盘空间信息]
获取磁盘分区的总容量和空闲空间的容量可以使用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;
1 #include <windows.h> 2 #include <stdio.h> 3 4 /* ************************************ 5 * BOOL GetDiskSpaceInfo(LPCSTR pszDrive 6 * 功能 根据输入的驱动器,获取磁盘总容量 7 * 空闲空间、簇数量等磁盘信息 8 * 参数 驱动器根路径,比如“D:\”。 9 **************************************/ 10 BOOL GetDiskSpaceInfo(LPCSTR pszDrive) 11 { 12 DWORD64 qwFreeBytesToCaller, qwTotalBytes, qwFreeBytes; 13 DWORD dwSectPerClust, dwBytesPerSect, dwFreeClusters, dwTotalClusters; 14 BOOL bResult; 15 16 //使用GetDiskFreeSpaceEx获取磁盘信息并打印结果 17 bResult = GetDiskFreeSpaceExA (pszDrive, 18 (PULARGE_INTEGER)&qwFreeBytesToCaller, 19 (PULARGE_INTEGER)&qwTotalBytes, 20 (PULARGE_INTEGER)&qwFreeBytes); 21 22 if(bResult) 23 { 24 printf("使用GetDiskFreeSpaceEx获取磁盘空间信息\n"); 25 printf("可获得的空闲空间(字节): \t%I64d\n", qwFreeBytesToCaller); 26 printf("空闲空间(字节): \t\t%I64d\n", qwFreeBytes); 27 printf("磁盘总容量(字节): \t\t%I64d\n", qwTotalBytes); 28 } 29 30 //使用GetDiskFreeSpace获取磁盘信息并打印结果 31 bResult = GetDiskFreeSpaceA (pszDrive, 32 &dwSectPerClust, 33 &dwBytesPerSect, 34 &dwFreeClusters, 35 &dwTotalClusters); 36 37 if(bResult) 38 { 39 printf("\n使用GetDiskFreeSpace获取磁盘空间信息\n"); 40 printf("空闲的簇数量 : \t\t\t%d\n",dwFreeClusters); 41 printf("总簇数量 : \t\t\t%d\n",dwTotalClusters); 42 printf("每簇的扇区数量 : \t\t%d\n",dwSectPerClust); 43 printf("每扇区的容量(字节): \t\t%d\n",dwBytesPerSect); 44 printf("空闲空间(字节): \t\t%I64d\n", 45 (DWORD64)dwFreeClusters* 46 (DWORD64)dwSectPerClust*(DWORD64)dwBytesPerSect); 47 printf("磁盘总容量(字节): \t\t%I64d", 48 (DWORD64)dwTotalClusters* 49 (DWORD64)dwSectPerClust*(DWORD64)dwBytesPerSect); 50 } 51 return bResult; 52 } 53 54 /* ************************************ 55 * int main( int argc, PCHAR argv[] ) 56 * 功能 应用程序主函数,根据输入参数 57 * 调用GetDiskSpaceInfo函数获取 58 * 磁盘空间信息 59 * 参数 驱动器根路径,比如“D:\”。 60 **************************************/ 61 int main(int argc, PCHAR argv[]) 62 { 63 GetDiskSpaceInfo (argv[1]); 64 }