📄 disk.cpp
字号:
#include<windows.h>
#include<iostream>
#include<winioctl.h>
#include<string.h>
using namespace std;
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()
{
int secNum;
char choise;
disk=physicDisk('c'); //选择要查看的磁盘
while(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(0);
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,
NULL);
while(!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,Result;
DWORD numberofread;
//定位读扇区的位置
sDresult=SetFilePointer(handle1,
theDisk.disk_info.BytesPerSector* logicSectorNumber,
NULL,
FILE_BEGIN);
//读扇区,并返回读的结果
Result=ReadFile(handle1,
buffer,
theDisk.disk_info.BytesPerSector,
&numberofread,
NULL);
if(Result==true) //如果读扇区成功
return true;
else //如果失败,返回错误代码
{
cout<<"读指定扇区失败"<<endl;
cout<<"错误代码为:"<<GetLastError( )<<endl;
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -