如何获取物理磁盘下各个分区的盘符?

matrix2009 2010-07-08 09:53:06
例如,
我的电脑上有个硬盘PhysicalDrive0,有四个分区,C,D,E,F;
插入一个U盘,物理磁盘号为PhysicalDrive1,分区是H。
插入一个移动硬盘,物理磁盘号为PhysicalDrive2,分区是I,J。

我想知道如何根据物理磁盘号得到磁盘的分区的盘符?
即根据PhysicalDrive0,得到C,D,E,F;

如果能同时知道物理磁盘为U盘或是移动硬盘更好
...全文
1243 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwgddx 2010-07-09
using 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;
}
回复
matrix2009 2010-07-09
楼上几位大哥
你们说的方法我知道

我当然知道通过C:可以得到PhysicalDrive0。

但是那样的话,我就得从C-Z遍历一下,才能知道每个PhysicalDrive对应的盘符。

我就是想直接通过PhysicalDrive0得到C,D,E,F。
回复
matrix2009 2010-07-08
我写了段代码,但是没有得到预想的结果,pbuff为空

HANDLE hDevice = NULL;
DWORD output = 0;
hDevice=CreateFile("\\\\.\\PhysicalDrive1",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
for(int i = 0; i < 200; i++)
{
// Since the DRIVE_LAYOUT_INFORMATION_EX has one PARTITION_INFORMATION_EX,
// you don't need to allocate the first one.

size_t bufSize = sizeof(DRIVE_LAYOUT_INFORMATION_EX) + i *sizeof(PARTITION_INFORMATION_EX);
char *pbuff = new char[bufSize];
ZeroMemory(pbuff,bufSize);

BOOL bResult = DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_LAYOUT_EX,NULL,0,&pbuff,bufSize,&output,NULL);
if (!bResult)
{
DWORD dwError = GetLastError();
LPSTR lpBuffer;
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,dwError,LANG_NEUTRAL,(LPTSTR)&lpBuffer,0,NULL);
CString strErrorCause = lpBuffer ? _T(lpBuffer) : _T("Sorry, cannot find this error info.");
LocalFree (lpBuffer);
//MessageBox(strErrorCause,0,0);
delete []pbuff;
}
else
{
DRIVE_LAYOUT_INFORMATION_EX* pdata = (DRIVE_LAYOUT_INFORMATION_EX*)pbuff;
CString str;
str.Format("%d",pdata->PartitionCount);
MessageBox(str);
delete []pbuff;
break;
}
}
CloseHandle(hDevice);
回复
Eleven 2010-07-08
GetLogicalDriveStrings
回复
linlinlovejava 2010-07-08
???????????
回复
m_tornado 2010-07-08
GetLogicalDrive获得盘符,判断用getdriveType,可以判断USB,查msdn里面有类型
回复
MoXiaoRab 2010-07-08
首先用CreateFile打开U盘,然后调用
DeviceIoControl(Device,   
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
NULL,
0,
DiskExtents,
Max_Path,
dwOutBytes,
NULL);


根据 DiskExtents-> eVolumeExtents[0]的内容获得U盘的物理ID.
回复
fly4free 2010-07-08
对设备 (设备的 device name 为 "\\\\.\\X:"形式 X为盘符 )
使用控制码, IOCTL_STORAGE_GET_DEVICE_NUMBER
返回 STORAGE_DEVICE_NUMBER 结构体,
其中 DeviceNumber 成员 的值为 "PhysicalDriveX" 里的 X

回复
发动态
发帖子
硬件/系统
创建于2007-09-28

2590

社区成员

VC/MFC 硬件/系统
申请成为版主
社区公告
暂无公告