优盘检测.docx
- 文档编号:8068646
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:10
- 大小:111.99KB
优盘检测.docx
《优盘检测.docx》由会员分享,可在线阅读,更多相关《优盘检测.docx(10页珍藏版)》请在冰豆网上搜索。
优盘检测
操作系统第二次作业
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;//预定义
#defineBUFSIZE1024//定义常量
ULARGE_INTEGERFreeBytesAvailable,TotalNumberOfBytes,TotalNunberOfreeBytes;//定义参数
BOOLGetDirverInfo(LPSTRszDrive);//声明函数
voidgetdiskfreespace(void)//定义一个函数
{
CHARszLogicalDriveStrings[BUFSIZE];//用来指向字符数组
PCHARszDrive;//将上面申请的CHar数组用O填充
ZeroMemory(szLogicalDriveStrings,BUFSIZE);
GetLogicalDriveStrings(BUFSIZE-1,szLogicalDriveStrings);//获取逻辑驱动器卷标名写入数组
szDrive=(PCHAR)szLogicalDriveStrings;//指向字符数组
inti=0;
//循环每个卷
do
{
if(!
GetDirverInfo(szDrive))//检测硬盘
{
//printf("\n获取错误:
%d",GetLastError());
cout< } szDrive+=(lstrlen(szDrive)+1); i++; }while(*szDrive! ='\x00'); printf("\n",szDrive);//获取错误的编号 if(i==5) cout<<"未检测到U盘的插入,请插入U盘"< } BOOLGetDirverInfo(LPSTRszDrive) { UINTuDriveType; DWORDdwVolumeSerialNumber; DWORDdwMaximumComponentLength; DWORDdwFileSystemFlags; CHARszFileSystemNameBuffer[BUFSIZE]; CHARszDirveName[MAX_PATH]; if(strcmp(szDrive,"H: \\")==0) { printf("\n%s\n",szDrive);//输出盘的名字 GetDiskFreeSpaceEx(szDrive,&FreeBytesAvailable,&TotalNumberOfBytes,&TotalNunberOfreeBytes); cout<<"可用的容量大小: "<<(FreeBytesAvailable.HighPart*pow(2,32)+FreeBytesAvailable.LowPart)/pow(2,30)<<"G"< cout<<"总容量的大小: "<<(TotalNumberOfBytes.HighPart*pow(2,32)+TotalNumberOfBytes.LowPart)/pow(2,30)<<"G"< cout<<"剩余容量的大小: "<<(TotalNunberOfreeBytes.HighPart*pow(2,32)+TotalNunberOfreeBytes.LowPart)/pow(2,30)<<"G"< uDriveType=GetDriveType(szDrive);//TCHAR的指针类型 } if(strcmp(szDrive,"G: \\")==0) { printf("\n%s\n",szDrive);//输出盘的名字 GetDiskFreeSpaceEx(szDrive,&FreeBytesAvailable,&TotalNumberOfBytes,&TotalNunberOfreeBytes); cout<<"可用的容量大小: "<<(FreeBytesAvailable.HighPart*pow(2,32)+FreeBytesAvailable.LowPart)/pow(2,30)<<"G"< cout<<"总容量的大小: "<<(TotalNumberOfBytes.HighPart*pow(2,32)+TotalNumberOfBytes.LowPart)/pow(2,30)<<"G"< cout<<"剩余容量的大小: "<<(TotalNunberOfreeBytes.HighPart*pow(2,32)+TotalNunberOfreeBytes.LowPart)/pow(2,30)<<"G"< uDriveType=GetDriveType(szDrive);//TCHAR的指针类型 } if(strcmp(szDrive,"H: \\")==0)//复制您想要复制的文件 { char*filepath="c: \\VMware.txt"; charc[20]; _finddata_tfile; intk; longHANDLE; cout< chara[20],b[20]; LOOP: cout< "< cout<<"比如将c盘下的Yang.txt文件复制到u盘"< cout<<"那么输入: c: \\Yang.txt"< cout<<"那么输入: u: \\? ? ? .txt"<<"(其中? ? ? 是你给该文件的取的名字,一定要加扩展名)"< ? ? 时你给该文件的取的名字 cout< "; cin>>a; filepath=a; k=HANDLE=_findfirst(a,&file); if(k! =-1)//检测文件是否存在 { cout<<"存在该文件,并且该文件的名字为: "< k=_findnext(HANDLE,&file); } else { cout<<"不存在该文件,请检测该文件是否存在或复制其他文件"< gotoLOOP; } _findclose(HANDLE); FILE*file1=fopen(filepath,"r"); if(file1)//查询所要复制文件的大小 { cout< doublesize=filelength(fileno(file1)); if(size<1024) cout<<"该文件的大小为: "< else { if(size>=1024&&size<1048576) cout<<"该文件的大小为: "< else {if(size>=1048576&&size<1073741824) cout<<"该文件的大小为: "< else cout<<"该文件的大小为: "< } cout< fclose(file1); } cout<<"请输入指定目录的路径: "; cin>>b; CopyFile(a,b,false);//将c盘目录下的VMware.txt复制到u盘目录下。 //DeleteFile(a);//删除原路径目标文件 k=HANDLE=_findfirst(b,&file); if(k! =-1)//检测是否复制成功 { cout<<"已经完成了复制,而且该文件的名字为: "< k=_findnext(HANDLE,&file); } else cout<<"复制失败,请重新复制: "< _findclose(HANDLE); cout< } if(! GetVolumeInformation( szDrive, szDirveName, MAX_PATH, &dwVolumeSerialNumber, &dwMaximumComponentLength, &dwFileSystemFlags, szFileSystemNameBuffer, BUFSIZE )) { returnFALSE; } if(0! =lstrlen(szDirveName)&&strcmp(szDrive,"H: \\")==0)//输出盘的别名 { printf("Drivenameis%s\n",szDirveName); } returnTRUE;//若将其注释掉,则只显示C盘的信息 } intmain(intargc,char*argv[]) { intDiskCount=0; DWORDDiskInfo=GetLogicalDrives(); //利用GetLogicalDrives()函数可以获取系统中逻辑驱动器的数量,函数返回的是一个32位无符号整型数据。 while(DiskInfo)//通过循环操作查看每一位数据是否为1,如果为1则磁盘为真,如果为0则磁盘不存在。 { if(DiskInfo&1)//通过位运算的逻辑与操作,判断是否为1 { ++DiskCount; } DiskInfo=DiskInfo>>1;//通过位运算的右移操作保证每循环一次所检查的位置向右移动一位。 //DiskInfo=DiskInfo/2; } cout<<"逻辑磁盘数量: "< intDSLength=GetLogicalDriveStrings(0,NULL); //通过GetLogicalDriveStrings()函数获取所有驱动器字符串信息长度。 char*DStr=newchar[DSLength];//用获取的长度在堆区创建一个c风格的字符串数组 GetLogicalDriveStrings(DSLength,(LPTSTR)DStr); //通过GetLogicalDriveStrings将字符串信息复制到堆区数组中,其中保存了所有驱动器的信息。 intDType; intsi=0; BOOLfResult; signed_int64i64FreeBytesToCaller; signed_int64i64TotalBytes; signed_int64i64FreeBytes; for(inti=0;i //为了显示每个驱动器的状态,则通过循环输出实现,由于DStr内部保存的数据是A: \NULLB: \NULLC: \NULL,这样的信息,所以DSLength/4可以获得具体大循环范围 { chardir[3]={DStr[si],': ','\\'}; cout< DType=GetDriveType(DStr+i*4); //GetDriveType函数,可以获取驱动器类型,参数为驱动器的根目录 if(DType==DRIVE_FIXED) { cout<<"硬盘"; } elseif(DType==DRIVE_CDROM) { cout<<"光驱"; } elseif(DType==DRIVE_REMOVABLE) { cout<<"可移动式磁盘"; } elseif(DType==DRIVE_REMOTE) { cout<<"网络磁盘"; } elseif(DType==DRIVE_RAMDISK) { cout<<"虚拟RAM磁盘"; } elseif(DType==DRIVE_UNKNOWN) { cout<<"未知设备"; } fResult=GetDiskFreeSpaceEx( dir, (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes, (PULARGE_INTEGER)&i64FreeBytes); //GetDiskFreeSpaceEx函数,可以获取驱动器磁盘的空间状态,函数返回的是个BOOL类型数据 if(fResult)//通过返回的BOOL数据判断驱动器是否在工作状态 { cout<<"totalspace: "<<(float)i64TotalBytes/1024/1024<<"MB";//磁盘总容量 cout<<"freespace: "<<(float)i64FreeBytesToCaller/1024/1024<<"MB";//磁盘剩余空间 } else { cout<<"设备未准备好"; } cout< si+=4; } getdiskfreespace(); return0; } 使用说明: 程序会显示您的电脑上所有的磁盘数量,包括硬盘,光驱,可移动式磁盘,未知设备。 插入您的优盘,会显示您的优盘的可用的容量大小,总容量大小和剩余容量大小,还可以显示您的d盘的可用的容量大小,总容量大小和剩余容量大小。 当您插入优盘后,程序会检测到您的优盘已经插入,可以开始复制文件。 运行结果有一个举例,您可以根据例子,进行您想要的输入。 输入路径后,程序会判断文件是否存在,若存在,根据您的文件大小,您可以选择复制,输入您想要复制到的路径地方。 会判断您是否成功复制,若没有,重新复制。 设计和实验说明: 根据C++,运用GetDriveTypeW,GetDiskFreeSpaceEx,CopyFile,GetFileSize等函数,GetDriveTypeW获得磁盘数量和类型,驱动器类型,GetDiskFreeSpaceEx获取可用容量的大小,总容量大小和剩余量大小,CopyFile进行文件的复制,复制指定为一个新文件GetFileSize获得文件的大小。 总结: 学习了API,通过这次练习,了解了操作系统的文件系统的一些功能和应用,文件系统应用程序开发接口是系统提供的最重要,最基本的API集合之一,看了相关书籍,看到设计用户界面,很美观新颖,这次没有完成这个,会再接再厉学习。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 优盘 检测