怎样读取硬盘的详细分区信息,包括各逻辑分区的大小等信息,
VC是否有API直接操作,请大虾们指点。

解决方案 »

  1.   

    为了确定某个逻辑驱动器的类型,必须调用GetDriveType函数。它以路径名作为参数(如C:\),返回DRIVE_FIXED,DRIVE_REMOVABLE,或DRIVE_UNKNOWN。下面列出了所有可能返回的值:这些值在winbase.h定义#define DRIVE_UNKNOWN      0   // 无效路径名
    #define DRIVE_NO_ROOT_DIR  1   // 无效路经,如无法找到的卷标
    #define DRIVE_REMOVABLE    2   // 可移动驱动器(如磁盘驱动器,光驱等)
    #define DRIVE_FIXED        3   // 固定的驱动器 (如 通常的硬盘)
    #define DRIVE_REMOTE       4   // 网络驱动器
    #define DRIVE_CDROM        5   // CD-ROM
    #define DRIVE_RAMDISK      6   // 随机存取(RAM) 磁盘
          
    为了更容易说明问题,我写了一个小程序--ListDrives,它可以列出某台机器上所有的逻辑驱动器。其实现代码如下: ListDrives.cpp #include "stdafx.h"
    #include "resource.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endifusing namespace std; // for string class// 下面是一个GetDriveType返回码与人可读字符串的迷你对照表
    //
    struct {
       UINT type;        // GetDriveType返回码类型
       LPCSTR name;      // ascii 名称
    } DriveTypeFlags [] = {
       { DRIVE_UNKNOWN,     "未知" },
       { DRIVE_NO_ROOT_DIR, "无效路经" },
       { DRIVE_REMOVABLE,   "可移动" },
       { DRIVE_FIXED,       "固定" },
       { DRIVE_REMOTE,      "网络驱动器" },
       { DRIVE_CDROM,       "CD-ROM" },
       { DRIVE_RAMDISK,     "随机存取磁盘" },
       { 0, NULL},
    };int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
       if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {
          cerr << _T("Fatal Error: MFC initialization failed") << endl;
          return -1;
       }   // 获取逻辑驱动器字符串- a:\b:\c:\... 等.
       // 还可以用GetLogicalDrives 以位图形式代替字符串形式获取信息   TCHAR buf[100];
       DWORD len = GetLogicalDriveStrings(sizeof(buf)/sizeof(TCHAR),buf);   // 显示每个驱动器的信息
       //
       string msg = "Logical Drives:\n";  // STL string
       for (TCHAR* s=buf; *s; s+=_tcslen(s)+1) {
          LPCTSTR sDrivePath = s;
          msg += sDrivePath;
          msg += " ";      // GetDriveType 获取枚举值,如DRIVE_UNKNOWN等.
          //
          UINT uDriveType = GetDriveType(sDrivePath);// 查找驱动器类型。在此我用了表(结构数组)来进行查找处理,过于繁琐了一些,
    // 但既然uDriveType 的值是连续的。
    // 我可以用DriveTypeFlags[uDriveType]来代替线性查找。在实际的编程中通常可以这么做:
    // if (uDriveType & DEVICE_CDROM) {
             ……
    // }
          //
          for (int i=0; DriveTypeFlags[i].name; i++) {
             if (uDriveType == DriveTypeFlags[i].type) {
                msg += DriveTypeFlags[i].name;
                break;
             }
          }
          msg += ''''''''''''''''\n'''''''''''''''';
       }
       cout << msg.c_str();   return 0;
    }      
        程序代码很简单,它是一个MFC程序。用GetLogicalDriveStrings获取所有逻辑驱动器的根路径名,然后调用GetDriveType来确定每个驱动器的类型。如果你要找CD-ROM,则检查uDriveType = DRIVE_CDROM就可以了。