获取磁盘容量

一 场景

  • windows下获取磁盘容量和可用空间,可通过 GetDiskFreeSpace 系列 API:
    • GetDiskFreeSpaceA
    • GetDiskFreeSpaceW
    • GetDiskFreeSpaceExA
    • GetDiskFreeSpaceExW
  • 后缀解释
    • A = ASCII非宽字节版本
    • W = 宽字节版本
    • Ex = 函数扩展版本

二 GetDiskFreeSpace

  • 语法
BOOL GetDiskFreeSpaceA(
  LPCSTR  lpRootPathName,
  LPDWORD lpSectorsPerCluster, // 每簇扇区数
  LPDWORD lpBytesPerSector,  // 每扇区字节数
  LPDWORD lpNumberOfFreeClusters, // 可用簇数
  LPDWORD lpTotalNumberOfClusters // 总簇数
);

BOOL GetDiskFreeSpaceW(
  LPCWSTR lpRootPathName,
  LPDWORD lpSectorsPerCluster,
  LPDWORD lpBytesPerSector,
  LPDWORD lpNumberOfFreeClusters,
  LPDWORD lpTotalNumberOfClusters
);

BOOL GetDiskFreeSpaceExA(
  LPCSTR          lpDirectoryName,
  PULARGE_INTEGER lpFreeBytesAvailableToCaller, // 对调用者的磁盘可用字节数
  PULARGE_INTEGER lpTotalNumberOfBytes, // 对调用者的磁盘总字节数
  PULARGE_INTEGER lpTotalNumberOfFreeBytes // 磁盘可用字节数
);

BOOL GetDiskFreeSpaceExW(
  LPCWSTR         lpDirectoryName,
  PULARGE_INTEGER lpFreeBytesAvailableToCaller,
  PULARGE_INTEGER lpTotalNumberOfBytes,
  PULARGE_INTEGER lpTotalNumberOfFreeBytes
);
  • 条件宏
#ifdef UNICODE
#define GetDiskFreeSpace  GetDiskFreeSpaceW
#else
#define GetDiskFreeSpace  GetDiskFreeSpaceA
#endif // !UNICODE

#ifdef UNICODE
#define GetDiskFreeSpaceEx  GetDiskFreeSpaceExW
#else
#define GetDiskFreeSpaceEx  GetDiskFreeSpaceExA
#endif // !UNICODE

三 举例

#include <iostream>
#include <windows.h>

using namespace std;

int main(){
    
    
  DWORD sectorsPerCluster = 0;
  DWORD bytesPerSector = 0;
  DWORD numberOfFreeClusters = 0;
  DWORD totalNumberOfClusters = 0;
  if (GetDiskFreeSpace(L"F:", &sectorsPerCluster, &bytesPerSector, 
                       &numberOfFreeClusters, &totalNumberOfClusters)){
    
    
    cout << "GetDiskFreeSpace:" << endl;
    cout << "SectorsPerCluster\t " << sectorsPerCluster << endl;
    cout << "BytesPerSector\t " << bytesPerSector << endl;
    cout << "NumberOfFreeClusters\t " << numberOfFreeClusters << endl;
    cout << "TotalNumberOfClusters\t " << totalNumberOfClusters << endl;
  }


  ULARGE_INTEGER avail = {
    
    0}; 
  ULARGE_INTEGER total = {
    
    0};
  ULARGE_INTEGER free = {
    
    0};
  if (GetDiskFreeSpaceEx(L"F:", &avail, &total, &free)) {
    
    
    cout << "GetDiskFreeSpaceEx:" << endl;
    cout << "TotalNumberOfBytes\t " << total.QuadPart << endl;
    cout << "TotalNumberOfFreeBytes\t " << free.QuadPart << endl;
    cout << "FreeBytesAvailableToCaller\t " << avail.QuadPart << endl;
  }

  cin.get();
  return 0;
}
  • 结果
GetDiskFreeSpace:
SectorsPerCluster        8
BytesPerSector           512
NumberOfFreeClusters     50446681
TotalNumberOfClusters    87006207

GetDiskFreeSpaceEx:
TotalNumberOfBytes         356377423872
TotalNumberOfFreeBytes     206629605376
FreeBytesAvailableToCaller 206629605376
  • 分析
    • 根据 GetDiskFreeSpace 调用结果计算:
      • 磁盘可用字节数: 8 * 512 * 50446681 = 206 629 605 376 Bytes
      • 磁盘总字节数: 8 * 512 * 87006207 = 356 377 423 872 Bytes
    • GetDiskFreeSpaceEx 直接获取到最终的字节数,更加方便。
  • F盘容量
    在这里插入图片描述

四 其他

  • 非windows, 可查阅 statfs

猜你喜欢

转载自blog.csdn.net/luoshabugui/article/details/109534474