Get disk capacity

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

  • grammar
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
);
  • Condition Hiroshi
#ifdef UNICODE
#define GetDiskFreeSpace  GetDiskFreeSpaceW
#else
#define GetDiskFreeSpace  GetDiskFreeSpaceA
#endif // !UNICODE

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

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:", &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;
}
  • result
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
    Insert picture description here

Four others

  • Non-windows, please refer to statfs

Guess you like

Origin blog.csdn.net/luoshabugui/article/details/109534474