⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disk_io.cpp

📁 输入输出
💻 CPP
字号:
#include <windows.h>
#include <iostream.h>
#include <winioctl.h>
#include <string.h>

struct Disk		//关于Disk结构的定义
{
	HANDLE handle;
	DISK_GEOMETRY disk_info;
};

Disk disk;
HANDLE Floppy;
static _int64 sector;
bool flag;
Disk physicDisk(char driverLetter);										//函数声明
bool sectorRead(Disk theDisk,unsigned logicSectorNumber,char* buffer);	//函数声明
void sectorDump(Disk theDisk,int logicSectorNumber);					//函数声明

void main(void)
{
	int secNum;
	char choise;
	disk = physicDisk('c');		//选择要查看的磁盘
	if (flag)
	{
		while(1)
		{
			cout<<"********************************************"<<endl;
			cout<<"*    0. 查看指定目录信息:					*"<<endl;
			cout<<"*    1. 退出:							*"<<endl;
			cin>>choise;
			switch(choise)
			{
			case '0' :		//查看指定的扇区
				cout<<"总共有"<<(long)sector<<"个扇区!"<<endl;
				cout<<"请输入要查看的扇区号码:"<<endl;
				cin>>secNum;
				if(secNum<sector && secNum >=0)
					sectorDump(disk,secNum);
				else 
					cout<<"没有这个扇区!!!"<<endl;
				//exit
				break;

			case '1':
				exit(0);
				break;
			default:
				cout<<"输入错误!!!请重新输入!!!"<<endl;
				cout<<endl;
			}
		}
	}
}

Disk physicDisk(char driverLetter)		//创建磁盘句柄,并打开磁盘,返回disk
{
	flag = true;
	DISK_GEOMETRY* temp = new DISK_GEOMETRY;
	char device[9] = "\\\\.\\C:";
	device[4] = driverLetter;
	Floppy = CreateFile (	device,							//将要打开的驱动器名
							GENERIC_READ,					//存取的权限
							FILE_SHARE_READ|FILE_SHARE_WRITE,//共享的权限
							NULL,							//默认的属性位
							OPEN_EXISTING,					//创建驱动器方式
							0,								//所创建的驱动器类型
							NULL);							//指向模板文件的类型

	if(GetLastError() == ERROR_ALREADY_EXISTS)	//打开失败,返回错误代码
	{
		cout<<"不能打开磁盘"<<endl;
		cout<<GetLastError()<<endl;
		flag = false;
		return disk;
	}
	DWORD bytereturned;
	BOOL Result;
	disk.handle = Floppy;
	//获得物理磁盘的几何信息
	Result = DeviceIoControl(	Floppy,
								IOCTL_DISK_GET_DRIVE_GEOMETRY,
								NULL,
								0,
								temp,
								sizeof(*temp),
								&bytereturned,
								(LPOVERLAPPED)NULL);

	if(!Result)				//如果失败,返回错误代码
	{
		cout<<"打开失败"<<endl;
		cout<<"错误代码位:"<<GetLastError()<<endl;
		flag = false;
		return disk;
	}
	disk.disk_info = *temp;
	//输出的是整个物理磁盘的信息
	cout<<"柱面数为:"<<(unsigned long)disk.disk_info.Cylinders.QuadPart<<endl<<endl;
	cout<<"每柱面的磁道数为:"<<disk.disk_info.TracksPerCylinder<<endl<<endl;
	cout<<"没磁道的扇区数为:"<<disk.disk_info.SectorsPerTrack<<endl<<endl;
	cout<<"每扇区的字节数为:"<<disk.disk_info.BytesPerSector<<endl<<endl;
	sector = disk.disk_info.Cylinders.QuadPart* (disk.disk_info.TracksPerCylinder)*
		(disk.disk_info.SectorsPerTrack);
	double DiskSize = (double)disk.disk_info.Cylinders.QuadPart*	//相乘获得磁盘大小
					(disk.disk_info.TracksPerCylinder)*
					(disk.disk_info.SectorsPerTrack)*
					(disk.disk_info.BytesPerSector);

	cout<<"磁盘大小为:"<<DiskSize/(1024*1024)<<"MB."<<endl;
	cout<<driverLetter<<"盘所在的磁盘共有"<<(long)sector<<"个扇区"<<endl;
	delete temp;
	return disk;
}

void sectorDump(Disk theDisk,int logicSectorNumber)	//如果读成功,输出读的结果
{
	BOOL sDresult;
	char* buffer = new char[theDisk.disk_info.BytesPerSector];
	sDresult = sectorRead(disk,logicSectorNumber,buffer);
	if(sDresult)
	{
		for(int i =0;i<int (theDisk.disk_info.BytesPerSector);i++)
			cout<<buffer[i];
		cout<<endl;			//换行
		cout<<endl;
		cout<<endl;
	}
	delete buffer;
}

bool sectorRead(Disk theDisk,unsigned logicSectorNumber,char* buffer) //读指定的扇区
{
	HANDLE handle1 = theDisk.handle;
	BOOL sDresult,Rresult;
	DWORD numberofread;
	//定位读扇区的位置
	sDresult = SetFilePointer (handle1,
								theDisk.disk_info.BytesPerSector* logicSectorNumber,
								NULL,
								FILE_BEGIN);
	//读扇区,并返回读的结果
	Rresult = ReadFile (handle1,
						buffer,
						theDisk.disk_info.BytesPerSector,
						&numberofread,
						NULL);
	if(Rresult)		//如果读扇区成功
		return true;
	else			//如果失败,返回错误代码
	{
		cout<<"读指定的扇区失败"<<endl;
		cout<<"错误代码为:"<<GetLastError()<<endl;
		return false;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -