求获取盘符对应的硬盘好和分区号的代码!

joysen21 2014-07-23 02:03:35
比如电脑里有2块硬盘。C盘是第一块硬盘的第二分区盘号位1.2。D盘是第一硬盘的第三分钟盘号为1.3 E盘是第二硬盘的第一分区盘号为2.1.这个要用C语言怎么获取。最好是能给源码。我是新手。谢谢大家了!
...全文
500 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
ltgg2010 2014-07-24
  • 打赏
  • 举报
回复
joysen21 2014-07-23
  • 打赏
  • 举报
回复
有没有大神能帮帮我。谢谢了!!
joysen21 2014-07-23
  • 打赏
  • 举报
回复
引用 22 楼 bojie5744 的回复:
建议查看其它脚本语言是否有便捷的方法。
好的。还是很感谢你
  • 打赏
  • 举报
回复
建议查看其它脚本语言是否有便捷的方法。
joysen21 2014-07-23
  • 打赏
  • 举报
回复
引用 20 楼 bojie5744 的回复:
[ [quote=引用 18 楼 joysen21 的回复:] [quote=引用 17 楼 bojie5744 的回复:] 你说的是系统保留盘?
不是说的系统保留盘。就是有些笔记本比如说买回来只有一个C盘所有空间都在C盘里。然后想分出来其他盘就要在C盘上面点右键压缩一写空间出来。然后分配给D盘E盘这样。[/quote] 恩恩,的确,这个情况上面的代码不能正常获取。[/quote] 有没有其他途径能获取真确的分区号呢
  • 打赏
  • 举报
回复
[
引用 18 楼 joysen21 的回复:
[quote=引用 17 楼 bojie5744 的回复:] 你说的是系统保留盘?
不是说的系统保留盘。就是有些笔记本比如说买回来只有一个C盘所有空间都在C盘里。然后想分出来其他盘就要在C盘上面点右键压缩一写空间出来。然后分配给D盘E盘这样。[/quote] 恩恩,的确,这个情况上面的代码不能正常获取。
joysen21 2014-07-23
  • 打赏
  • 举报
回复
引用 18 楼 joysen21 的回复:
[quote=引用 17 楼 bojie5744 的回复:] 你说的是系统保留盘?
不是说的系统保留盘。就是有些笔记本比如说买回来只有一个C盘所有空间都在C盘里。然后想分出来其他盘就要在C盘上面点右键压缩一写空间出来。然后分配给D盘E盘这样。[/quote]如果是按顺序压缩我估计也不会出问题。比如C盘压缩出来的空白空间,直接分给D盘E盘。但是如果C盘的空间先压缩出来一 D盘.过段时间.感觉D盘不够。又从C盘压缩个E盘出来.这样就应该分区号对不上了
joysen21 2014-07-23
  • 打赏
  • 举报
回复
引用 17 楼 bojie5744 的回复:
你说的是系统保留盘?
不是说的系统保留盘。就是有些笔记本比如说买回来只有一个C盘所有空间都在C盘里。然后想分出来其他盘就要在C盘上面点右键压缩一写空间出来。然后分配给D盘E盘这样。
  • 打赏
  • 举报
回复
你说的是系统保留盘?
joysen21 2014-07-23
  • 打赏
  • 举报
回复
引用 13 楼 bojie5744 的回复:
[quote=引用 12 楼 joysen21 的回复:] [quote=引用 7 楼 bojie5744 的回复:]

//获取盘符
#include "stdafx.h"
#include <winsock2.h>
#pragma comment (lib,"ws2_32.lib")
#include <windows.h>
#include <stdlib.h>
#include <Winioctl.h>
#pragma pack(1)
#pragma  warning (disable:4786)
#include <map>
#include <string>
#include <iostream>
using namespace std;//头文件加载有多,自行删除一些无关的。
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hDrv = CreateFile(L"\\\\.\\C:",      //这里改变刚才获得的判断,这里确定为C盘,L"\\\\.\\D:"为获取D盘的盘符
		GENERIC_READ,               
		FILE_SHARE_READ |
		FILE_SHARE_WRITE, 
		NULL,           
		OPEN_EXISTING,    
		0,               
		NULL);
	if(!hDrv)
	{
		cout << "Error Can not open the Driver " << GetLastError();
		return 0;
	}
	PARTITION_INFORMATION pinfo;
	DWORD lpBytesReturned;
	BOOL bSuccess = DeviceIoControl(
		(HANDLE) hDrv,               
		IOCTL_DISK_GET_PARTITION_INFO, 
		NULL,                            
		0,                              
		(LPVOID) &pinfo,            
		(DWORD) sizeof(pinfo),        
		(LPDWORD) &lpBytesReturned,       
		(LPOVERLAPPED) NULL     
		);
	CloseHandle(hDrv);
	if(!bSuccess)
	{
		cout << "ERROR " << GetLastError();
		return 0;
	}
	cout << pinfo.PartitionNumber;
	while(1);
	return 1;
}


这代码是可以获取到分区号。但是遇到压缩出来的盘符时检测出来的结果就不对了下面是代码检测结果(不正确) 下面是正确的结果 [/quote] 自己根据实际情况优化下。[/quote] 大神。不知道从什么地方入手。正常分区的基本都没问题。如果分区是从其他盘里压缩出来的就容易出不对。没有头绪恩啊
joysen21 2014-07-23
  • 打赏
  • 举报
回复
引用 9 楼 fishion 的回复:
参考这个改一下吧:
#include <iostream>
#include <windows.h>
using namespace std; 

typedef struct _VOLUME_INFO
{

	TCHAR	chFlag;

	DWORD	dwDiskNumber;

}VOLUME_INFO, *PVOLUME_INFO;


//chFlag为对应磁盘的盘符
BOOL GetVolumeInfo(IN TCHAR chFlag, OUT PVOLUME_INFO pVolumeInfo)
{

	TCHAR szVol[] = { '\\', '\\', '.', '\\', chFlag, ':', 0};

	HANDLE hDrv = CreateFile(szVol, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

	if (INVALID_HANDLE_VALUE == hDrv)

	{

		return FALSE;

	}

	VOLUME_DISK_EXTENTS vde;

	DWORD dwBytes;

	BOOL bOK = DeviceIoControl(hDrv, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0,&vde, sizeof(vde), &dwBytes, NULL);

	if (!bOK)

	{

		CloseHandle(hDrv);

		return FALSE;

	}

	pVolumeInfo->chFlag = chFlag;							//分区盘符

	pVolumeInfo->dwDiskNumber = vde.Extents->DiskNumber;	//分区所在硬盘编号,基于0,第一个硬盘的编号为0,第二个硬件的编号为1,如此类推

	return TRUE;

}

int main()
{

	for (TCHAR chFlag = 'A'; chFlag <= 'Z'; ++chFlag)
	{
		VOLUME_INFO pi = {0};
		GetVolumeInfo(chFlag, &pi);
	}
}
这段代码是获取到分区所在的硬盘编号。我需要的是分区所在的硬盘编号和分区编号.
liups 2014-07-23
  • 打赏
  • 举报
回复
收藏学习
  • 打赏
  • 举报
回复
引用 12 楼 joysen21 的回复:
[quote=引用 7 楼 bojie5744 的回复:]

//获取盘符
#include "stdafx.h"
#include <winsock2.h>
#pragma comment (lib,"ws2_32.lib")
#include <windows.h>
#include <stdlib.h>
#include <Winioctl.h>
#pragma pack(1)
#pragma  warning (disable:4786)
#include <map>
#include <string>
#include <iostream>
using namespace std;//头文件加载有多,自行删除一些无关的。
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hDrv = CreateFile(L"\\\\.\\C:",      //这里改变刚才获得的判断,这里确定为C盘,L"\\\\.\\D:"为获取D盘的盘符
		GENERIC_READ,               
		FILE_SHARE_READ |
		FILE_SHARE_WRITE, 
		NULL,           
		OPEN_EXISTING,    
		0,               
		NULL);
	if(!hDrv)
	{
		cout << "Error Can not open the Driver " << GetLastError();
		return 0;
	}
	PARTITION_INFORMATION pinfo;
	DWORD lpBytesReturned;
	BOOL bSuccess = DeviceIoControl(
		(HANDLE) hDrv,               
		IOCTL_DISK_GET_PARTITION_INFO, 
		NULL,                            
		0,                              
		(LPVOID) &pinfo,            
		(DWORD) sizeof(pinfo),        
		(LPDWORD) &lpBytesReturned,       
		(LPOVERLAPPED) NULL     
		);
	CloseHandle(hDrv);
	if(!bSuccess)
	{
		cout << "ERROR " << GetLastError();
		return 0;
	}
	cout << pinfo.PartitionNumber;
	while(1);
	return 1;
}


这代码是可以获取到分区号。但是遇到压缩出来的盘符时检测出来的结果就不对了下面是代码检测结果(不正确) 下面是正确的结果 [/quote] 自己根据实际情况优化下。
joysen21 2014-07-23
  • 打赏
  • 举报
回复
引用 7 楼 bojie5744 的回复:

//获取盘符
#include "stdafx.h"
#include <winsock2.h>
#pragma comment (lib,"ws2_32.lib")
#include <windows.h>
#include <stdlib.h>
#include <Winioctl.h>
#pragma pack(1)
#pragma warning (disable:4786)
#include <map>
#include <string>
#include <iostream>
using namespace std;//头文件加载有多,自行删除一些无关的。
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hDrv = CreateFile(L"\\\\.\\C:", //这里改变刚才获得的判断,这里确定为C盘,L"\\\\.\\D:"为获取D盘的盘符
GENERIC_READ,
FILE_SHARE_READ |
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if(!hDrv)
{
cout << "Error Can not open the Driver " << GetLastError();
return 0;
}
PARTITION_INFORMATION pinfo;
DWORD lpBytesReturned;
BOOL bSuccess = DeviceIoControl(
(HANDLE) hDrv,
IOCTL_DISK_GET_PARTITION_INFO,
NULL,
0,
(LPVOID) &pinfo,
(DWORD) sizeof(pinfo),
(LPDWORD) &lpBytesReturned,
(LPOVERLAPPED) NULL
);
CloseHandle(hDrv);
if(!bSuccess)
{
cout << "ERROR " << GetLastError();
return 0;
}
cout << pinfo.PartitionNumber;
while(1);
return 1;
}



这代码是可以获取到分区号。但是遇到压缩出来的盘符时检测出来的结果就不对了下面是代码检测结果(不正确)
下面是正确的结果

傻X 2014-07-23
  • 打赏
  • 举报
回复
GetVolume系列函数 。。MSDN上面有
fishion 2014-07-23
  • 打赏
  • 举报
回复
http://www.cnblogs.com/qq78292959/archive/2012/06/12/2546914.html 可以利用这个来获取所有的磁盘字符串
fishion 2014-07-23
  • 打赏
  • 举报
回复
参考这个改一下吧:
#include <iostream>
#include <windows.h>
using namespace std; 

typedef struct _VOLUME_INFO
{

	TCHAR	chFlag;

	DWORD	dwDiskNumber;

}VOLUME_INFO, *PVOLUME_INFO;


//chFlag为对应磁盘的盘符
BOOL GetVolumeInfo(IN TCHAR chFlag, OUT PVOLUME_INFO pVolumeInfo)
{

	TCHAR szVol[] = { '\\', '\\', '.', '\\', chFlag, ':', 0};

	HANDLE hDrv = CreateFile(szVol, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

	if (INVALID_HANDLE_VALUE == hDrv)

	{

		return FALSE;

	}

	VOLUME_DISK_EXTENTS vde;

	DWORD dwBytes;

	BOOL bOK = DeviceIoControl(hDrv, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0,&vde, sizeof(vde), &dwBytes, NULL);

	if (!bOK)

	{

		CloseHandle(hDrv);

		return FALSE;

	}

	pVolumeInfo->chFlag = chFlag;							//分区盘符

	pVolumeInfo->dwDiskNumber = vde.Extents->DiskNumber;	//分区所在硬盘编号,基于0,第一个硬盘的编号为0,第二个硬件的编号为1,如此类推

	return TRUE;

}

int main()
{

	for (TCHAR chFlag = 'A'; chFlag <= 'Z'; ++chFlag)
	{
		VOLUME_INFO pi = {0};
		GetVolumeInfo(chFlag, &pi);
	}
}
  • 打赏
  • 举报
回复
上面第一行注释打错,是获取分区号
  • 打赏
  • 举报
回复

//获取盘符
#include "stdafx.h"
#include <winsock2.h>
#pragma comment (lib,"ws2_32.lib")
#include <windows.h>
#include <stdlib.h>
#include <Winioctl.h>
#pragma pack(1)
#pragma  warning (disable:4786)
#include <map>
#include <string>
#include <iostream>
using namespace std;//头文件加载有多,自行删除一些无关的。
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hDrv = CreateFile(L"\\\\.\\C:",      //这里改变刚才获得的判断,这里确定为C盘,L"\\\\.\\D:"为获取D盘的盘符
		GENERIC_READ,               
		FILE_SHARE_READ |
		FILE_SHARE_WRITE, 
		NULL,           
		OPEN_EXISTING,    
		0,               
		NULL);
	if(!hDrv)
	{
		cout << "Error Can not open the Driver " << GetLastError();
		return 0;
	}
	PARTITION_INFORMATION pinfo;
	DWORD lpBytesReturned;
	BOOL bSuccess = DeviceIoControl(
		(HANDLE) hDrv,               
		IOCTL_DISK_GET_PARTITION_INFO, 
		NULL,                            
		0,                              
		(LPVOID) &pinfo,            
		(DWORD) sizeof(pinfo),        
		(LPDWORD) &lpBytesReturned,       
		(LPOVERLAPPED) NULL     
		);
	CloseHandle(hDrv);
	if(!bSuccess)
	{
		cout << "ERROR " << GetLastError();
		return 0;
	}
	cout << pinfo.PartitionNumber;
	while(1);
	return 1;
}


joysen21 2014-07-23
  • 打赏
  • 举报
回复
引用 5 楼 tiger9991 的回复:
::GetLogicalDriveStrings
GetLogicalDriveStrings得到的是盘符吧.怎么去获取每个盘符对应的磁盘号和分区号呢
加载更多回复(5)

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