获取磁盘容量

一 场景
  • 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值