检测逻辑驱动器
主要用到的API有GetLogicalDrives ,GetLogicalDirveStrings, GetDriveType, GetDiskFreeSpace.分别介绍如下:
1. DWORD GetLogicalDrives(void)
此函数没有参数,它的返回值是一个掩码,用来描述当前可用的逻辑驱动器。第0位代表驱动器A,第一位代表驱动器B,,第2位代表驱动器C,依次类推。若某一位为1,则说明该位所对应的驱动器可用,为0则相反。
2 . DWORD GetLogicalDriveStrings(
DWORD nBufferLength, // 下面lpBuffer所指向的缓冲区大小
LPTSTR lpBuffer ) // 驱动器名缓冲区,其存储格式为"A:\",0,"B:\",0,"C:\",0,....,0,0
3. UINT GetDriveType( LPCTSTR lpRootPathName) // 要检测的逻辑驱动器的根目录
返回值为:
DRIVE_UNKOWN 无法识别该驱动器
DRIVE_REMOVABLE 可移动磁盘
DRIVE_CDROM 光盘
DRIVE_FIXED 固定磁盘
等。
4. BOOL GetDiskFreeSpace(
LPCTSTR lpRootPathName, // 要检测的磁盘驱动器如"c:\"
LPDWORD lpSectionsPerCluster, // 每一簇的扇区数
LPDWORD lpBytesPerSector, // 每一扇区的字节数
LPDWORD lpNumberOfFreeClusters, // 空闲簇数
LPDWORD lpTotalNumberOfClusters) // 总共簇数
驱动器总容量的计算:簇总数 x 每簇的扇区数 x 每扇区的字节数
驱动器空闲容量计算:空闲簇数 x 每簇的扇区数 x 每扇区的字节数
例:
char lpBuffer[1024];
::GetLogicalDriveStrings(1024, lpBuffer);
int nDrivers = 0;
while(*(lpBuffer + nDrivers * 4) != 0)
{
cout<<lpBuffer+nDrivers * 4 ;
UINT nType = ::GetDriveType(lpBuffer + nDrivers*4);
if(nType == DRIVE_UNKNOWN)
{
cout<<"\tUNKNOWN\t";
}else if(nType == DRIVE_REMOVABLE)
{
cout<<"\tREMOVABLE\t";
}else if(nType == DRIVE_FIXED)
{
cout<<"\tFIXED\t";
}else if(nType == DRIVE_CDROM)
{
cout<<"\tCDROM\t";
}DWORD dwSectionsPerCluster; // 每一簇的扇区数
DWORD dwBytesPerSector; // 每一扇区的字节数
DWORD dwNumberOfFreeClusters; // 可用的簇数
DWORD dwTotalNumberOfClusters; // 总簇数
// 驱动器总容量计算公式 : 簇总数 x 每簇扇区数 x 每扇区的字节数
// 驱动器空闲容量计算公式: 未使用的簇 x 每簇扇区数 x 每扇区的字节数GetDiskFreeSpace(lpBuffer + nDrivers * 4 ,
&dwSectionsPerCluster,
&dwBytesPerSector,
&dwNumberOfFreeClusters,
&dwTotalNumberOfClusters);double free,total;
total = double(dwTotalNumberOfClusters) * double(dwSectionsPerCluster) * double(dwBytesPerSector);
free = double(dwNumberOfFreeClusters) * double(dwSectionsPerCluster) * double(dwBytesPerSector);
cout<<total/1024<<"K\t";
cout<<free/1024<<"K";cout<<endl;
nDrivers ++;
}