一 场景
- 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
#ifdef UNICODE
#define GetDiskFreeSpaceEx GetDiskFreeSpaceExW
#else
#define GetDiskFreeSpaceEx GetDiskFreeSpaceExA
#endif
三 举例
#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:", §orsPerCluster, &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盘容量
四 其他