?? cpp1.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('f'); //選擇要查看的磁盤
if(flag){
while(1)
{
cout<<"**************************************"<<endl;
cout<<"* 0. 查看指定目錄信息: *"<<endl;
cout<<"* 1. 退出: *"<<endl;
cout<<"**************************************"<<endl;
cin>>choise;
switch(choise)
{
case '0': //查看指定扇區
cout<<"總共有"<<(long)sector<<"個扇區!"<<endl;
cout<<"請輸入要查看的扇區號碼:";
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;
int 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;
int 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) //如果讀扇區成功
return true;
else //如果失敗,返回錯誤代碼
{
cout<<"讀指定扇區失敗"<<endl;
cout<<"錯誤代碼為:"<<GetLastError()<<endl;
return false;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -