• [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获取磁盘空间信息
    ");
    25         printf("可获得的空闲空间(字节): 	%I64d
    ", qwFreeBytesToCaller);
    26         printf("空闲空间(字节): 		%I64d
    ", qwFreeBytes);
    27         printf("磁盘总容量(字节): 		%I64d
    ", qwTotalBytes);
    28     }
    29 
    30     //使用GetDiskFreeSpace获取磁盘信息并打印结果
    31     bResult = GetDiskFreeSpaceA (pszDrive, 
    32         &dwSectPerClust, 
    33         &dwBytesPerSect,
    34         &dwFreeClusters, 
    35         &dwTotalClusters);
    36 
    37     if(bResult) 
    38     {
    39         printf("
    使用GetDiskFreeSpace获取磁盘空间信息
    ");
    40         printf("空闲的簇数量 : 			%d
    ",dwFreeClusters);
    41         printf("总簇数量 : 			%d
    ",dwTotalClusters);
    42         printf("每簇的扇区数量 : 		%d
    ",dwSectPerClust);
    43         printf("每扇区的容量(字节): 		%d
    ",dwBytesPerSect);
    44         printf("空闲空间(字节): 		%I64d
    ", 
    45             (DWORD64)dwFreeClusters*
    46             (DWORD64)dwSectPerClust*(DWORD64)dwBytesPerSect);
    47         printf("磁盘总容量(字节): 		%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 }
  • 相关阅读:
    LeetCode
    数据流中的中位数
    二叉搜索树的第k个结点
    对称的二叉树
    按之字形顺序打印二叉树
    把二叉树打印成多行
    二叉树的下一个结点
    链表中环的入口结点
    删除链表中重复的结点
    不用加减乘除做加法
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3585605.html
Copyright © 2020-2023  润新知