vc下读写硬盘的操作

92 篇文章 1 订阅
12 篇文章 0 订阅
<span style="font-size:18px;color:#cc0000;"> </span><p><span style="font-size:18px;color:#cc0000;">vc下读写硬盘的操作,简单来说就是将硬盘当作是一个文件流来操作:</span></p><p><span style="font-size:18px;color:#cc0000;">下面是实现的函数:</span></p>
 
//drv 是盘符,一个字符,替换字符串“\\.\A:”中的字符A
//startSector 是开始扇区号
//sectors 扇区数量
//lpSectBuff 缓冲区
BOOL CRWSectorsDlg::ReadSectors(char drv, DWORD startSector, WORD sectors, LPBYTE lpSectBuff)
{
	char devName[] = "\\\\.\\A:";
	devName[4] =drv;
	
	//打开指定分区
	HANDLE hDev=CreateFile(devName, GENERIC_READ, FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);
	if(hDev==INVALID_HANDLE_VALUE) 
		return 0;
		
	//将文件指针指向起始扇区
	SetFilePointer(hDev,512*startSector,0,FILE_BEGIN);
	DWORD dwCB;
	
	//读取指定数量的扇区
	BOOL bRet=ReadFile(hDev,lpSectBuff,512*sectors,&dwCB,NULL);
	CloseHandle(hDev);
	return bRet;
} 

BOOL CRWSectorsDlg::WriteSectors( char drv, DWORD startSector, WORD sectors, LPBYTE lpSectBuff )
{
	char devName[] = "\\\\.\\A:";
	devName[4] =drv;
	HANDLE hDev=CreateFile(devName, GENERIC_WRITE, FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);
	if(hDev==INVALID_HANDLE_VALUE) 
		return 0;
	SetFilePointer(hDev,512*startSector,0,FILE_BEGIN);
	DWORD dwCB;
	BOOL bRet=WriteFile(hDev,lpSectBuff,512*sectors,&dwCB,NULL);
	CloseHandle(hDev);
	return bRet;

}


 

 

下边是用vc控制台程序实现的一个读取硬盘分区大小的简单代码(win7下好像不能读取到C盘的信息,暂时不知道为什么)


#include <stdio.h>
#include <stdlib.h>
#include <WTypes.h>



int main()
{
	LONGLONG lPartBegin, lPartEnd;
	DWORD dwOutByte;			// DeviceIoControl 读取的字节数
	DISK_GEOMETRY diskGeometry;
	DWORD dwSectorByte;
	HANDLE m_hDriver;
	//char Drive[] = ".//PHYSICALDRIVE0";

	/ ("\\\\.\\D:")   // disk D:

	m_hDriver = CreateFile(("\\\\.\\D:"), GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING, 0, NULL);
	if(m_hDriver == INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}
	// GENERIC_READ FILE_SHARE_READ
	// GENERIC_WRITE FILE_SHARE_WRITE
//	ReadFile(m_hDriver, ...);


	// 读取每扇区字节数
	BOOL bDeviceRet = DeviceIoControl(m_hDriver, IOCTL_DISK_GET_DRIVE_GEOMETRY,
		NULL, 0, &diskGeometry, sizeof(DISK_GEOMETRY), &dwOutByte, NULL);

	// 每扇区字节数
	dwSectorByte = diskGeometry.BytesPerSector;

	// 读取分区大小和偏移量
	PARTITION_INFORMATION partInfo;
	bDeviceRet = DeviceIoControl(m_hDriver, IOCTL_DISK_GET_PARTITION_INFO,
		NULL, 0, &partInfo, sizeof(PARTITION_INFORMATION), &dwOutByte, NULL);

	LONGLONG lPartitionSize = partInfo.PartitionLength.QuadPart;		// 分区的大小
	LONGLONG lOffset = partInfo.StartingOffset.QuadPart;				// 偏移

	// StartingOffset 除以每扇区字节数就是开始扇区;
	// PartitionLength 除以每扇区字节数就是扇区总数。
	lPartBegin = lOffset / dwSectorByte;
	lPartEnd = lPartitionSize / dwSectorByte;

	// 开始扇区加上扇区总数再减去1就是结束扇区。
	lPartEnd += lPartBegin; //lOffset;
	lPartEnd -= 1;


	return 0;
}


 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值