A scene
- To obtain disk capacity and free space under windows, you can use GetDiskFreeSpace series API:
- GetDiskFreeSpaceA
- GetDiskFreeSpaceW
- GetDiskFreeSpaceExA
- GetDiskFreeSpaceExW
- Suffix explanation
- A = ASCII non-wide byte version
- W = wide byte version
- Ex = function extended version
二 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
Three examples
#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
- analysis
- Calculated based on the call result of GetDiskFreeSpace:
- Disk available bytes: 8 * 512 * 50446681 = 206 629 605 376 Bytes
- Total Disk Bytes: 8 * 512 * 87006207 = 356 377 423 872 Bytes
- GetDiskFreeSpaceEx directly obtains the final number of bytes, which is more convenient.
- F drive capacity
Four others
- Non-windows, please refer to statfs