获取磁盘空间大小主要有两个API 。GetDiskFreeSpace 和GetDiskFreeSpaceEx。
BOOL WINAPI GetDiskFreeSpace( _In_ LPCTSTR lpRootPathName, _Out_ LPDWORD lpSectorsPerCluster, _Out_ LPDWORD lpBytesPerSector, _Out_ LPDWORD lpNumberOfFreeClusters, _Out_ LPDWORD lpTotalNumberOfClusters );
lpRootPathName // 磁盘根目录,如果为NULL则使用的是当前磁盘根目录
lpSectorsPerCluster //是个指针,获取每簇的扇区数lpBytesPerSector //获取每个扇区的字节数使用GetDiskFreeSpaceEx可以避免使用算数来获取磁盘空间大小。lpNumberOfFreeClusters //空闲的簇数lpTotalNumberOfClusters //总共的簇数
BOOL WINAPI GetDiskFreeSpaceEx( _In_opt_ LPCTSTR lpDirectoryName, _Out_opt_ PULARGE_INTEGER lpFreeBytesAvailable, _Out_opt_ PULARGE_INTEGER lpTotalNumberOfBytes, _Out_opt_ PULARGE_INTEGER lpTotalNumberOfFreeBytes );
lpDirectoryName //磁盘目录
lpFreeBytesAvailable //用户可以获取的磁盘空间大小
lpTotalNumberOfBytes //磁盘的总空间大小,如果使用了用户配额,则用户获取的总空间大小可能小于磁盘真正的大小
lpTotalNumberOfFreeBytes //磁盘空闲空间大小
参数类型
typedef union _ULARGE_INTEGER { struct { DWORD LowPart; //低32位 DWORD HighPart; //高32位 }; struct { DWORD LowPart; //低32位 DWORD HighPart; //高32位 } u; ULONGLONG QuadPart; //64位无符号整型 } ULARGE_INTEGER, *PULARGE_INTEGER;如果你的主机支持64位整型数,则用QuadPart存储,否则用LowPart 和HighPart存储64位数值
void GetDiskSpaceInformation(LPSTR szDrive) { printf("volume %s \n",szDrive); DWORD64 dwAvailableByte, dwTotalNumberOfByte,dwFreeNumberOfByte; if (!GetDiskFreeSpaceEx(szDrive,(PULARGE_INTEGER)&dwAvailableByte, (PULARGE_INTEGER)&dwTotalNumberOfByte,(PULARGE_INTEGER)&dwFreeNumberOfByte)) { printf("cannot get disk free space \n"); } else { printf("GetSpace by GetDiskFreeSpaceEx()\n"); printf("可用磁盘空间大小(字节): %I64d\n",dwAvailableByte); printf("磁盘空间总大小(字节) : %I64d\n",dwTotalNumberOfByte); printf("空闲磁盘空间总大小(字节) : %I64d\n",dwFreeNumberOfByte); } DWORD dwSectorsPerCluster,dwBytesPerSector,dwNumberOfFreeClusters,dwTotalNumberOfClusters ; if (GetDiskFreeSpace(szDrive,&dwSectorsPerCluster,&dwBytesPerSector, &dwNumberOfFreeClusters,&dwTotalNumberOfClusters)) { printf("GetSpace by GetDiskFreeSpace()\n"); printf("每簇的扇区数: %d\n",dwSectorsPerCluster); printf("每个扇区的字节数 : %d\n",dwBytesPerSector); printf("空闲簇数 : %d\n",dwNumberOfFreeClusters); printf("总的簇数: %d\n",dwTotalNumberOfClusters); printf("磁盘空间总大小(字节) : %I64d\n",(DWORD64)dwTotalNumberOfClusters *(DWORD64)dwSectorsPerCluster * (DWORD64)dwBytesPerSector); printf("空闲磁盘空间总大小(字节) : %I64d\n",(DWORD64)dwNumberOfFreeClusters*(DWORD64)dwSectorsPerCluster * (DWORD64)dwBytesPerSector); } }
void GetDisksInformationEx() { printf("Begin Call GetDisksInformationEx()\n"); CHAR szLogicalDriveString[BUFFERSIZE]; PCHAR szDrive; ZeroMemory(szLogicalDriveString,BUFFERSIZE); GetLogicalDriveStrings(BUFFERSIZE - 1, szLogicalDriveString); szDrive = szLogicalDriveString; while (*szDrive) { printf("volume %s\n",szDrive); GetDiskSpaceInformation(szDrive); szDrive += (lstrlen(szDrive) + 1); } printf("end Call GetDisksInformationEx()\n"); }