操作系統(tǒng)課程設(shè)計(jì)模擬一個(gè)簡單二級(jí)文件管理系統(tǒng)_第1頁
操作系統(tǒng)課程設(shè)計(jì)模擬一個(gè)簡單二級(jí)文件管理系統(tǒng)_第2頁
操作系統(tǒng)課程設(shè)計(jì)模擬一個(gè)簡單二級(jí)文件管理系統(tǒng)_第3頁
操作系統(tǒng)課程設(shè)計(jì)模擬一個(gè)簡單二級(jí)文件管理系統(tǒng)_第4頁
操作系統(tǒng)課程設(shè)計(jì)模擬一個(gè)簡單二級(jí)文件管理系統(tǒng)_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、模擬一個(gè)簡單二級(jí)文件管理系統(tǒng)設(shè)計(jì)目的:通過具體的文件存儲(chǔ)空間的管理、文件的物理結(jié)構(gòu)、目錄結(jié)構(gòu)和文件操作的實(shí)現(xiàn),加深對文件系統(tǒng)內(nèi)部功能和實(shí)現(xiàn)過程的理解。設(shè)計(jì)內(nèi)容:模擬一個(gè)簡單二級(jí)文件管理系統(tǒng) 一、實(shí)驗(yàn)內(nèi)容描述1 實(shí)驗(yàn)?zāi)繕?biāo)本實(shí)驗(yàn)的目的是通過一個(gè)簡單多用戶文件系統(tǒng)的設(shè)計(jì),加深理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實(shí)現(xiàn).2 實(shí)驗(yàn)要求為dos系統(tǒng)設(shè)計(jì)一個(gè)簡單的二級(jí)文件系統(tǒng).要求做到以下幾點(diǎn):可以實(shí)現(xiàn)下列命令:login 用戶登錄dir 列文件目錄create 創(chuàng)建文件delete 刪除文件open 打開文件close 關(guān)閉文件read 讀文件write 寫文件列目錄時(shí)要列出文件名、物理地址、保護(hù)碼和文件長度.源文

2、件可以進(jìn)行讀寫保護(hù).二、程序主要內(nèi)容1設(shè)計(jì)思路程序中要求每個(gè)用戶在登陸后才可對其擁有的文件進(jìn)行操作,用戶對于其他用戶的文件無操作權(quán).文件操作包括瀏覽、創(chuàng)建、刪除、打開、關(guān)閉、閱讀、寫入、修改模式.其他操作包括新建用戶、幫助、用戶登入、用戶登出、退出系統(tǒng).在程序文件夾下有個(gè)名為“file”的系統(tǒng)根目錄,此目錄下包括:一個(gè)名為“mfd”的文件,記錄所有注冊過的帳號(hào)及密碼;用戶文件,以用戶名作為文件名,內(nèi)容為其擁有的文件名及屬性;一個(gè)名為“keiji”的文件夾.“keiji”文件夾中包括:“file.p”指針文件,記錄所有已用的物理地址;一些以物理地址為名的文件,內(nèi)容為文件內(nèi)容.2 數(shù)據(jù)結(jié)構(gòu)file

3、結(jié)構(gòu)體系統(tǒng)文件數(shù)據(jù)結(jié)構(gòu):fpaddrint,文件的物理地址、flengthint,文件長度、fmodeint,文件模式 0.只讀;1.可寫;2.可讀寫;3.保護(hù)、 fnamechar,文件名;filemode結(jié)構(gòu)體文件狀態(tài)數(shù)據(jù)結(jié)構(gòu):isopenint,文件當(dāng)前狀態(tài),0.關(guān)閉;1.打開、modeint,文件模式 0.只讀;1.可寫;2.可讀寫;3.初始化;user結(jié)構(gòu)體用戶信息數(shù)據(jù)結(jié)構(gòu):unamechar,用戶名、upasswordchar,用戶密碼;userfile結(jié)構(gòu)體用戶文件數(shù)據(jù)結(jié)構(gòu):unamechar,用戶名、ufilefile,用戶擁有的文件數(shù)組.代碼:#include #includ

