版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、操作系統(tǒng)課程設(shè)計(jì)報(bào)告操作系統(tǒng)課程設(shè)計(jì)報(bào)告專 業(yè):計(jì)算機(jī)信息處理 【設(shè)計(jì)目的】1. 課程設(shè)計(jì)目的是通過一個(gè)簡單多用戶文件系統(tǒng)的設(shè)計(jì),加深理解文件系統(tǒng)的內(nèi)部功能和內(nèi)部實(shí)現(xiàn)。2. 結(jié)合數(shù)據(jù)結(jié)構(gòu)、程序設(shè)計(jì)、計(jì)算機(jī)原理等課程的知識,設(shè)計(jì)一個(gè)二級文件系統(tǒng),進(jìn)一步理解操作系統(tǒng)。3. 通過對實(shí)際問題的分析、設(shè)計(jì)、編程實(shí)現(xiàn),提高學(xué)生實(shí)際應(yīng)用、編程的能力【設(shè)計(jì)內(nèi)容】1、delete 刪除文件2、open 打開文件3、close 關(guān)閉文件4、write 寫文件【實(shí)驗(yàn)環(huán)境】windows7系統(tǒng) visual studio 2010【相關(guān)知識綜述】本文件系統(tǒng)采用兩級目錄,其中第一級對應(yīng)于用戶賬號,第二級對應(yīng)于用戶帳號下
2、的文件。另外,為了簡便文件系統(tǒng)未考慮文件共享,文件系統(tǒng)安全以及管道文件與設(shè)備文件等特殊內(nèi)容。首先應(yīng)確定文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu):主目錄、子目錄及活動(dòng)文件等。主目錄和子目錄都以文件的形式存放于磁盤,這樣便于查找和修改。用戶創(chuàng)建的文件,可以編號存儲于磁盤上。如:file0,file1,file2并以編號作為物理地址,在目錄中進(jìn)行登記。【設(shè)計(jì)思路】1 主要數(shù)據(jù)結(jié)構(gòu)#define maxname 25 /*the largest length of mfdname,ufdname,filename*/#define maxchild 50 /*the largest child每個(gè)用戶名下最多有50個(gè)文件*
3、/#define max (maxchild*maxchild) /*the size of fpaddrno*/typedef struct /*the structure of osfile定義主文件*/int fpaddr; /*file physical address*/ int flength; /*file length*/ int fmode; /*file mode:0-read only;1-write only;2-read and write; 3-protect;*/ char fnamemaxname; /*file name*/ osfile;typedef st
4、ruct /*the structure of osufd定義用戶文件目錄*/char ufdnamemaxname; /*ufd name*/osfile ufdfilemaxchild; /*ufd own file*/osufd;typedef struct /*the structure of osufdlogin定義登陸*/char ufdnamemaxname; /*ufd name*/ char ufdpword8; /*ufd password*/ osufd_login;typedef struct /*file open mode定義操作方式*/int ifopen; /*
5、ifopen:0-close,1-open*/ int openmode; /*0-read only,1-write only,2-read and write,3-initial*/osufd_openmode;2 主要函數(shù)void loginf(); /*login filesystem*/void dirf(); /*dir filesystem*/void createf(); /*create file*/void deletef(); /*delete file*/void modifyfm(); /*modify filemode*/void openf(); /*open f
6、ile*/void closef(); /*close file*/void readf(); /*read file*/void writef(); /*write file*/void quitf(); /*quit filesystem*/void cdf(); /*change dir*/void help();【主要程序段】1 delete函數(shù)void deletef() /*delete file*/ char fnamemaxname,str50,str150;int i,k,j;int fpaddrno1; if (strcmp(strupr(ltrim(rtrim(dirna
7、me),)=0) /*無法刪除主目錄的文件*/printf(nerror.please convert to ufd dir before delete.n);wgetchar=1;if (strcmp(strupr(dirname),strupr(username)!=0) /*無法刪除非自己目錄的文件*/printf(nerror.you can only modify filemode in yourself dir.n);wgetchar=1;elseprintf(nplease input filename:);gets(fname);/從鍵盤獲取所要?jiǎng)h除的文件名ltrim(rtri
8、m(fname);i=existf(fname);/獲取文件編號if (i=0)k=existd(username);if(ifopenki.ifopen=1)/*文件打開時(shí)無法刪除*/printf(nerror.%s is in open status. close it before delete.n,fname);wgetchar=1;else if(ufdk-ufdfilei.fmode=3)/*被保護(hù)的文件無法刪除*/ printf(nerror.%s is in protect status. close it before delete.n,fname);wgetchar=1;
9、else fpaddrno1=ufdk-ufdfilei.fpaddr;/獲取文件對應(yīng)的物理文件名fpaddrnofpaddrno1=0;/回收盤塊for(j=i;jufdfilej=ufdk-ufdfilej+1;/從被刪除的文件號開始,數(shù)組值全部前移一個(gè) strcpy(str,d:osfilefilefile);itoa(fpaddrno1,str1,10);/整數(shù)轉(zhuǎn)化成字符串strcat(str,str1);strcat(str,.txt);remove(str);/刪除物理文件fcountk-;/k用戶文件數(shù)量少1printf(n %sis deleted successfully.n
10、,fname);wgetchar=1;else/所要?jiǎng)h除的文件不存在 printf(nerror. %s dose not exist.n,fname);wgetchar=1;2 open函數(shù)void openf() /*open file*/ char fnamemaxname;int i,k,j; if (strcmp(strupr(dirname),strupr(username)!=0) /*在自己的目錄里才能打開*/printf(nerror.you can only open in yourself dir.n);wgetchar=1;else k=existd(username)
11、; for(j=0;jufdfilej.fname); printf(nplease input filename:);gets(fname);/獲取所要打開的文件名ltrim(rtrim(fname);i=existf(fname);/獲取目錄編號if (i=0)if(ifopenki.ifopen=1)/輸入的文件是打開的printf(nerror.%s is in open status.n,fname);wgetchar=1;else ifopenki.ifopen=1;/修改為打開的if(ufdk-ufdfilei.fmode=0)/*根據(jù)文件的模式設(shè)置打開模式*/ ifopenki
12、.openmode=0; else if(ufdk-ufdfilei.fmode=1) ifopenki.openmode=1; else if(ufdk-ufdfilei.fmode=2) ifopenki.openmode=2; else ifopenki.openmode=3; printf(n%s is opened successfullyn,fname); wgetchar=1;else/文件不存在printf(nerror. %s dose not exist.n,fname);wgetchar=1;3 close函數(shù)void closef() /*close file*/cha
13、r fnamemaxname;int i,k,j; if (strcmp(strupr(dirname),strupr(username)!=0) /*不在自己的目錄里沒法進(jìn)行*/printf(nerror.you can only close file in yourself dir.n);wgetchar=1;else k=existd(username); for(j=0;jufdfilej.fname); printf(nplease input filename:);gets(fname);/從鍵盤上讀入所要關(guān)閉的文件ltrim(rtrim(fname);i=existf(fname
14、);/獲取文件編號if (i=0)ifopenki.ifopen=0;/*關(guān)閉文件*/printf(n %s closed successfullyn,fname);wgetchar=1;else/所要關(guān)閉的文件不存在printf(nerror. %s dose not exist.n,fname);wgetchar=1;4 write函數(shù)void writef() /*write file*/int i,k,n=0;int length;char fnamemaxname,values1000;char str255,str1255,c;if (strcmp(strupr(ltrim(rtr
15、im(dirname),)=0) /只能寫自己目錄下的文件printf(nerror.please convert to ufd dir before write.n);wgetchar=1;return;printf(ncaution:open file firstn);printf(opened file(s) list:n);k=existd(dirname);/獲取目錄編號for(i=0;iufdfilei.fname);n+;if(n%4=0)&(n!=0) printf(n);printf(n%d files openned.n,n);if (n=0) wgetchar=1;/沒有
16、打開的文件if(n!=0)printf(nplease input filename:);gets(fname);/從鍵盤獲取所要寫的文件ltrim(rtrim(fname);i=existf(fname);/獲取文件編號if(i=0)if(ifopenki.ifopen=1)/如果文件是打開的if(ifopenki.openmode=1) |(ifopenki.openmode=2)/文件是只寫,或者是可讀可寫的itoa(ufdk-ufdfilei.fpaddr,str,10);/獲取文件對應(yīng)的物理地址strcpy(str1,file);strcat(str1,str);strcpy(str
17、,d:osfilefile);strcat(str,str1);strcat(str,.txt);fp_file=fopen(str,ab);/以二進(jìn)制只寫的形式打開,每次將內(nèi)容添加到文件末尾接著上一次內(nèi)容length=writef1();ufdk-ufdfilei.flength=ufdk-ufdfilei.flength+length;/計(jì)算總長度printf(nn%d length.n,ufdk-ufdfilei.flength);printf(nnyou have write file successfully!); fclose(fp_file);wgetchar=0;else if
18、(ifopenki.openmode=0)/文件是只讀的printf(nerror.%s has been opened with read only mode. it isnt write.n,fname);wgetchar=1;else/文件是保護(hù)的printf(nerror.%s has been opened with protect mode. it isnt write.n,fname);wgetchar=1;else /文件是關(guān)閉的printf(nerror.%s is in closing status. please open it before writen,fname);
19、wgetchar=1;else /所指定的文件不存在printf(nerror. %s does not exist.n,fname);wgetchar=1;【程序流程設(shè)計(jì)】1 總的功能結(jié)構(gòu)圖:2 部分子模塊程序流程圖(1)打開命令的程序流程圖:(2)關(guān)閉命令的程序流程圖:(3)寫命令的程序流程圖:(4)刪除命令的程序流程圖:【測試結(jié)果】1 刪除文件2 打開的文件不能刪除3 打開文件,其中已經(jīng)打開的文件不能再次打開3 關(guān)閉文件4 寫文件,其中只有打開了文件才能寫入5 寫文件6 只讀文件和保護(hù)文件不能寫入7 其他函數(shù)【參考文獻(xiàn)】計(jì)算機(jī)操作系統(tǒng),西安電子科技大學(xué)出版社,方敏主編,2004.8部分函
20、數(shù)含義引用于【源程序清單】#include stdio.h#include string.h#include conio.h#include stdlib.h#define maxname 25 /*the largest length of mfdname,ufdname,filename*/#define maxchild 50 /*the largest child每個(gè)用戶名下最多有50個(gè)文件*/#define max (maxchild*maxchild) /*the size of fpaddrno*/typedef struct /*the structure of osfile定
21、義主文件*/int fpaddr; /*file physical address*/ int flength; /*file length*/ int fmode; /*file mode:0-read only;1-write only;2-read and write; 3-protect;*/ char fnamemaxname; /*file name*/ osfile;typedef struct /*the structure of osufd定義用戶文件目錄*/char ufdnamemaxname; /*ufd name*/osfile ufdfilemaxchild; /*
22、ufd own file*/osufd;typedef struct /*the structure of osufdlogin定義登陸*/char ufdnamemaxname; /*ufd name*/ char ufdpword8; /*ufd password*/ osufd_login;typedef struct /*file open mode定義操作方式*/int ifopen; /*ifopen:0-close,1-open*/ int openmode; /*0-read only,1-write only,2-read and write,3-protect*/osufd
23、_openmode;void loginf(); /*login filesystem*/void dirf(); /*dir filesystem*/void createf(); /*create file*/void deletef(); /*delete file*/void modifyfm(); /*modify filemode*/void openf(); /*open file*/void closef(); /*close file*/void readf(); /*read file*/void writef(); /*write file*/void quitf();
24、/*quit filesystem*/void cdf(); /*change dir*/void help();char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/void inputpw(char *password); /*input password,use * replace*/int existd(char *dirname); /*whether dirname exist,exist-i,not exist-0*/
25、int writef1(); /*write file*/int existf(char *filename); /*whether filename exist,exist-i,not exist-0*/void setpano(int rorw); /*set physical address num*/int findpano(); /*find out physical address num*/int ucount=0; /*the count of mfds ufds用戶數(shù)*/int fcountmaxchild; /*the count of ufds files子文件數(shù)*/in
26、t loginsuc=0; /*whether login successfully登陸成功*/char usernamemaxname; /*record login users name22用戶名*/char dirnamemaxname;/*record current directory使用的用戶目錄*/int fpaddrnomax; /*record file physical address num物?理地址號,存放自己所創(chuàng)建的所有文件的地址*/int wgetchar; /*whether getchar()*/osufd *ufdmaxchild; /*ufd and ufd
27、 own files*/osufd_login ufd_lp;/用戶登錄結(jié)構(gòu)體類型的變量osufd_openmode ifopenmaxchildmaxchild; /*record file open/close*/file *fp_mfd,*fp_ufd,*fp_file_p,*fp_file;/file 是變量類型,實(shí)際上是語言定義的標(biāo)準(zhǔn)數(shù)據(jù)結(jié)構(gòu),用于文件void clrscr()/*清屏*/system(cls);void main()int i,choice1;char choice50; /*choice operation:dir,create,delete,open,delet
28、e,modify,read,write*/int choiceend=1; /*whether choice end*/fopen標(biāo)準(zhǔn)函數(shù),打開文件msd.txt,打開一個(gè)二進(jìn)制文件,只允許讀數(shù)據(jù),送返指針,指向file類型對象。if(fp_mfd=fopen(d:osfilemfd.txt,rb)=null)fp_mfd=fopen(d:osfilemfd.txt,wb);/打開一個(gè)二進(jìn)制文件,只允許寫數(shù)據(jù)fclose(fp_mfd);/關(guān)閉一個(gè)流for(i=0;i,strupr(dirname);/表示以字符串型輸出else printf(bad command or file name.
29、choose helpnd:%s,strupr(dirname);/strupr-變?yōu)榇髮懽帜竒ets(choice);strcpy(choice,ltrim(rtrim(strlwr(choice);/strlwr將字符串轉(zhuǎn)換為小寫形式,strcpy(dest,char)復(fù)制 /ltrim(rtrim()去掉輸入用戶名的頭部和尾部空格if (strcmp(choice,dir)=0) choice1=1;/strcmp相同為0else if(strcmp(choice,create)=0) choice1=2;else if(strcmp(choice,delete)=0) choice1=
30、3;else if(strcmp(choice,attrib)=0) choice1=4;else if(strcmp(choice,open)=0) choice1=5;else if(strcmp(choice,close)=0) choice1=6;else if(strcmp(choice,read)=0) choice1=7;else if(strcmp(choice,write)=0) choice1=8;else if(strcmp(choice,exit)=0) choice1=9;else if(strcmp(choice,cls)=0) choice1=10;else if
31、(strcmp(choice,cd)=0) choice1=11;else if(strcmp(choice,help)=0) choice1=20;else choice1=12;switch(choice1)case 1:dirf();choiceend=1;break;case 2:createf();choiceend=1;if(!wgetchar) getchar();break;case 3:deletef();choiceend=1;if(!wgetchar)getchar();break;case 4:modifyfm();choiceend=1;if(!wgetchar) g
32、etchar();break;case 5:openf();choiceend=1;if (!wgetchar) getchar();break;case 6:closef();choiceend=1;if (!wgetchar) getchar();break;case 7:readf();choiceend=1;if (!wgetchar) getchar();break;case 8:writef();choiceend=1;if (!wgetchar) getchar();break;case 9:printf(nyou have exited this system.); quitf
33、();exit(0);break;case 10:clrscr();choiceend=1;break;case 11:cdf();choiceend=1;break;/更改目錄名稱case 20:help();choiceend=1;break;default:choiceend=0;else printf(naccess denied.);char *rtrim(char *str) /*remove the trailing blanks.去掉登陸用戶名的尾空格*/int n=strlen(str)-1;while(n=0)if(*(str+n)!= )*(str+n+1)=0;brea
34、k;else n-;if (n0) str0=0;return str;char *ltrim(char *str) /*remove the heading blanks.去掉登陸用戶名的頭空格*/strrev(str);/字符的順序顛倒rtrim(str);strrev(str);return str;void setpano(int rorw) /*set physical address num,0-read,1-write物理地址*/int i,j;if (rorw=0)if(fp_file_p=fopen(d:osfilefilefile_p.txt,rb)=null)/只讀fp_
35、file_p=fopen(d:osfilefilefile_p.txt,wb);/只寫fclose(fp_file_p);fp_file_p=fopen(d:osfilefilefile_p.txt,rb);/只讀/fread讀數(shù)據(jù)(輸入地址,大小,個(gè)數(shù),提供數(shù)據(jù)的文件),sizeof是內(nèi)存空間的大小不是長度for(i=0;fread(&j,sizeof(int),1,fp_file_p)!=0;i+)fpaddrnoj=1;elsefp_file_p=fopen(d:osfilefilefile_p.txt,wb);/只寫for(i=0;imax;i+)if (fpaddrnoi=1)fwr
36、ite(&i,sizeof(int),1,fp_file_p);/fwrite寫數(shù)據(jù)輸出地址,字節(jié)數(shù),個(gè)數(shù),目標(biāo)文件)fclose(fp_file_p);void inputpw(char *password) /*input password,use * replace*/int j;for(j=0;j0)j-;putchar(b);putchar( );putchar(b);else j-;elsepasswordj=0; break;passwordj=0;int existd(char *dirname) /*whether dirname exist,exist-i,not exis
37、t-(-1)*/int i;int exist=0;for(i=0;iufdname),strupr(dirname)=0)exist=1;break;if (exist) return(i);else return(-1);int existf(char *filename) /*whether filename exist,exist-i,not exist-(-1)*/int i,j;int exist=0;j=existd(dirname);for(i=0;iufdfilei.fname),strupr(filename)=0)exist=1;break;if (exist) retu
38、rn(i);else return(-1);int findpano() /*find out physical address num*/int i;for(i=0;imax;i+)if (fpaddrnoi=0) fpaddrnoi=1;break;if (iufdname,strupr(ufd_lp.ufdname);fp_ufd=fopen(str,rb);fcountj=0;/當(dāng)前用戶文件數(shù)目for(i=0;fread(&ufdj-ufdfilei,sizeof(osfile),1,fp_ufd)!=0;i+,fcountj+)/記錄用戶文件ifopenji.ifopen=0;ifopenji.openmode=4;fclose(fp_ufd);fclose(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育技術(shù)助力小學(xué)生自然科學(xué)動(dòng)手實(shí)踐教學(xué)研究
- 網(wǎng)絡(luò)游戲開發(fā)與運(yùn)營協(xié)議
- 平房的買賣合同
- 法律服務(wù)采購項(xiàng)目政府采購合同
- 中介買賣房屋合同范本
- 家庭教育心理學(xué)在醫(yī)療領(lǐng)域的作用
- 教學(xué)資料數(shù)字化的用戶體驗(yàn)與服務(wù)創(chuàng)新研究
- 承包魚塘合同協(xié)議書
- 汽車公司銷售勞動(dòng)合同
- 簡單入股合伙人協(xié)議書范本
- 燃?xì)庥邢薰竟こ滩抗芾碇贫葏R編
- 2024年中國干粉涂料市場調(diào)查研究報(bào)告
- (自考)經(jīng)濟(jì)學(xué)原理中級(政經(jīng))課件 第二章 商品和貨幣
- ×××老舊小區(qū)改造工程施工組織設(shè)計(jì)(全面)
- 調(diào)解行業(yè)可行性分析報(bào)告
- 科創(chuàng)板知識題庫試題及答案
- GB/T 3324-2024木家具通用技術(shù)條件
- NGS二代測序培訓(xùn)
- 《材料合成與制備技術(shù)》課程教學(xué)大綱(材料化學(xué)專業(yè))
- 小紅書食用農(nóng)產(chǎn)品承諾書示例
- 釘釘OA辦公系統(tǒng)操作流程培訓(xùn)
評論
0/150
提交評論