![操作系統(tǒng)課程設(shè)計(jì)-模擬文件系統(tǒng)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/2e6dbe31-6abc-4fb2-8ee3-8333991b3773/2e6dbe31-6abc-4fb2-8ee3-8333991b37731.gif)
![操作系統(tǒng)課程設(shè)計(jì)-模擬文件系統(tǒng)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/2e6dbe31-6abc-4fb2-8ee3-8333991b3773/2e6dbe31-6abc-4fb2-8ee3-8333991b37732.gif)
![操作系統(tǒng)課程設(shè)計(jì)-模擬文件系統(tǒng)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/2e6dbe31-6abc-4fb2-8ee3-8333991b3773/2e6dbe31-6abc-4fb2-8ee3-8333991b37733.gif)
![操作系統(tǒng)課程設(shè)計(jì)-模擬文件系統(tǒng)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/2e6dbe31-6abc-4fb2-8ee3-8333991b3773/2e6dbe31-6abc-4fb2-8ee3-8333991b37734.gif)
![操作系統(tǒng)課程設(shè)計(jì)-模擬文件系統(tǒng)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/2e6dbe31-6abc-4fb2-8ee3-8333991b3773/2e6dbe31-6abc-4fb2-8ee3-8333991b37735.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、操作系統(tǒng)課程設(shè)計(jì)- 模擬文件系統(tǒng)班級(jí):計(jì)算機(jī)044 姓名:夏鑫學(xué)號(hào): 2004121228 一實(shí)驗(yàn)?zāi)康挠酶呒?jí)語言編寫和調(diào)試一個(gè)簡單的文件系統(tǒng)。模擬文件管理的工作過程。加深理解文件系統(tǒng)的內(nèi)部功能和內(nèi)部實(shí)現(xiàn)。二基本要求在任意一個(gè)os 下,建立一個(gè)大文件,把它假象成一張盤,在其中實(shí)現(xiàn)一個(gè)簡單的模擬unix 文件系統(tǒng)??梢詫?shí)現(xiàn)下列幾條命令dir 列文件目錄create 創(chuàng)建文件md 創(chuàng)建目錄delf 刪除文件deld 刪除目錄cd 改變當(dāng)前目錄savef 保存文件saved 保存目錄help 獲得命令的幫助exit 退出系統(tǒng)三設(shè)計(jì)思想說明1.設(shè)計(jì)環(huán)境課程設(shè)計(jì)的環(huán)境是windows xp sp2 操作系
2、統(tǒng)。在windows 系統(tǒng)中創(chuàng)建一個(gè)較大容量的文件,作為所設(shè)計(jì)文件系統(tǒng)的假想的“文件卷”,從而編寫各程序模塊。2.開發(fā)環(huán)境課程設(shè)計(jì)所使用的開發(fā)環(huán)境是vc+ 6.0 3.基本思想以 1m 的存儲(chǔ)器空間作為文件空間,空間“分塊”。超級(jí)塊,在最前面,共占3.2k 個(gè)字節(jié)。其中0.2k 個(gè)字節(jié)存放目錄節(jié)點(diǎn)的位示圖,1k個(gè)字節(jié)存放文件節(jié)點(diǎn)的位示圖,2k字節(jié)存放盤塊節(jié)點(diǎn)的位示圖。用位狀態(tài)=0 表示空閑,狀態(tài)=1 表示已分配。后半部用于存放目錄接點(diǎn)和文件接點(diǎn)。超級(jí)塊不參與文件空間的動(dòng)態(tài)分配。其他塊用于存貯目錄接點(diǎn)和文件接點(diǎn)的信息。四需求分析該模擬文件系統(tǒng)包括目錄文件(簡稱目錄)、普通文件(簡稱文件) ,并實(shí)
3、現(xiàn)下面一些基本功能:1改變目錄:cd 目錄名,工作目錄轉(zhuǎn)到指定的目錄下。2創(chuàng)建文件:create 文件名,創(chuàng)建一個(gè)指定名字的新文件,即在目錄中增加一項(xiàng),不考慮文件的內(nèi)容。3刪除文件:delf 文件名,刪除指定的文件。4顯示目錄: dir 目錄名 ,顯示目錄下全部文件和第一級(jí)子目錄,如果沒有指定路徑名,則顯示當(dāng)前目錄下的內(nèi)容。5創(chuàng)建目錄:md 目錄名,再指定路徑下創(chuàng)建指定的目錄,或者在沒有指定路徑時(shí),在當(dāng)前目錄下創(chuàng)建子目錄。6刪除目錄:deld 目錄名,刪除指定的目錄。7. 保存文件savef 目錄名保存指定文件8. 保存目錄saved 文件名,保存指定目錄9. 獲得命令幫助help 10. 退
4、出文件系統(tǒng)exit 要考慮的特殊情況:1.各個(gè)命令對(duì)全路徑和相對(duì)路徑的支持.目錄不存在時(shí),給出錯(cuò)誤信息.不能用 cd 進(jìn)入文件.相對(duì)路徑的解析.路徑中的空格剔除2.新建目錄或文件時(shí)的問題重名問題 ; 目錄或文件的名字長度限制; 目錄或文件的名字中包含不合法字符(注意空格 ) 3.刪除目錄或文件時(shí)的問題刪除不存在的文件或目錄,給出錯(cuò)誤提示刪除目錄時(shí)目錄不為空; 如果該目錄為空,則可刪除,否則給出是否做刪除,刪除操作將該目錄下的全部文件和子目錄都刪除進(jìn)入到某個(gè)目錄下,卻要?jiǎng)h除本目錄或者上級(jí)目錄4.保存目錄和文件時(shí)的問題保存不存在的文件和目錄,給出錯(cuò)誤的提示保存目錄時(shí),應(yīng)當(dāng)保存其下的的子目錄和文件五
5、系統(tǒng)設(shè)計(jì)1.流程圖2.數(shù)據(jù)結(jié)構(gòu)目錄文件結(jié)點(diǎn)信息存儲(chǔ)結(jié)構(gòu):struct dir_node /目錄節(jié)點(diǎn) systemtime ctime; /創(chuàng)建時(shí)間 char dir_name32; /目錄名 int child_dir8; /子目錄索引 int dir_count; /當(dāng)前子目錄數(shù) int child_file16; /子文件索引 int file_count; /當(dāng)前子文件數(shù) int parent; /父目錄索引 文件目錄存儲(chǔ)位置存儲(chǔ)結(jié)構(gòu):struct file_node /文件節(jié)點(diǎn) systemtime ctime; /創(chuàng)建時(shí)間char file_name32; /文件名int block
6、4; /該文件占有的磁盤塊索引打開文件系統(tǒng)接收命令并處理命令輸入不是exit 的命令當(dāng)沒有用戶使用時(shí),輸入命令為exit 關(guān)閉文件系統(tǒng)int block_count; /該文件當(dāng)前占有的磁盤塊數(shù)int file_length; /文件長度int parent; /父目錄索引 ; 文件、目錄、盤塊的占用的標(biāo)志位int dir_flagdir_num; /各目錄節(jié)點(diǎn)占用標(biāo)志,0 表示空閑, 1 表示被占用int file_flagfile_num; /各文件節(jié)點(diǎn)的占用標(biāo)志int block_flagblock_num; /磁盤塊的占用標(biāo)志常駐內(nèi)存的標(biāo)志文件(目錄)修改的標(biāo)志位和標(biāo)志文件(目錄)修改
7、標(biāo)志位的標(biāo)志位int dir_change_flagdir_num; /用于標(biāo)志目錄節(jié)點(diǎn)的修改int file_change_flagfile_num; /用于標(biāo)志文件節(jié)點(diǎn)的修改int dirflag_flagdir_num; /用于標(biāo)志dir_flagdir_num的修改int fileflag_flagfile_num; /用于標(biāo)志file_flagfile_num的修改int blockflag_flagblock_num; /用于標(biāo)志block_flagblock_num的修改記錄當(dāng)前路徑和當(dāng)前目錄的全局變量int curr; /當(dāng)前目錄索引dir_node *curr_dir; /當(dāng)
8、前目錄節(jié)點(diǎn)指針char curr_path512; /當(dāng)前路徑3.主要模塊說明創(chuàng)建文件int get_file(int parent,char *file_name) /創(chuàng)建文件節(jié)點(diǎn),成功則返回文件的索引號(hào),失敗返回-1 int index; if(search(parent,file_name,1,index)!=-1) / 搜索在父目錄下是否有同名文件存在,有則創(chuàng)建失敗 printf(file name repeated!n); return -1; for(int i=0;ifile_count; p-child_filetop=pos; p-file_count+; dir_chang
9、e_flagparent+; return pos; int create(char *name) /創(chuàng)建文件的主調(diào)函數(shù), 前提是已經(jīng)取得要?jiǎng)?chuàng)建文件的索引 /成功返回文件的索引號(hào),否則返回-1 int parent,p=0; parent=get_parent(name,p); if(parent=-1) /找不到父目錄,輸入錯(cuò)誤,創(chuàng)建失敗 printf(path name error!n); return -1; return create_file(parent,name+p); /開始創(chuàng)建文件 創(chuàng)建目錄int create_dir(int parent,char *dir_name) /
10、在指定的目錄下創(chuàng)建目錄,如果成功則返回目錄 /的索引號(hào),否則返回-1 if(dirparent.dir_count=8) /如果父目錄已滿,則創(chuàng)建失敗 printf(parent directory is full!n); return -1; int pos=get_dir(parent,dir_name); /開始創(chuàng)建目錄if(pos=-1) printf(create directory error!n); return -1; dir_node *p=&dirparent; /修改父目錄的控制信息int top=p-dir_count; p-child_dirtop=pos;
11、p-dir_count+; dir_change_flagparent+; return pos; int md(char *name) /創(chuàng)建目錄的主調(diào)函數(shù),它的參數(shù)只有用戶輸入 /如果創(chuàng)建成功,則返回目錄的索引號(hào),否則int parent,p=0; /返回 -1 parent=get_parent(name,p); if(parent=-1) /父目錄找不到,輸入有誤,創(chuàng)建失敗 printf(path name error!n); return -1; return create_dir(parent,name+p); /開始創(chuàng)建目錄 刪除文件void del_file(int pos)
12、/刪除文件,調(diào)用該函數(shù)的前提是已經(jīng)取得要?jiǎng)h除文件的索引號(hào) return_block(pos); /釋放磁盤塊file_flagpos=0; fileflag_flagpos+; file_change_flagpos=0; int del_file(int parent,char *file_name) /在指定的目錄下刪除文件,刪除成功則返回文件的 /索引號(hào),否則返回-1 int del_pos,index; if(del_pos=search(parent,file_name,1,index)=-1)/搜索該文件是否存在,不存在則刪除失敗 printf(the file to delete
13、 not exist!n); return -1; del_file(del_pos); /開始刪除文件dir_node *p=&dirparent; /修改父目錄的控制信息if(p-file_count=2) int top=p-file_count-1; p-child_fileindex=p-child_filetop; p-file_count-; dir_change_flagparent+; return del_pos; int delfile(char *name) /刪除文件的主調(diào)函數(shù),前提是知道了刪除文件的名字 int parent,p=0; parent=get_
14、parent(name,p); if(parent=-1) printf(path name error!n); return -1; return del_file(parent,name+p); 刪除目錄void del_dir(int pos) /刪除指定的目錄節(jié)點(diǎn),該目錄已經(jīng)為空 dir_flagpos=0; dirflag_flagpos+; dir_change_flagpos=0; void del(int pos) /刪除一個(gè)指定目錄及它下面的所有文件及所有目錄 for(int i=0;idirpos.file_count;i+) /刪除當(dāng)前目錄下的所有文件del_file(d
15、irpos.child_filei); for(i=0;i=2) /修改父目錄的控制信息 int top=dirparent.dir_count-1; dirparent.child_dirindex=dirparent.child_dirtop; dirparent.dir_count-; dir_change_flagparent+; 保存文件void savefile(int file_id) /顯式保存文件的核心函數(shù) if(fileflag_flagfile_id%2!=0) /如果創(chuàng)建或刪除,需要寫回磁盤 write_bit(file_id,1); fileflag_flagfile
16、_id=0; if(file_change_flagfile_id0) /如果控制信息被修改,需要寫回磁盤 write_inode(file_id,1); file_change_flagfile_id=0; for(int i=0;ifilefile_id.block_count;i+) int temp=filefile_id.blocki; if(blockflag_flagtemp%2!=0) /如果磁盤塊被釋放或被占用,需要寫回磁盤 write_bit(temp,2); blockflag_flagtemp=0; int save_file(int parent,char *file
17、_name) /顯式保存文件 int pos,index; if(pos=search(parent,file_name,1,index)=-1) printf(the file not exist in current directory!n); return -1; savedir(parent); /保存父目錄savefile(pos); return pos; int savefile(char *name) /保存文件的主調(diào)函數(shù),前提知道了要保存的文件名 int parent,p=0; parent=get_parent(name,p); if(parent=-1) printf(p
18、ath name error!n); return -1; return save_file(parent,name+p); 保存目錄void save_dir(int dir_id) /保存空目錄函數(shù) if(dirflag_flagdir_id%2!=0) /如果刪除或創(chuàng)建,需要寫回磁盤 write_bit(dir_id,0); dirflag_flagdir_id=0; if(dir_change_flagdir_id0) /如果控制信息被修改,需要寫回磁盤 write_inode(dir_id,0); dir_change_flagdir_id=0; void savedir(int d
19、ir_id) /保存一個(gè)目錄,及它的所有父目錄,用了遞歸 if(dir_id=-1) return; save_dir(dir_id); savedir(dirdir_id.parent); void save(int dir_id) /保存一個(gè)目錄及它下面的所有目錄及文件 /用了遞歸for(int i=0;idirdir_id.dir_count;i+) save(dirdir_id.child_diri); for(i=0;idirdir_id.file_count;i+) savefile(dirdir_id.child_filei); save_dir(dir_id); int sav
20、e_dir(int parent,char *dir_name) /顯式保存目錄 int pos,index; if(pos=search(parent,dir_name,0,index)=-1) printf(the file not exist in current directory!n); return -1; savedir(parent); /保存父目錄save(pos); /保存自身及下面的所有文件及目錄write_bit(pos,0); return pos; int saved(char *name) /保存目錄的主調(diào)函數(shù),前提是知道了保存目錄的名字 int parent,p
21、=0; parent=get_parent(name,p); if(parent=-1) printf(path name error!n); return -1; return save_dir(parent,name+p); 改變目錄void paste(int dir_id) /用于設(shè)置當(dāng)前路徑 if(dir_id=0) return; paste(dirdir_id.parent); strcat(curr_path,dirdir_id.dir_name); strcat(curr_path,/); int change_dir(char *name) /改變工作目錄,成功則返回該目
22、/錄的索引號(hào),否則返回-1 int parent,p=0,pos,index; if(strcmp(name,/)=0) pos=0; else if(strcmp(name,.)=0) pos=curr_dir-parent; else parent=get_parent(name,p); if(parent=-1) printf(path name error!n); return -1; pos=search(parent,name+p,0,index); if(pos=-1) /如果該目錄不存在,則失敗 printf(the dictory not exist!n); return -
23、1; curr_path3=0; paste(pos); curr=pos; /改變當(dāng)前目錄及路徑curr_dir=&dircurr; return curr; 顯示當(dāng)前目錄下的文件和子目錄信息void show_dir(int dir_id) /以下幾個(gè)函數(shù)用于顯示當(dāng)前目錄下面的目錄和文件, /跟上面不同的是, 它不能顯示目錄及文件之間的關(guān)系,printf(%s,dirdir_id.dir_name); /但它可以顯示一些細(xì)節(jié),如創(chuàng)建時(shí)間,文件for(int i=strlen(dirdir_id.dir_name);i20;i+) printf( ); printf(); for(i
24、=25;i30;i+) printf( ); printf(%d-%.2d-%.2d%.2d:%.2d:%.2dn,dirdir_id.ctime.wyear,dirdir_id.ctime.wmonth,dirdir_id.ctime.wday,dirdir_id.ctime.whour,dirdir_id.ctime.wminute,dirdir_id.ctime.wsecond); void show_file(int file_id) /顯示一個(gè)文件printf(%s,filefile_id.file_name); for(int i=strlen(filefile_id.file_n
25、ame);i20;i+) printf( ); printf(); for(i=26;i30;i+) printf( ); printf(%d-%.2d-%.2d%.2d:%.2d:%.2d,filefile_id.ctime.wyear,filefile_id.ctime.wmonth,filefile_id.ctime.wday,filefile_id.ctime.whour,filefile_id.ctime.wminute,filefile_id.ctime.wsecond); for(i=0;i8;i+) printf( ); int length=filefile_id.file_
26、length; printf(len: %d bytesn,length); void show(int dir_id) /顯示目錄及文件的核心函數(shù),用了遞歸思想for(int i=0;idirdir_id.file_count;i+) show_file(dirdir_id.child_filei); for(i=0;ifile_count); /統(tǒng)計(jì)文件數(shù)printf(n%d dirs.n,curr_dir-dir_count); /統(tǒng)計(jì)目錄數(shù)獲得系統(tǒng)的命令的幫助void help() /打印命令及解釋 printf(commands: explanation:nn); printf( exit -exit!n); printf( di
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 虞美人(春花秋月何時(shí)了)(教學(xué)設(shè)計(jì))-2024-2025學(xué)年高一語文必修上冊(cè)同步備課系列(統(tǒng)編版2019)
- 企業(yè)廣告設(shè)計(jì)服務(wù)合同模板
- 大理石瓷磚地面施工方案
- 平口混凝土攪拌機(jī)施工方案
- 18 老人車(教學(xué)設(shè)計(jì)) -小學(xué)科學(xué)二年級(jí)機(jī)械結(jié)構(gòu)課程
- 第3課觀察系統(tǒng)(教學(xué)設(shè)計(jì))2023-2024學(xué)年浙教版信息技術(shù)五年級(jí)下冊(cè)
- 第4單元 第3課 第6課時(shí) 同步備課教學(xué)設(shè)計(jì) 人教版歷史與社會(huì)八年級(jí)上冊(cè)
- 2025至2030年中國腰包式氣脹救生衣數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國電信通訊局端產(chǎn)品數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國漸開線花鍵聯(lián)接球面滾子聯(lián)軸器數(shù)據(jù)監(jiān)測研究報(bào)告
- 社區(qū)老年人日間照料中心運(yùn)營方案(技術(shù)方案)
- 項(xiàng)目保密工作實(shí)施方案
- (2024年)五年級(jí)下冊(cè)綜合實(shí)踐活動(dòng)全部教案
- 2023年河南省對(duì)口升學(xué)英語試題真題+答案
- 藥品經(jīng)營和使用質(zhì)量監(jiān)督管理辦法培訓(xùn)試題及答案2023年9月27日國家市場監(jiān)督管理總局令第84號(hào)公布
- 電競產(chǎn)業(yè)園方案
- 高甘油三酯血癥性急性胰腺炎診治急診專家共識(shí)2021解讀
- 【數(shù)學(xué) 】變化率問題(1)課件-2023-2024學(xué)年高二下學(xué)期數(shù)學(xué)人教A版(2019)選擇性必修第二冊(cè)
- 蘇教版六年級(jí)下冊(cè)數(shù)學(xué)第二單元《圓柱與圓錐》單元分析及全部教案+每課作業(yè)設(shè)計(jì)
- 精密測量課程中的思政案例弘揚(yáng)工匠精神助力科技強(qiáng)國
- 殘疾人就業(yè)服務(wù)
評(píng)論
0/150
提交評(píng)論