大学操作系统课程综合实践题目:磁盘文件操作班级:姓名:学号:指导教师:2011年12月23日磁盘文件操作摘要:为了正确地实现文件的存取,文件系统设计了一组与存取文件有关的功能模块,用户可以用“访问指令”调用这些功能模块,以实现文件的存取要求。我们把文件系统设计的这一组功能模块称为“文件操作“,实验就是要模拟实现一些文件操作。文件操作不是独立的,它和文件系统的其他部分密切相关,若要实现文件操作就离不开文件的目录结构、文件的组织结构和磁盘空间的管理。因此,这个实习虽然是文件操作的模拟实现,但还是必须模拟一部分文件的组织结构、目录结构和磁盘空间管理的实现。关键字:磁盘、文件、目录、分配表。一、实验内容:设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区,要求实现;1.支持多级目录结构,支持文件的绝对路径;2.文件的逻辑结构采用流式结构,物理结构采用链接结构中的显示链接方式;3.采用文件分配表;4.实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件(追加方式)、关闭文件、改变文件属性。最后编写主函数对所做工作进行测试。二、实验目的:1、文件的操作。2、文件的逻辑结构和物理结构3、磁盘空间的管理4、磁盘目录结构三、实验环境:WindowsXP、VC++四、程序运行结果(详图):程序运行的主界面:用户运行命令7-建立目录用户运行命令1-建立文件:显示目录内容:打开文件:写文件:关闭文件:再次显示目录内容:以上为程序的运行的部分截图。五、程序清单:#definefalse0#definetrue1#includestdio.h//#includefcntl#includestring.h//#paramwarning(disable:4996)FILE*x1,*x2;typedefstruct{charname[3];/*文件或目录名*/chartype[2];/*文件类型名*/charattribute;/*属性*/charaddress;/*文件或目录的起始盘块号*/charlength;/*文件长度,以盘块为单位*/}content;/*目录结构*/#definen5/*模拟实验中系统允许打开文件的最大数量*/typedefstruct{intdnum;/*磁盘盘块号*/intbnum;/*盘块内第几项*/}pointer;/*已打开文件表中读写指针的结构*/typedefstruct{charname[20];/*文件绝对路径名*/charattribute;/*文件的属性,用1个字节表示,所以用了char类型*/intnumber;/*文件起始盘块号*/intlength;/*文件长度,文件占用的字节数*/intflag;/*操作类型,用0表示以读操作方式开文件,用1表示写操作方式打开文件*/pointerread;/*读文件的位置,文件刚打开时dnum为文件起始盘块号,bnum为0*/pointerwrite;/*写文件的位置,文件建立时dnum为文件起始盘块号,bnum为0,打开时为文件末尾*/}OFILE;/*已打开文件表项类型定义*/struct{OFILEfile[n];/*已打开文件表*/intlength;/*已打开文件表中登记的文件数量*/}openfile;/*已打开文件表定义*/charbuffer1[64];/*模拟缓冲1*/contentbuffer2[8];/*模拟缓冲2*/FILE*fc;/*模拟磁盘的文件指针*/voidcopen(OFILE*x1,OFILE*x2)//OFILE*x1,*x2;{strcpy(x1-name,x2-name);x1-attribute=x2-attribute;x1-number=x2-number;x1-length=x2-length;x1-flag=x2-flag;x1-read.dnum=x2-read.dnum;x1-read.bnum=x2-read.bnum;x1-write.dnum=x2-write.dnum;x1-write.bnum=x2-write.bnum;}intsopen(char*name)/*在已打开文件表中查找文件name*///P172//char*name;{inti;i=0;while(iopenfile.length&&strcmp(openfile.file[i].name,name)!=0)/*依次查找已打开文件表*/i++;if(i=openfile.length)return(-1);return(i);}/*查找sopen函数结束*/voiddopen(char*name)/*在已打开文件表中删除文件name*///char*name;{inti;i=sopen(name);if(i==-1)printf(文件未打开\n);else{copen(&openfile.file[i],&openfile.file[openfile.length-1]);openfile.length--;}}/*删除函数结束*/intiopen(content*x)/*在已打开文件表中插入文件name*///content*x;{inti;i=sopen(x-name);if(i!=-1){printf(文件已经打开\n);return(false);}elseif(openfile.length==n){printf(已打开文件表已满\n);return(false);}else{//copen(&openfile.file[openfile.length],x);openfile.length++;return(true);}}/*填写已打开文件表函数结束*/intallocate()/*分配一个磁盘块,返回块号*/{inti;fseek(fc,0,SEEK_SET);/*将模拟磁盘的文件指针移至模拟磁盘FAT表*/fread(buffer1,64L,1,fc);/*将FAT表中第一个磁盘块读入模拟缓冲buffer1中*/for(i=3;i63;i++)if(buffer1[i]==0){/*FAT中的第i项为0,分配第i块磁盘块,修改FAT表,并且写回磁盘*/buffer1[i]=255;//P173fseek(fc,0,SEEK_SET);fwrite(buffer1,64L,1,fc);return(i);/*返回磁盘号*/}fread(buffer1,64L,1,fc);/*将FAT表中第二个磁盘块读入模拟缓冲buffer1中*/for(i=0;i63;i++)if(buffer1[i]==0){/*FAT中的第i项为0,分配第i+64块磁盘块,修改FAT表,并且写回磁盘*/buffer1[i]=255;fseek(fc,-64L,SEEK_CUR);fwrite(buffer1,64L,1,fc);return(i+64);/*返回磁盘号*/}printf(已经没有磁盘空间\n);return(false);}/*分配磁盘块函数结束*/intread_file(char*name,intlength)/*读文件函数,文件路径名name,读取长度length*///char*name;//intlength;{inti,t;//charch;if((i=sopen(name))==-1){printf(文件没有打开或不存在\n);return(false);}if(openfile.file[i].flag==1){printf(文件以写方式打开,不能读\n);return0;}t=0;fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);fread(buffer1,64,1,fc);while(tlength&&buffer1[openfile.file[i].read.bnum]!='#'){putchar(buffer1[openfile.file[i].read.bnum]);/*读出一个字符(这里是在屏幕上显示)*/if((t+1)%64==0)putchar('\n');/*修改读指针*/openfile.file[i].read.bnum++;if(openfile.file[i].read.bnum=64)/*一块读完,读取下一个盘块*/{fseek(fc,openfile.file[i].read.dnum/64*64,SEEK_SET);fread(buffer1,64,1,fc);openfile.file[i].read.dnum=buffer1[openfile.file[i].read.dnum%64];/*修改读指针*/openfile.file[i].read.bnum=0;fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);fread(buffer1,64,1,fc);/*读取下一个*/}t++;}}/*读函数结束*/intwrite_file(char*name,char*buff,intlength)//P174/*写文件函数*///char*name;/*文件路径名*///char*buff;/*存放准备写入磁盘的内容*///intlength;/*写入内容的长度*/{inti,t,dd;if((i=sopen(name))==-1)/*文件不存在,无法写*/{printf(文件没有打开或不存在\n);return(false);}if(openfile.file[i].flag==0){printf(文件以读方式打开,不能写\n);return(false);}t=0;fseek(fc,openfile.file[i].write.dnum*64L,SEEK_SET);fread(buffer1,64,1,fc);while(tlength){buffer1[openfile.file[i].write.bnum]=buff[t];openfile.file[i].write.bnum++;openfile.file[i].length++;if(openfile.file[i].write.bnum=64){fseek(fc,openfile.file[i].write.dnum*64L,SEEK_SET);fwrite(buffer1,64,1,fc);/*一块写完,写回磁盘*/if((dd=allocate())==false){openfile.file[i].write.bnum--;openfile.file[i].length--;printf(无磁盘空间,部分信息丢失,写失败\n);return(false);}/*if*/fseek(fc,openfile.file[i].write.dnum/64*64L,SEEK_SET);fread(buffer1,64,1,fc);buffer1[openfile.file[i].write.dnum%64]=dd;fseek(fc,openfile.file[i].write.dnum/64*64L,SEEK_SET);fwrite(buffer1,64,1,fc);openfile.file[i].write.dnum=dd;openfile.file[i].write.bnum=0;}/*if*/t++;}/*while*/fseek(fc,openfile.file[i].write.dnum*64L,SEEK_SET);fwrite(buffer1,64,1,fc);/*一块写完,写回磁盘*/}/*写函数结束*/intsearch(char*name,intflag,int*dnum,int*bnum)/*查找路径名为name的文件或目录,返回该目录的起始盘块号*///char*na