[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 }

 

 

 

posted @ 2014-03-07 00:23  beautifulzzzz  阅读(1919)  评论(0编辑  收藏  举报