window API一天一练习之获取磁盘空间

     获取磁盘空间大小主要有两个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     //获取每个扇区的字节数
lpNumberOfFreeClusters  //空闲的簇数
lpTotalNumberOfClusters  //总共的簇数

使用GetDiskFreeSpaceEx可以避免使用算数来获取磁盘空间大小。
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");
}


window API一天一练习之获取磁盘空间_第1张图片



你可能感兴趣的:(api)