获取磁盘类型及剩余空间 GetDiskFreeSpaceEx GetDriveTypeW GetVolumeInformation

来源:互联网 发布:app软件验收标准 编辑:程序博客网 时间:2024/06/06 19:09
获取磁盘剩余空间
WINBASEAPI BOOL WINAPI GetDiskFreeSpaceEx(
    LPCWSTR lpDirectoryName,
    PULARGE_INTEGER lpFreeBytesAvailableToCaller,
    PULARGE_INTEGER lpTotalNumberOfBytes,
    PULARGE_INTEGER lpTotalNumberOfFreeBytes
  );
lpDirectoryName                        驱动器的名称。
lpFreeBytesAvailableToCaller           用户可用的磁盘空间。
lpTotalNumberOfBytes                   磁盘总共的空间。
lpTotalNumberOfFreeBytes               磁盘空闲的空间。
以上都是字节为单位

获取驱动器类型
WINBASEAPI UINT WINAPI GetDriveTypeW(   LPCWSTR lpRootPathName   );
  LPCWSTR lpRootPathName         驱动器路径,如“C:”、"D:"
返回值:
DRIVE_UNKNOWN 0未知
DRIVE_NO_ROOT_DIR 1无效路经
DRIVE_REMOVABLE 2可移动磁盘
DRIVE_FIXED 3 固定 
DRIVE_REMOTE 4网络驱动器
DRIVE_CDROM 5 CD-ROM

DRIVE_RAMDISK 6随机存取磁盘


获取与一个磁盘卷有关的信息

BOOL GetVolumeInformation(

  LPCTSTR lpRootPathName,          // address of root directory of the file system                                 
  LPTSTR lpVolumeNameBuffer,       // address of name of the volume
  DWORD nVolumeNameSize,           // length of lpVolumeNameBuffer
  LPDWORD lpVolumeSerialNumber,    // address of volume serial number
  LPDWORD lpMaximumComponentLength,// address of system's maximum filename length                                 
  LPDWORD lpFileSystemFlags,       // address of file system flags
  LPTSTR lpFileSystemNameBuffer,   // address of name of file system
  DWORD nFileSystemNameSize        // length of lpFileSystemNameBuffer
);

返回值
  Long,非零表示成功,零表示失败。会设置GetLastError
输入参数
    lpRootPathName            欲获取信息的那个卷的根路径
  lpVolumeNameBuffer        用于装载卷名(卷标)的一个字串
  nVolumeNameSize           lpVolumeNameBuffer字串的长度
  lpVolumeSerialNumber      用于装载磁盘卷序列号的变量
  lpMaximumComponentLength  指定一个变量,用于装载文件名每一部分的长度。例如,在“c:\component1\component2.ext”的情况下,它就代表component1或component2名称的长度
  lpFileSystemFlags         用于装载一个或多个二进制位标志的变量。对这些标志位的解释如下:
       FS_CASE_IS_PRESERVED      文件名的大小写记录于文件系统
       FS_CASE_SENSITIVE         文件名要区分大小写
       FS_UNICODE_STORED_ON_DISK 文件名保存为Unicode格式
       FS_PERSISTANT_ACLS        文件系统支持文件的访问控制列表(ACL)安全机制
       FS_FILE_COMPRESSION       文件系统支持逐文件的进行文件压缩
       FS_VOL_IS_COMPRESSED      整个磁盘卷都是压缩的
  lpFileSystemNameBuffer String,指定一个缓冲区,用于装载文件系统的名称(如FAT,NTFS以及其他)
  nFileSystemNameSize Long,lpFileSystemNameBuffer字串的长度


////////////////demo/////////////////

typedef struct  
{
int num; //磁盘数量 
char disk[26]; //盘符,最多支持26个盘符
}SDiskInfo;

SDiskInfo g_DiskInfo; //记录本机盘符

typedef struct s

{
UINT type; // GetDriveType返回码类型
LPCSTR name; // ascii 名称
}SDriveTypeFlag;


SDriveTypeFlag g_stDriveTypeFlags[8] = {
{ DRIVE_UNKNOWN, "未知" },
{ DRIVE_NO_ROOT_DIR, "无效路经" },
{ DRIVE_REMOVABLE, "可移动磁盘" },
{ DRIVE_FIXED, "" }, //固定 
{ DRIVE_REMOTE, "网络驱动器" },
{ DRIVE_CDROM, "CD-ROM" },
{ DRIVE_RAMDISK, "随机存取磁盘" },
  { 0, NULL},
};

//获取盘剩余空间
void CExaminationDlg::OnGetremainspace() 
{
// TODO: Add your control notification handler code here
    ULARGE_INTEGER nFreeBytesAvailable;
    ULARGE_INTEGER nTotalNumberOfBytes;
    ULARGE_INTEGER nTotalNumberOfFreeBytes;
CString strDisk = ""; //盘符
CString strMsg = "";
UINT uDriveType;
char name[MAX_PATH] = {0};
char format[MAX_PATH] = {0}; //磁盘格式,如NTFS或FAT
        UpdateData(TRUE);
m_disk1.GetWindowText(strDisk);
strDisk += ":";
//获取磁盘分区名字
GetVolumeInformation(strDisk, name, MAX_PATH, NULL, NULL, NULL, format, MAX_PATH);
m_Descri.Empty();
m_Descri.Format("%s(%s)", name, strDisk);
uDriveType = GetDriveType(strDisk);
m_DiskType.Format("%s(%s)", g_stDriveTypeFlags[uDriveType].name, format); //获取磁盘类型
if (GetDiskFreeSpaceEx(strDisk,
&nFreeBytesAvailable,
&nTotalNumberOfBytes,
&nTotalNumberOfFreeBytes))
{
m_diskSpace.Format("%lu", nTotalNumberOfBytes.QuadPart/(ULONGLONG)(1024*1024*1024)); //磁盘总大小
m_remainSpace.Format("%lu", nFreeBytesAvailable.QuadPart/(ULONGLONG)(1024*1024*1024)); // 磁盘剩余空间
m_Percent = (signed __int64)(nTotalNumberOfBytes.QuadPart-nFreeBytesAvailable.QuadPart)*100/(signed __int64)nTotalNumberOfBytes.QuadPart;
m_RemainProg.SetPos(m_Percent);
}
else
{
strDisk.Delete(strDisk.GetLength()-1,1); //删除最后一个":"
strMsg.Format("获取%s盘剩余空间信息失败", strDisk);
MessageBox(strMsg, "提示", MB_OK|MB_ICONWARNING);
}

UpdateData(FALSE);

}