您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统实验(六)-读写磁盘
-1-实验六读/写磁盘指定位置信息实验目的:1)了解磁盘的物理组织。2)掌握windows系统提供的有关对磁盘操作API。3)根据输入的扇区号读/写指定扇区。实验准备知识:1)设置读写操作的位置:函数SetFilepointer()用于移动一个打开文件中的读/写指针,这里磁盘设备被当作文件处理,因此用于移动文件读/写指针在磁盘上的位置。2)读文件:用函数ReadFile()读取磁盘指定区域的内容(从文件指针指示的位置开始读取文件中的数据)。3)写文件:用函数WriteFile()将数据写入磁盘指定区域。函数在文件指针所指的位置完成写操作,写操作完成后,文件指针按实际写入的字节数来调整。实验内容:在实验五的基础上,继续完成该试验。编写两个函数,分别完成如下功能。1)对给定的扇区号读取该扇区的内容。2)将用户输入的数据写入指定的扇区。实验要求:深入理解操作系统设备当作文件处理的特性,理解函数SetFilepointer()、ReadFile()及WriteFile()中每个参数的实际意义并能在本实验中正确应用。实验指导:在主程序中让用户选择:R、W、Q或,若用户选择R,则调用函数BOOLSectorRead(HANDLEHandle),完成读给指定扇区的功能;若用户选择W,则调用函数BOOLSectorWrite(HANDLEHandle),完成对给定扇区号写入信息的功能,若用户选择Q,则程序退出。参考源代码://操作系统实验六.cpp:Definestheentrypointfortheconsoleapplication.//#includestdafx.h#include操作系统实验六.h#includewinioctl.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS__FILE[]=__FILE__;#endifDISK_GEOMETRYdisk_info;HANDLEGetDiskInformation(chardrivername);BOOLSectorRead(HANDLEHandle);-2-BOOLSectorWrite(HANDLEHandle);///////////////////////////////////////////////////////TheoneandonlyapplicationobjectCWinApptheApp;usingnamespacestd;int_tmain(intargc,TCHAR*argv[],TCHAR*envp[]){intnRetCode=0;HANDLEHandle;charChoice;Handle=GetDiskInformation('C');while(TRUE){printf(PleaseSelectReadorWrite!Input'R'roread,'W'toWrite,'Q'toquit!\n);Choice=getchar();printf(\n);switch(Choice){case'W':{if(!SectorWrite(Handle))printf(WriteSectorFail!\n);getchar();break;}case'R':{if(!SectorRead(Handle))printf(ReadSectorFail!\n);getchar();break;}case'Q':{exit(0);break;}default:{printf(InputError!,Tryagainplease!\n);getchar();}-3-}}returnnRetCode;}HANDLEGetDiskInformation(chardrivername)//GetDiskInformation获取磁盘信息{chardevice[]=\\\\.\\;device[4]=drivername;HANDLEFloopyDisk;DWORDReturnSize;//DWORD双字节值DWORDSector;doubleDiskSize;FloopyDisk=CreateFile(device,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS|FILE_FLAG_NO_BUFFERING,NULL);if(FloopyDisk==INVALID_HANDLE_VALUE)printf(INVALID_HANDLE_VALUE!\n);if(GetLastError()==ERROR_ALREADY_EXISTS)printf(CannotOpenDisk!%d\n,GetLastError());if(!DeviceIoControl(FloopyDisk,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,&disk_info,50,&ReturnSize,(LPOVERLAPPED)NULL))printf(OpenDiskError!%d\n,GetLastError());printf(DiskInformation:\n);printf(\tBytePerSector:%d\n,disk_info.BytesPerSector);printf(\tSectorPerTrack:%d\n,disk_info.SectorsPerTrack);printf(\tTracksPerCylider:%d\n,disk_info.TracksPerCylinder);printf(\tCylider:%d\n,disk_info.Cylinders);Sector=disk_info.Cylinders.QuadPart*disk_info.TracksPerCylinder*disk_info.SectorsPerTrack;printf(\tThereis%dSectors!\n,Sector);-4-DiskSize=Sector*disk_info.BytesPerSector;printf(\tSizeofDisk:%4.2fKB\n,(DiskSize)/(1024*1024));returnFloopyDisk;}BOOLSectorRead(HANDLEHandle){charReadBuffer[1024*16];DWORDSectorNumber;DWORDBytestoRead;DWORDSector;DWORDrc;inti;if(Handle==NULL){printf(ThereisNodisk!\n);returnFALSE;}printf(PleaseInputtheSectorNumbertoReadForm:\n);scanf(%d,&SectorNumber);printf(\n);Sector=disk_info.Cylinders.QuadPart*disk_info.TracksPerCylinder*disk_info.SectorsPerTrack;if(SectorNumberSector)printf(ThereisnotthisSector!\n);printf(Content:\n);BytestoRead=SectorNumber*(disk_info.BytesPerSector);rc=SetFilePointer(Handle,BytestoRead,NULL,FILE_BEGIN);if(!ReadFile(Handle,ReadBuffer,BytestoRead,&BytestoRead,NULL)){printf(ReadFileError:%d\n,GetLastError());returnFALSE;}printf(\tTextContent:\n);for(i=0;i512;i++){printf(%c,ReadBuffer[i]);}printf(\n);printf(\tHexTextContent:\n);for(i=0;i512;i++){printf(%x,ReadBuffer[i]);-5-printf();}printf(\n);returnTRUE;}BOOLSectorWrite(HANDLEHandle){charWriteBuffer[1024];DWORDSectorNumber,SectorMove;DWORDBytestoWrite;DWORDSector;DWORDrc;if(Handle==NULL){printf(ThereisNodisk!\n);returnFALSE;}printf(PleaseInputtheSectorNumbertoWriteto:\n);scanf(%d,&SectorNumber);printf(\n);Sector=disk_info.Cylinders.QuadPart*disk_info.TracksPerCylinder*disk_info.SectorsPerTrack;if(SectorNumberSector)printf(ThereisnotthisSector!\n);printf(PleaseInputtheContenttoWritetoDiskA:\n);scanf(%s,&WriteBuffer);//WriteBuffer指的是写缓冲区SectorMove=SectorNumber*(disk_info.BytesPerSector);rc=SetFilePointer(Handle,SectorMove,NULL,FILE_BEGIN);if(!WriteFile(Handle,WriteBuffer,512,&BytestoWrite,NULL)){printf(ReadFileError:%d\n,GetLastError());returnFALSE;}printf(WriteComplete!\n);returnTRUE;}实验步骤:1)根据实验五的实验步骤首先新建一个工程文件以及把参考代码输进去,还要在参考代码中需要手动输入头文件包含命令#includewinioctl.h。-6-2)因为在参考代码中需要进行读写的盘是软盘A,所以需要把其修改成其他盘。3)查看运行结果。-7-①获取磁盘信息②读取磁盘M中扇区号1的内容-8-③在磁盘M的扇区1上写入“MENGJI”。⑤读出在M盘1号扇区上新写入的内容MENGJI.-9-⑥退出查看结果窗口实验总结:1)这次实验是在实验五的基础上做的,所以实验五中所需要的步骤都需要,比如在程序的文件包含命令中要手动输入#includewinioctl.h命令,还有因为参考代码中需要进行读写的是A盘,因为大部分电脑上A盘是软盘盒,实验机子的软盘盒是空的,所以对参考代码中的A修改成其他盘,比如C盘。2)在查看运行结果时首先是获取磁盘信息,其次需要输入命令比如R;读出该磁盘中某个扇区号上的的内容再输入W;在扇区某个号上写入信息,重新按R读出新写入的信息,最后按Q来退出查看结果窗口。
本文标题:操作系统实验(六)-读写磁盘
链接地址:https://www.777doc.com/doc-5699575 .html