第一篇:操作系統(tǒng)實(shí)習(xí)報(bào)告(磁盤(pán)文件操作)
大學(xué)
操作系統(tǒng)課程綜合實(shí)踐
題目:
磁盤(pán)文件操作
班級(jí):
姓名:
學(xué)號(hào):
指導(dǎo)教師:
2011年 12 月 23日
磁盤(pán)文件操作
摘要:
為了正確地實(shí)現(xiàn)文件的存取,文件系統(tǒng)設(shè)計(jì)了一組與存取文件有關(guān)的功能模塊,用戶(hù)可以用“訪問(wèn)指令”調(diào)用這些功能模塊,以實(shí)現(xiàn)文件的存取要求。我們把文件系統(tǒng)設(shè)計(jì)的這一組功能模塊稱(chēng)為“文件操作“,實(shí)驗(yàn)就是要模擬實(shí)現(xiàn)一些文件操作。文件操作不是獨(dú)立的,它和文件系統(tǒng)的其他部分密切相關(guān),若要實(shí)現(xiàn)文件操作就離不開(kāi)文件的目錄結(jié)構(gòu)、文件的組織結(jié)構(gòu)和磁盤(pán)空間的管理。因此,這個(gè)實(shí)習(xí)雖然是文件操作的模擬實(shí)現(xiàn),但還是必須模擬一部分文件的組織結(jié)構(gòu)、目錄結(jié)構(gòu)和磁盤(pán)空間管理的實(shí)現(xiàn)。
關(guān)鍵字:磁盤(pán)、文件、目錄、分配表。
一、實(shí)驗(yàn)內(nèi)容:
設(shè)計(jì)一個(gè)簡(jiǎn)單的文件系統(tǒng),用文件模擬磁盤(pán),用數(shù)組模擬緩沖區(qū),要求實(shí)現(xiàn); 1. 2. 3. 4. 支持多級(jí)目錄結(jié)構(gòu),支持文件的絕對(duì)路徑;
文件的邏輯結(jié)構(gòu)采用流式結(jié)構(gòu),物理結(jié)構(gòu)采用鏈接結(jié)構(gòu)中的顯示鏈接方式;
采用文件分配表;
實(shí)現(xiàn)的命令包括建立目錄、列目錄、刪除空目錄、建立文件、刪除文件、顯示文件內(nèi)容、打開(kāi)文件、讀文件、寫(xiě)文件(追加方式)、關(guān)閉文件、改變文件屬性。
最后編寫(xiě)主函數(shù)對(duì)所做工作進(jìn)行測(cè)試。
二、實(shí)驗(yàn)?zāi)康模?、2、3、4、文件的操作。
文件的邏輯結(jié)構(gòu)和物理結(jié)構(gòu) 磁盤(pán)空間的管理 磁盤(pán)目錄結(jié)構(gòu)
三、實(shí)驗(yàn)環(huán)境: Windows XP、VC++
四、程序運(yùn)行結(jié)果(詳圖):
程序運(yùn)行的主界面:用戶(hù)運(yùn)行命令7-建立目錄
用戶(hù)運(yùn)行命令1-建立文件:
顯示目錄內(nèi)容:
打開(kāi)文件:
寫(xiě)文件:
關(guān)閉文件:
再次顯示目錄內(nèi)容:
以上為程序的運(yùn)行的部分截圖。
五、程序清單: #define false 0 #define true 1 #include “stdio.h” //#include
char name[3];/*文件或目錄名*/ char type[2];/*文件類(lèi)型名*/ char attribute;/*屬性*/ char address;/*文件或目錄的起始盤(pán)塊號(hào)*/ char length;/*文件長(zhǎng)度,以盤(pán)塊為單位*/ }content;/*目錄結(jié)構(gòu)*/ #define n 5 /*模擬實(shí)驗(yàn)中系統(tǒng)允許打開(kāi)文件的最大數(shù)量*/ typedef struct { int dnum;/*磁盤(pán)盤(pán)塊號(hào)*/ int bnum;/*盤(pán)塊內(nèi)第幾項(xiàng)*/ }pointer;/*已打開(kāi)文件表中讀寫(xiě)指針的結(jié)構(gòu)*/ typedef struct {
char name[20];/*文件絕對(duì)路徑名*/ char attribute;/*文件的屬性,用1個(gè)字節(jié)表示,所以用了char類(lèi)型*/ int number;/*文件起始盤(pán)塊號(hào)*/ int length;/*文件長(zhǎng)度,文件占用的字節(jié)數(shù)*/ int flag;/*操作類(lèi)型,用“0”表示以讀操作方式開(kāi)文件,用“1”表示寫(xiě)操作pointer read;/*讀文件的位置,文件剛打開(kāi)時(shí)dnum為文件起始盤(pán)塊號(hào),bnumpointer write;/*寫(xiě)文件的位置,文件建立時(shí)dnum為文件起始盤(pán)塊號(hào),bnum方式打開(kāi)文件*/ 為“0”*/ 為“0”,打開(kāi)時(shí)為文件末尾*/ }OFILE;/*已打開(kāi)文件表項(xiàng)類(lèi)型定義*/ struct {
char buffer1[64];/*模擬緩沖1*/ content buffer2[8];/*模擬緩沖2*/ FILE *fc;/*模擬磁盤(pán)的文件指針*/
void copen(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;OFILE file[n];/*已打開(kāi)文件表*/ int length;/*已打開(kāi)文件表中登記的文件數(shù)量*/ }openfile;/*已打開(kāi)文件表定義*/
int sopen(char *name)/*在已打
開(kāi)
文
件
表
中
查
找
文
件//P172 //char *name;{
void dopen(char *name)/*在已打開(kāi)文件表中刪除文件name*/ //char *name;{
int iopen(content *x)/*在已打開(kāi)文件表中插入文件name*/ //content *x;{ int i;i=sopen(name);if(i==-1){
} copen(&openfile.file[i],&openfile.file[openfile.length-1]);openfile.length--;printf(“文件未打開(kāi)n”);else int i;i=0;while(i name*/ 依次查找已打開(kāi)文件表*/ if(i>=openfile.length)return(i);}/*查找sopen函數(shù)結(jié)束*/ }/*刪除函數(shù)結(jié)束*/ int i;i=sopen(x->name);if(i!=-1){ } else if(openfile.length==n){ } else { } //copen(&openfile.file[openfile.length],x);openfile.length++;return(true);printf(“已打開(kāi)文件表已滿(mǎn)n”);return(false);printf(“文件已經(jīng)打開(kāi)n”);return(false);}/*填寫(xiě)已打開(kāi)文件表函數(shù)結(jié)束*/ int allocate()/*分配一個(gè)磁盤(pán)塊,返回塊號(hào)*/ { */ //P173 int i;fseek(fc,0,SEEK_SET);/*將模擬磁盤(pán)的文件指針移至模擬磁盤(pán)FAT表*/ fread(buffer1,64L,1,fc);/*將FAT表中第一個(gè)磁盤(pán)塊讀入模擬緩沖for(i=3;i<63;i++)if(buffer1[i]==0){ /*FAT中的第i項(xiàng)為0,分配第i塊磁盤(pán)塊,修改FAT表,并且寫(xiě)回磁盤(pán)buffer1中*/ buffer1[i]=255; } fseek(fc,0,SEEK_SET);fwrite(buffer1,64L,1,fc);return(i);/*返回磁盤(pán)號(hào)*/ fread(buffer1,64L,1,fc);/*將FAT表中第二個(gè)磁盤(pán)塊讀入模擬緩沖for(i=0;i<63;i++) if(buffer1[i]==0){/*FAT中的第i項(xiàng)為0,分配第i+64塊磁盤(pán)塊,修改FAT表,并且寫(xiě) } printf(“已經(jīng)沒(méi)有磁盤(pán)空間n”);return(false);buffer1[i]=255;fseek(fc,-64L,SEEK_CUR);fwrite(buffer1,64L,1,fc);return(i+64);/*返回磁盤(pán)號(hào)*/ buffer1中*/ 回磁盤(pán)*/ }/*分配磁盤(pán)塊函數(shù)結(jié)束*/ int read_file(char *name,int length)/*讀文件函數(shù),文件路徑名name,讀取長(zhǎng)度length*/ //char *name;//int length;{ int i,t;//char ch;if((i=sopen(name))==-1){ } if(openfile.file[i].flag==1){ printf(“文件以寫(xiě)方式打開(kāi),不能讀n”);printf(“文件沒(méi)有打開(kāi)或不存在n”);return(false); } return 0;t=0;fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);fread(buffer1,64,1,fc);while(t openfile.file[i].read.dnum=buffer1[openfile.file[i].read.dnum%64] } } t++;openfile.file[i].read.bnum=0;fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);fread(buffer1,64,1,fc);/*讀取下一個(gè)*/ putchar(buffer1[openfile.file[i].read.bnum]);/*讀出一個(gè)字符(這if((t+1)%64==0)putchar('n');/*修改讀指針*/ openfile.file[i].read.bnum++;if(openfile.file[i].read.bnum>=64)/*一塊讀完,讀取下一個(gè)盤(pán)塊*/ { fseek(fc,openfile.file[i].read.dnum/64*64, SEEK_SET);fread(buffer1,64,1,fc);里是在屏幕上顯示)*/;/*修改讀指針*/ }/*讀函數(shù)結(jié)束*/ int write_file(char *name,char *buff,int length)//P174 /*寫(xiě)文件函數(shù)*/ //char *name;/*文件路徑名*/ //char *buff;/*存放準(zhǔn)備寫(xiě)入磁盤(pán)的內(nèi)容*/ //int length;/*寫(xiě)入內(nèi)容的長(zhǎng)度*/ { int i,t,dd;if((i=sopen(name))==-1)/*文件不存在,無(wú)法寫(xiě)*/ { } if(openfile.file[i].flag==0){ } t=0;fseek(fc,openfile.file[i].write.dnum*64L, SEEK_SET);fread(buffer1,64,1,fc);while(t 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);/*一塊寫(xiě)完,寫(xiě)回磁盤(pán)*/ if((dd=allocate())==false){ openfile.file[i].write.bnum--;openfile.file[i].length--;printf(“無(wú)磁盤(pán)空間,部分信息丟失,寫(xiě)失敗n”);return(false);printf(“文件以讀方式打開(kāi),不能寫(xiě)n”);return(false);printf(“文件沒(méi)有打開(kāi)或不存在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);/*一塊寫(xiě)完,寫(xiě)回磁盤(pán)*/ }/*寫(xiě)函數(shù)結(jié)束*/ int search(char *name,int flag,int *dnum,int *bnum)/*查找路徑名為name的文件或目錄,返回該目錄的起始盤(pán)塊號(hào) */ //char *name;//int flag;/*flag=8表示查找目錄,否則為文件*/ //int *dnum,*bnum;/*返回找到文件或目錄的目錄項(xiàng)的位置:盤(pán)塊dnum中第bnum項(xiàng)*/ { for(s=0;name[k]!='.'&&name[k]!='/'&&s<3&&name[k]!='