[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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?