4、e #include #include #include #define maxuser 100 /定義最大mdf主目錄文件 #define maxdisk 512*1024 /模擬最大磁盤空間 #define commandamount 12 /對文件操作的指令數(shù) /存儲(chǔ)空間管理有關(guān)結(jié)構(gòu)體和變量 char diskmaxdisk; /模擬512k的磁盤存儲(chǔ)空間 typedef struct disttable /磁盤塊結(jié)構(gòu)體 int maxlength; int start; int useflag; disttable *next; disknode; disknode *diskhead

5、; struct filetable /文件塊結(jié)構(gòu)體 char filename10; int strat; /文件在磁盤存儲(chǔ)空間的起始地址 int length; /文件內(nèi)容長度 int maxlength; /文件的最大長度 char filekind3; /文件的屬性讀寫方式 struct tm *timeinfo; bool openflag; /判斷是否有進(jìn)程打開了該文件 /filetable *next; ; /兩級(jí)目錄結(jié)構(gòu)體 typedef struct user_file_directory /用戶文件目錄文件ufd /char filename10; filetable *f

6、ile; user_file_directory *next; ufd; /ufd *headfile; typedef struct master_file_directory /主文件目錄mfd char username10; char password10; ufd *user; mfd; mfd usertablemaxuser; int used=0; /定義mfd目錄中用已有的用戶數(shù) /文件管理 void filecreate(char filename,int length,char filekind); /創(chuàng)建文件 void filewrite(char filename);

7、 /寫文件 void filecat(char filename); /讀文件 void fileren(char filename,char rename); /重命名文件 void filefine(char filename); /查詢文件 void filedir(char username); /顯示某一用戶的所有文件 void fileclose(char filename); /關(guān)閉已打開的文件 void filedel(char filename); /刪除文件 void chmod(char filename,char kind); /修改文件的讀寫方式 int reques

8、tdist(int &startpostion,int maxlength); /磁盤分配查詢 void initdisk(); /初始化磁盤 void freedisk(int startpostion); /磁盤空間釋放 void diskshow(); /顯示磁盤使用情況 /用戶管理 void usercreate(); int login(); int userid=-1; /用戶登錄的id號(hào),值為-1時(shí)表示沒有用戶登錄 int main() char ordercommandamount10; strcpy(order0,create); strcpy(order1,rm); str

9、cpy(order2,cat); strcpy(order3,write); strcpy(order4,fine); strcpy(order5,chmod); strcpy(order6,ren); strcpy(order7,dir); strcpy(order8,close); strcpy(order9,return); strcpy(order10,exit); strcpy(order11,df); char command50,command_str110,command_str210,command_str35,command_str43; int i,k,j; int le

