char szLogicalDriveStrings[BUFSIZ];
PCHAR szDrive;
CString strError,strDiskCapacity;
DWORD dwSectorsPerCluster,dwBytesPerSector,dwNumberOfFreeClusters,dwTotalNumberOfClusters;
DWORD64 qwFreeBytesAvailable,qwFreeBytes,qwTotalBytes;
ZeroMemory(szLogicalDriveStrings,BUFSIZ);
//"C:\"、"D:\"、"E:\"
//0x43 0x3a 0x5c 0x00 0x44 0x3a 0x5c 0x00 0x45 0x3a 0x5c 0x00 0x00
GetLogicalDriveStrings(BUFSIZ-1,szLogicalDriveStrings);
szDrive = (PCHAR)szLogicalDriveStrings;
do {
if(!GetDriverInfo(szDrive))
{
m_ctrlDisplay.SetSel(-1,-1);
strError.Format(_T("%s %d\r\n"),"Get Volume Information Error:",GetLastError());
m_ctrlDisplay.ReplaceSel(strError);
}
if(GetDiskFreeSpace(szDrive,&dwSectorsPerCluster,&dwBytesPerSector,&dwNumberOfFreeClusters,&dwTotalNumberOfClusters))
{
strDiskCapacity.Format(_T("%s %d\r\n%s %d\r\n%s %d\r\n%s %d\r\n%s %I64d\r\n%s %I64d\r\n"),
"Number of Free Clusters:\t\t",dwNumberOfFreeClusters,"Total Number of Clusters:\t\t",dwTotalNumberOfClusters,
"Sectors Per Cluster:\t\t",dwSectorsPerCluster,"Bytes Per Sector:\t\t",dwBytesPerSector,
"Free Space(Byte):\t\t",(DWORD64)dwNumberOfFreeClusters*(DWORD64)dwSectorsPerCluster*(DWORD64)dwBytesPerSector,
"Total Space(Byte):\t\t",(DWORD64)dwTotalNumberOfClusters*(DWORD64)dwSectorsPerCluster*(DWORD64)dwBytesPerSector);
m_ctrlDisplay.SetSel(-1,-1);
m_ctrlDisplay.ReplaceSel(strDiskCapacity);
}
if(GetDiskFreeSpaceEx(szDrive,(PULARGE_INTEGER)&qwFreeBytesAvailable,(PULARGE_INTEGER)&qwTotalBytes,(PULARGE_INTEGER)&qwFreeBytes))
{
strDiskCapacity.Format(_T("%s %I64d\r\n%s %I64d\r\n%s %I64d\r\n"),"Free Bytes Available:\t\t",qwFreeBytesAvailable,
"Free Space(Byte):\t\t",qwFreeBytes,"Total Space(Byte):\t\t",qwTotalBytes);
m_ctrlDisplay.SetSel(-1,-1);
m_ctrlDisplay.ReplaceSel(strDiskCapacity);
}
szDrive += (lstrlen(szDrive)+1);
} while(*szDrive != '\x00');
BOOL GetDriverInfo(LPSTR szDrive)
{
UINT uDriveType;
DWORD dwVolumeSerialNumber;
DWORD dwMaximunComponentLength;
DWORD dwFileSystemFlags;
DWORD dwLastError;
CHAR szFileSystemNameBuffer[BUFSIZ];
CHAR szDriveName[MAX_PATH];
CString strDriveTypeInfo,strTemp;
m_ctrlDisplay.SetSel(-1,-1);
m_ctrlDisplay.ReplaceSel(szDrive);
m_ctrlDisplay.SetSel(-1,-1);
m_ctrlDisplay.ReplaceSel("\r\n");
uDriveType = GetDriveType(szDrive);
switch(uDriveType)
{
case DRIVE_UNKNOWN:
strDriveTypeInfo = "The drive type cannot be determined.";
break;
case DRIVE_NO_ROOT_DIR:
strDriveTypeInfo = "The root path is invalid, for example, no volume is mounted at the path.";
break;
case DRIVE_REMOVABLE:
strDriveTypeInfo = "The drive is a type that has removable media, for example, a floppy drive or removable hard disk.";
break;
case DRIVE_FIXED:
strDriveTypeInfo = "The drive is a type that cannot be removed,for example, a fixed hard drive.";
break;
case DRIVE_REMOTE:
strDriveTypeInfo = "The drive is a remote (network) drive.";
break;
case DRIVE_CDROM:
strDriveTypeInfo = "The drive is a CD-ROM drive.";
break;
case DRIVE_RAMDISK:
strDriveTypeInfo = "The drive is a RAM disk.";
break;
default:
break;
}
m_ctrlDisplay.SetSel(-1,-1);
m_ctrlDisplay.ReplaceSel(strDriveTypeInfo);
//驱动器名、驱动器序列号、文件系统所支持的文件组成部分的最大值、驱动器属性值、文件系统类型
//lpRootPathName:可以为NULL,则使用当前使用目录的根。如为一个UNC名字,则必须在其后添加一个反斜杠(\)。UNC是通用命名规则
//lpFileSystemFlags:
//FS_CASE_IS_PRESERVED文件系统保护给一个磁盘命名的文件名情况
//FS_CASE_SENSITIVE文件系统支持区分大小写的文件名
//FS_UNICODE_STORED_ON_DISK文件系统出现在磁盘中的文件名Unicode
//FS_PERSISTENT_ACLS文件系统维护和实施ACLs,如NTFS维护和实施ACLs,但FAT不能
//FS_FILE_COMPRESSION文件系统支持基于文件的压缩
//FS_VOL_IS_COMPRESSED指定的卷是一个压缩卷,如一个DoubleSpace卷
//FILE_SUPPORTS_ENCRYPTION表示文件系统是否支持EFS加密
//FILE_SUPPORTS_OBJECT_IDS文件系统支持对象标识符
//FILE_SUPPORTS_REPARSE_POINTS文件系统支持再分析点
//FILE_SUPPORTS_SPARSE_FILES文件系统支持稀疏文件
//FILE_VOLUME_QUOTAS文件系统支持磁盘限额
if(!GetVolumeInformation(szDrive,szDriveName,MAX_PATH,&dwVolumeSerialNumber,&dwMaximunComponentLength,&dwFileSystemFlags,szFileSystemNameBuffer,BUFSIZ))
{
dwLastError = GetLastError();
if(dwLastError == 21)
{
m_ctrlDisplay.SetSel(-1,-1);
m_ctrlDisplay.ReplaceSel("The device is not ready. Please insert CD.\r\n");
}
return FALSE;
}
if(0 != lstrlen(szDriveName))
{
m_ctrlDisplay.SetSel(-1,-1);
strTemp.Format(_T("%s %s"),"Drive name is",szDriveName);
m_ctrlDisplay.ReplaceSel(strTemp + "\r\n");
}
strTemp.Format(_T("%s %u\r\n%s %u\r\n%s %s\r\n"),"Volume Serial Number is",dwVolumeSerialNumber,"Maximum Component Length is",dwMaximunComponentLength,"System Type is",szFileSystemNameBuffer);
m_ctrlDisplay.SetSel(-1,-1);
m_ctrlDisplay.ReplaceSel(strTemp);
if(dwFileSystemFlags & FILE_VOLUME_QUOTAS)
{
m_ctrlDisplay.SetSel(-1,-1);
m_ctrlDisplay.ReplaceSel("The file system supports disk quotas.\r\n");
}
return TRUE;
}