10、ngth; initdisk(); /初始化磁盤 for(i=0;inext=null; while(1) printf(*n); printf( 1、creat usern); printf( 2、loginn); printf(*n); printf(please chooce the function key:); int choice; scanf(%d,&choice); if(choice=1) usercreate(); else if(choice=2) userid=login(); else printf(您的輸入有誤,請重新選擇n); while(userid!=-1)

11、fflush(stdin); printf(n); printf( create-創(chuàng)建 格式:create a1 1000 rw,將創(chuàng)建名為a1,長度為1000字節(jié)可讀可寫的文件n); printf( rm-刪除 格式:rm a1,將刪除名為a1的文件n); printf( cat-查看文件內(nèi)容 格式:cat a1,顯示a1的內(nèi)容n); printf( write-寫入 格式:write a1n); printf( fine-查詢 格式:fine a1 ,將顯示文件 a1的屬性n); printf( chmod-修改 格式:chmod a1 r,將文件a1的權(quán)限改為只讀方式n); printf

12、( ren-重命名 格式:ren a1 b1 ,將a1改名為b1n); printf( dir-顯示文件 格式:dir aaa,將顯示aaa用戶的所有文件n); printf( df-顯示磁盤空間使用情況 格式:dfn); printf( close-關(guān)閉文件 格式:close a1,將關(guān)閉文件a1n); printf( return-退出用戶,返回登錄界面n); printf( exit-退出程序n); printf(n); printf(please imput your command:); gets(command); int select; for(i=0;commandi!= &c

13、ommandi!=0;i+) /command_str1字符串存儲(chǔ)命令的操作類型 command_str1i=commandi; k=i; command_str1k=0; for(i=0;i=0;i-) /把字符串轉(zhuǎn)換為十進(jìn)制 length+=(command_str3i-48)*j; j*=10; for(i=k+1,k=0;commandi!= &commandi!=0;i+,k+) command_str4k=commandi; command_str4k=0; filecreate(command_str2,length,command_str4);break; case 1:fil

14、edel(command_str2);break; case 2:filecat(command_str2);break; case 3: filewrite(command_str2);break; case 4:filefine(command_str2);break; case 5:for(i=k+1,k=0;commandi!= &commandi!=0;i+,k+) command_str3k=commandi; command_str3k=0; chmod(command_str2,command_str3);break; case 6:for(i=k+1,k=0;commandi

15、!=0;i+,k+) command_str3k=commandi; command_str3k=0; fileren(command_str2,command_str3);break; case 7:filedir(command_str2);break; case 8:fileclose(command_str2);break; case 9:ufd *p; for(p=usertableuserid.user-next;p!=null;p=p-next) /退出用戶之前關(guān)閉所有打的文件 if(p-file-openflag) p-file-openflag=false; system(c

16、ls); userid=-1;break; case 10:exit(0);break; case 11:diskshow();break; return 0; void usercreate() char c; char username10; int i; if(usedmaxuser) printf(請輸入用戶名:); for(i=0;c=getch();i+) if(c=13) break; else usernamei=c; printf(%c,c); usernamei=0; for(i=0;iused;i+) if(!strcmp(usertablei.username,user

17、name) printf(n); printf(該用戶名已存在,創(chuàng)建用戶失敗n); system(pause); return; strcpy(usertableused.username,username); printf(n); printf(請輸入密碼:); for(i=0;c=getch();i+) if(c=13) break; else usertableused.passwordi=c; printf(*); usertableuserid.passwordi=0; printf(n); printf(創(chuàng)建用戶成功n); used+; system(pause); else pr

18、intf(創(chuàng)建用戶失敗,用戶已達(dá)到上限n); system(pause); fflush(stdin); int login() char name10,psw10; char c; int i,times; printf(請輸入用戶名:); for(i=0;c=getch();i+) if(c=13) break; else namei=c; printf(%c,c); namei=0; for(i=0;iused;i+) if(!strcmp(usertablei.username,name) break; if(i=used) printf(n您輸入的用戶名不存在n); system(p

19、ause); return -1; for(times=0;times3;times+) memset(psw,0,sizeof(psw); printf(n請輸入密碼:); for(i=0;c=getch();i+) if(c=13) break; else pswi=c; printf(*); printf(n); for(i=0;imaxlength=maxdisk; diskhead-useflag=0; diskhead-start=0; diskhead-next=null; int requestdist(int &startpostion,int maxlength) int

20、flag=0; /標(biāo)記是否分配成功 disknode *p,*q,*temp; p=diskhead; while(p) if(p-useflag=0&p-maxlengthmaxlength) startpostion=p-start; q=(disknode *)malloc(sizeof(disknode); q-start=p-start; q-maxlength=maxlength; q-useflag=1; q-next=null; diskhead-start=p-start+maxlength; diskhead-maxlength=p-maxlength-maxlength;

21、 flag=1; temp=p; if(diskhead-next=null) diskhead-next=q; else while(temp-next) temp=temp-next; temp-next=q; break; p=p-next; return flag; void filecreate(char filename,int length,char filekind) /int i,j; time_t rawtime; int startpos; ufd *filenode,*p; for(p=usertableuserid.user-next;p!=null;p=p-next

22、) if(!strcmp(p-file-filename,filename) printf(文件重名,創(chuàng)建文件失敗n); system(pause); return; if(requestdist(startpos,length) filenode=(ufd *)malloc(sizeof(ufd); filenode-file=(filetable *)malloc(sizeof(filetable); /這一步必不可少,因?yàn)閒ilenode里面的指針也需要申請地址,否則filenode-file指向會(huì)出錯(cuò) strcpy(filenode-file-filename,filename); s

23、trcpy(filenode-file-filekind,filekind); filenode-file-maxlength=length; filenode-file-strat=startpos; filenode-file-openflag=false; time(&rawtime); filenode-file-timeinfo=localtime(&rawtime); filenode-next=null; if(usertableuserid.user-next=null) usertableuserid.user-next=filenode; else p=usertableu

24、serid.user-next; while(p-next) p=p-next; p-next=filenode; printf(創(chuàng)建文件成功n); system(pause); else printf(磁盤空間已滿或所創(chuàng)建文件超出磁盤空閑容量,磁盤空間分配失敗n); system(pause); void freedisk(int startpostion) disknode *p; for(p=diskhead;p!=null;p=p-next) if(p-start=startpostion) break; p-useflag=false; void filedel(char filen

25、ame) ufd *p,*q,*temp; q=usertableuserid.user; p=q-next; while(p) if(!strcmp(p-file-filename,filename) break; else p=p-next; q=q-next; if(p) if(p-file-openflag!=true) /先判斷是否有進(jìn)程打開該文件 temp=p; q-next=p-next; freedisk(temp-file-strat); /磁盤空間回收 free(temp); printf(文件刪除成功n); system(pause); else printf(該文件已被

26、進(jìn)程打開,刪除失敗n); system(pause); else printf(沒有找到該文件,請檢查輸入的文件名是否正確n); system(pause); void filecat(char filename) int startpos,length; int k=0; ufd *p,*q; q=usertableuserid.user; for(p=q-next;p!=null;p=p-next) if(!strcmp(p-file-filename,filename) break; if(p) startpos=p-file-strat; length=p-file-length; p

27、-file-openflag=true; /文件打開標(biāo)記 printf(*n); for(int i=startpos;kfile-filename); system(pause); else printf(沒有找到該文件,請檢查輸入的文件名是否正確n); system(pause); void filewrite(char filename) ufd *p,*q; q=usertableuserid.user; int i,k,startpos; for(p=q-next;p!=null;p=p-next) if(!strcmp(p-file-filename,filename) break

28、; if(p) if(!strcmp(p-file-filekind,r) /判斷文件類型 printf(該文件是只讀文件,寫入失敗n); system(pause); return; char str500; printf(please input content:n); gets(str); startpos=p-file-strat; p-file-openflag=true; /文件打開標(biāo)記 p-file-length=strlen(str); if(p-file-lengthp-file-maxlength) printf(寫入字符串長度大于該文件的總長度,寫入失敗n); syste

29、m(pause); return; for(i=startpos,k=0;knext;p!=null;p=p-next) if(!strcmp(p-file-filename,filename) break; if(p) printf(*n); printf(文件名:%sn,p-file-filename); printf(文件長度:%dn,p-file-maxlength); printf(文件在存儲(chǔ)空間的起始地址:%dn,p-file-strat); printf(文件類型:%sn,p-file-filekind); printf(創(chuàng)建時(shí)間:%sn,asctime(p-file-timeinfo); printf(*n); system(pause);

溫馨提示

  • 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)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論