多用戶多目錄文件系統(tǒng)(實(shí)驗(yàn)報(bào)告、完整源代碼版)_第1頁
多用戶多目錄文件系統(tǒng)(實(shí)驗(yàn)報(bào)告、完整源代碼版)_第2頁
多用戶多目錄文件系統(tǒng)(實(shí)驗(yàn)報(bào)告、完整源代碼版)_第3頁
多用戶多目錄文件系統(tǒng)(實(shí)驗(yàn)報(bào)告、完整源代碼版)_第4頁
多用戶多目錄文件系統(tǒng)(實(shí)驗(yàn)報(bào)告、完整源代碼版)_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、廣東工業(yè)大學(xué)課程設(shè)計(jì)任務(wù)書(源代碼在附錄)題目名稱多用戶多級目錄文件系統(tǒng)的實(shí)現(xiàn)學(xué)生學(xué)院計(jì)算機(jī)學(xué)院專業(yè)班級2008級軟件工程2班6900一、課程設(shè)計(jì)的內(nèi)容本課程設(shè)計(jì)要求設(shè)計(jì)一個模擬的多用戶多級目錄的文件系統(tǒng)。 通過具體的文 件存儲空間的管理、文件的物理結(jié)構(gòu)、 目錄結(jié)構(gòu)和文件操作的實(shí)現(xiàn),加深對文件 系統(tǒng)內(nèi)部功能和實(shí)現(xiàn)過程的理解。二、課程設(shè)計(jì)的要求與數(shù)據(jù)1. 在內(nèi)存中開辟一個虛擬磁盤空間作為文件存儲器,在其上實(shí)現(xiàn)一個多用戶多 目錄的文件系統(tǒng)。2. 文件物理結(jié)構(gòu)可采用顯式鏈接或其他方法。3. 磁盤空閑空間的管理可選擇位示圖或其他方法。如果采用位示圖來管理文件存儲空間,并采用顯式鏈接分配方式,則可以將位

2、示圖合并到FAT中。4 .文件目錄結(jié)構(gòu)采用多用戶多級目錄結(jié)構(gòu),每個目錄項(xiàng)包含文件名、物理地址、長度等信息,還可以通過目錄項(xiàng)實(shí)現(xiàn)對文件的讀和寫的保護(hù)。目錄組織方式 可以不使用索引結(jié)點(diǎn)的方式,但使用索引結(jié)點(diǎn),則難度系數(shù)為1.2。(1)(2)(3)(4)(5)(6)(7)(8)(9)5.設(shè)計(jì)一個較實(shí)用的用戶界面,方便用戶使用。要求提供以下相關(guān)文件操作: 具有l(wèi)ogin (用戶登錄)createopen read write close delete系統(tǒng)初始化(建文件卷、提供登錄模塊) 文件的創(chuàng)建: 文件的打開: 文件的讀: 文件的寫: 文件關(guān)閉: 刪除文件: 創(chuàng)建目錄(建立子目錄): mkdir(1

3、0)改變當(dāng)前目錄:cd(11)列出文件目錄:dir(12)退出:logout6.系統(tǒng)必須可實(shí)際演示,選用程序設(shè)計(jì)語言:C+ +、C等。1.11.21.31.42.12.22.32.42.53.13.23.33.43.53.63.73.83.9設(shè)計(jì)思想說明設(shè)計(jì)環(huán)境設(shè)計(jì)思想存儲空間管理目錄結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)虛擬磁盤用戶的數(shù)據(jù)文件目錄文件管理目錄文件的類管理用戶的類功能實(shí)現(xiàn)登陸系統(tǒng)系統(tǒng)初始化文件的創(chuàng)建文件的打開文件刪除文件的讀創(chuàng)建目錄查看當(dāng)前目錄刪除目錄3.10返回上一級目錄3.11退出四、操作思想五、界面演示5.1登陸界面5.2管理員登陸成功后的界面5.3用戶登陸成功后的界面八、系統(tǒng)具體運(yùn)行演示6.1文

4、件的創(chuàng)建與查看(讀文件)6.2目錄的創(chuàng)建與查看6.3文件系統(tǒng)空間的查看七、實(shí)驗(yàn)體會八、收集的資料及主要參考文獻(xiàn)目錄11一、設(shè)計(jì)思想說明1.1設(shè)計(jì)環(huán)境a)程序設(shè)計(jì)語言:C+語言b)計(jì)算機(jī)及操作系統(tǒng):PC機(jī),WindowsXPc)開發(fā)平臺:Microsoft Visual C+ 6.0 企業(yè)版d)運(yùn)行平臺:PC機(jī),WindowsXP1.2設(shè)計(jì)思想文件系統(tǒng)是操作系統(tǒng)中負(fù)責(zé)管理和存取文件信息的機(jī)構(gòu), 它具有“按名存取” 的功能。文件系統(tǒng)主要實(shí)現(xiàn)對具體的文件存取空間的管理、文件的物理結(jié)構(gòu)、 目 錄結(jié)構(gòu)管理和文件操作。本實(shí)驗(yàn)中的文件系統(tǒng)是多用戶多級目錄的文件系統(tǒng)。實(shí)驗(yàn)中定義用戶的上限為5個,目錄結(jié)構(gòu)采用多

5、級目錄結(jié)構(gòu)。1.3存儲空間管理系統(tǒng)中的數(shù)據(jù)文件,需要為之分配磁盤空間。采用模擬方法,虛擬磁盤為一 個10000大小的一維數(shù)組:disk_block10000 ,0表示空閑,1表示已分配出去。使用混合索引分配方式來為存儲文件分配所在外存的塊號: 當(dāng)文件大小較小 時,采用直接地址,索引結(jié)點(diǎn)的每項(xiàng)存放文件數(shù)據(jù)的盤塊的盤塊號; 當(dāng)文件大小 較大時,采用一次間接地址,即一級索引;當(dāng)文件非常大時,采用多次間接地址, 即二級索引。為了提咼即樹形目錄 如下圖所1.4目錄結(jié)構(gòu)目錄結(jié)構(gòu)的組織,關(guān)系到文件系統(tǒng)的存取速度、安全性、共享性。 目錄的檢索速度和文件系統(tǒng)的性能, 采用了多目錄結(jié)構(gòu)來組織目錄, 結(jié)構(gòu),主目錄稱

6、為根目錄,數(shù)據(jù)文件為樹葉,其他的目錄為樹的結(jié)點(diǎn)。示。二、數(shù)據(jù)結(jié)構(gòu)2.1虛擬磁盤,初始化時所有盤塊置 0初始化所有磁盤塊為空閑for(i=0;i<10000;i+) disk_blocki=0; disk_e mp ty=10000;/22用戶的數(shù)據(jù)文件,即樹葉typ edef struct UFDchar n ame10;int attribute;int len gth;int a10;int *p1;int (*p 2)100; struct UFD *n ext;UFD;/2.32.4存儲文件信息文件名屬性 長度/為文件本身分配10個空間 一級索引,100個空間/二級索引,100*

7、100個空間/文件鏈的下一結(jié)點(diǎn)目錄文件,即樹結(jié)構(gòu)中樹的結(jié)點(diǎn)typ edef struct DIRDIR* above; char n ame10; int len gth;DIR *n ext;UFD *File_head;DIR *Dir_head;DIR;/存儲目錄信息/上一結(jié)點(diǎn)目錄名目錄的大小下一結(jié)點(diǎn)此目錄下的文件指針此目錄下目錄鏈表指針/管理目錄文件的類,每個用戶都是其的對象class Cuse/定義管理用戶目錄的類DIR *now;UFD *Fhead;DIR *Dhead;/當(dāng)前目錄/文件的頭結(jié)點(diǎn)/根目錄的目錄鏈頭結(jié)點(diǎn)char code10; char n ame10; int l

8、en gth; int status;public:/ /代碼省略/密碼用戶名用戶空間大小是否獲得空間/ 2.5管理用戶的類,管理員是其的對象/用戶類class Cdisk public:Cuse user5;char code10;int dis_disk();/int first_dele_user();/int dele_user(i nt);/int n ew_user();/int set_code();int log in( char);/用戶個數(shù)最多為5/管理員密碼 顯示磁盤的使用情況刪除用戶的準(zhǔn)備工作 具體實(shí)現(xiàn)刪除用戶查看當(dāng)前用戶與外存空間使用情況,后創(chuàng)建新用戶 /設(shè)置新密碼/

9、登陸Cdisk();/構(gòu)造函數(shù)virtualCdisk();/ 虛函數(shù),析構(gòu);三、功能實(shí)現(xiàn)3.1登陸系統(tǒng)系統(tǒng)中設(shè)置了管理員和用戶兩種登陸模式。管理員的用戶名為“管理員”, 默認(rèn)密碼為123,可以后期修改密碼。用戶初始化時不存在,在登陸時系統(tǒng)發(fā)現(xiàn) 不存在任何用戶則自動要求用戶先注冊一用戶,并在注冊成功后為用戶登陸。3.2系統(tǒng)初始化(建文件卷、提供登錄模塊)for(i=0;i<10000;i+)/初始化所有磁盤塊為空閑disk_blocki=0;disk_e mp ty=10000;int Cdisk:log in( char b)/登陸3.33.43.53.6文件的創(chuàng)建:int Cuse:

10、 new_file() 文件的打開:openint Cuse:o pen _file() 文件刪除:int Cuse:first_dele_file() int Cuse:dele_file(UFD *f) / 文件的讀:int Cuse:dis_file()/建立新文件/打開文件/刪除文件的前面工作 具體實(shí)現(xiàn)刪除文件查看文件3.73.8創(chuàng)建目錄(建立子目錄):int Cuse:new_dir() 查看當(dāng)前目錄:int Cuse:dis_dir(DIR *d)/ /int Cuse:dis_ no w()DIR *Cuse:get_ no w() / 刪除目錄:int Cuse:first_d

11、ele_dir() int Cuse:dele_dir(DIR *p) 3.10 返回上一級目錄:int Cuse:goback() 3.11退出:在主菜單中用flag標(biāo)記實(shí)現(xiàn)3.9/建立新目錄顯示目錄顯示當(dāng)前目錄得到當(dāng)前目錄路徑/刪除目錄的前奏/具體實(shí)現(xiàn)刪除目錄的工作/向上返回四、操作思想(創(chuàng)建)后,將自動獲得一個根各個用戶的名字不能相同。在每個用戶注冊目錄(root ),在此目錄中,可以創(chuàng)建多個目錄(同一父目錄下,不能同名)和 多個數(shù)據(jù)文件。在root目錄里,進(jìn)入一個新建的子目錄,則又可以在此子目錄里創(chuàng)建多個 目錄和數(shù)據(jù)文件。依次類推,實(shí)現(xiàn)樹形結(jié)構(gòu)。但同一父目錄下,目錄項(xiàng)和數(shù)據(jù)文 件都不能

12、重名。五、界面演示5.1登陸界面陸眷陸統(tǒng)理戶出晴輸入選擇:5.2管理員登陸成功后的界面筲理員登陸成功IJ hrf .1 dv-w-vJI." " " 1. 戶口 盾窗 戶戶前碼陸 用暫密登 建回 創(chuàng)刪查修返gS*:usei*5.3用戶登陸成功后的界面在該界面中,功能選擇菜單正面顯示了用戶名為“user",并同時顯示了當(dāng)前所處的目錄為根目錄“ root”。此處,如當(dāng)前處在多級目錄里,將把目錄路徑 詳細(xì)列出,用到的實(shí)現(xiàn)函數(shù)為D.user n.dis_dir(D.user n.get_ no w();如下圖所示。root d dd ddd六、系統(tǒng)具體運(yùn)行演示6

13、.1文件的創(chuàng)建與查看(讀文件)請輸入建立的文件名:FilE七度;12屬性只讀,1:讀寫” 0請輸入要查看的文件名*ile比為只諫文fr,占用硬盤塊號如下3LO1 2116.2目錄的創(chuàng)建與查看g錄名稱A3 盟 rill A包含如下目錄:目錄大入0Q0&課象包墻辣Fllel file29012文件屬性1&6.3文件系統(tǒng)空間的查看管理員登陸成功!戶口 用窗 戶戶前碼陸 用彎密登 建屠改回 創(chuàng)刪查僂返用戶名 userl u.ser2 usep3請選擇:占用空間大小21200212 9788七、實(shí)驗(yàn)體會本次課程設(shè)計(jì)是利用C+程序語言編寫的,由于對 C+的自學(xué)不夠深,導(dǎo)致 在調(diào)試與編譯時出

14、現(xiàn)了很大的困難,但在有關(guān) C+實(shí)踐指導(dǎo)書的幫助下,許多問 題都逐步得到了解決。文件系統(tǒng)的要求的功能很多,程序很長。但此次實(shí)驗(yàn)無疑是對我C+知識的一次磨練,使得我深深體會到它在實(shí)現(xiàn)對象操作和相關(guān)數(shù)據(jù)封 閉操作的好處。在設(shè)計(jì)此系統(tǒng)時,方發(fā)覺自己對文件系統(tǒng)理解得不夠透徹。 例如在考慮如何 實(shí)現(xiàn)多用戶多目錄時,差點(diǎn)就走進(jìn)了如何在二級目錄里實(shí)現(xiàn)的死胡同。后來, 耐 心回到這學(xué)期學(xué)習(xí)的課本內(nèi)容上,才醒悟要利用樹形結(jié)構(gòu)。不然, 是無法實(shí)現(xiàn)多 用戶情況下的多目錄多文件層層嵌套。如何保證在子目錄里進(jìn)行文件操作 (數(shù)據(jù)文件的創(chuàng)建、刪除)時造成的當(dāng)前 目錄空間大小變化同步更新到先輩目錄的空間大小,這困擾了我很久。在

15、參考了操作系統(tǒng)實(shí)驗(yàn)教程后,利用了目錄類中的 above (指向上一目錄結(jié)點(diǎn)),當(dāng)前目錄空間變化時,即循環(huán)向上同步變化先輩目錄的大小,直到根目錄為止。另外,實(shí)驗(yàn)中用到了 now (目錄指針)來指向當(dāng)前所處的目錄。在同一目錄下,如何實(shí)現(xiàn)多目錄或多數(shù)據(jù)文件的保存, 實(shí)驗(yàn)時我先是用數(shù)組 結(jié)構(gòu),但后來發(fā)覺用指針鏈表更為方便,因?yàn)檫@樣就不必限制數(shù)據(jù)文件和子目錄 的個數(shù),雖然指針對內(nèi)存的申請、釋放掌握要求更為嚴(yán)格??偠灾?,操作系統(tǒng)的課程設(shè)計(jì),不僅提升了自己的程序設(shè)計(jì)及編寫技巧, 更大大地加深了對操作系統(tǒng)的文件管理的了解。八、收集的資料及主要參考文獻(xiàn)123計(jì)算機(jī)操作系統(tǒng),湯小丹等,西安電子科技大學(xué)出版社 操

16、作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書,傅秀芬,廣東工業(yè)大學(xué)(自編) 操作系統(tǒng)實(shí)驗(yàn)教程,袁寶華,清華大學(xué)出版社4 C+上機(jī)實(shí)踐指導(dǎo)教程(第三版),Nell Dale著,馬樹奇譯,電子工業(yè)出版社附錄:)!/此程序包含三個源代碼文件!(disk.h, disk.cpp, menu.cpp/調(diào)試與編譯環(huán)境:VC+6.0 /C+/主源代碼文件為disk.cpp / /*disk h*/disk.h,磁盤頭文件,虛擬/以下的是對 VC編譯器的檢查 #if !defined(AFX DISK H 1FAB24AE C718 49FF A915 94211192B8BC INCLUDED ) #define AFX DISK H

17、 1FAB24AE C718 49FF A915 94211192B8BC INCLUDED./VC+ 6.0=1200 #if MSC VER>1000 #pragma once #en dif /_MSC_VER>1000 extern int disk_block10000; exter n int disk_e mp ty;17typ edef struct UFD/存儲文件信息char n ame10;int attribute;/文件名屬性in t le ngth;/長度/int a10;int *p1;in t (* p2)100; struct UFD *n ext

18、;為文件本身分配/ 一級索引,/二級索引,10個空間100個空間 100*100個空間/UFD;存儲目錄信息typ edef struct DIRDIR* above;/上一結(jié)點(diǎn)char n ame10; in t le ngth;DIR *n ext;/UFD *File_head;/下一結(jié)點(diǎn)此目錄下的文件指針DIR *Dir_head;/此目錄下目錄鏈表指針DIR;DIR *now;UFD *Fhead;/DIR *Dhead;/public:;char code10; char n ame10; in t le ngth;int status;/當(dāng)前目錄文件的頭結(jié)點(diǎn)根目錄的目錄鏈頭結(jié)點(diǎn)密

19、碼用戶名用戶空間大小是否獲得空間void set_status(i nt);int dele_user();int dis_file();int dis_dir(DIR *d);/int get_le ngth();char const *get_ name(); char const *get_code();int get_status();int set_user(char *,char *);/ DIR *get_ no w();int dele_file(UFD *f);int dele_dir(DIR*);Cuse();Cuse();int goback();int dis_ no

20、w();int n ew_file();int n ew_dir();int open _dir();int open _file();int first_dele_file();int first_dele_dir();int set_code();/顯示文件所占外存塊號當(dāng)前路徑設(shè)置用戶名與密碼/刪除文件刪除目錄構(gòu)造析構(gòu)返回上級 顯示當(dāng)前目錄刪除文件的前部分工作刪除目錄的前部分工作class Cdisk public:/用戶類Cuse user5;char code10;int dis_disk();int first_dele_user();int dele_user(i nt);/用戶個

21、數(shù)最多為5int n ew_user();/查看當(dāng)前用戶與外存空間使用情況,后創(chuàng)建新用int set_code(); in t logi n( char); Cdisk(); virtualCdisk();/;#en dif設(shè)置新密碼II登陸虛函數(shù),析構(gòu)!defi ned(AFX DISK H 1FAB24AE C718 49FF A915 94211192B8BC INCLUDED )II*disk cpp*#i nclude"disk.h"#in clude"me nu.cpp"#in clude<stri ng.h>#in clude&

22、lt;stdlib.h>#in clude<iostream.h>#i ncludevioma nip .h> in tdisk_block10000;int disk_e mpty;Cdisk:Cdisk() 管理磁盤的類,構(gòu)造函數(shù)int i=0;char code10="123456" for(i=0;i<10000;i+)disk_blocki=0;/初始化所有磁盤塊為空閑IIthis->user0.set_user("stude nt","123");/ disk_e mp ty=10000

23、;cout.setf(ios:left);/設(shè)置輸出方式默認(rèn)一個用戶Cdisk:Cdisk()/析構(gòu)int Cdisk:dele_user(i nt i)/Cdisk 類 dele user 的構(gòu)造Cuse C;C=useri;useri.dele_user();II調(diào)用Cuse類的成員函數(shù)int dele_user()return 1;int Cdisk:dis_disk()/檢查磁盤信息int i=0;cout<<setw(14)<<" 用戶名"<<setw(14)<<"占用空間大小"<<e

24、ndl; for(i=0;i<5;i+)/存在的用戶的信息if(useri.get_status()=1)cout<<setw(14)<<useri.get_ name()<<setw(14)<<useri.get_le ngth()<<e ndl;cout<<"已用空間:"<<10000-disk_empty<<endl<<"剩余空間:"<<disk_e mp ty<<e ndl;return 1;/登陸int Cd

25、isk:logi n( char b)char n10,c10;int i;if(b='1')cout<<"用戶:管理員"<<endl;cout<<"密碼:默認(rèn) n"<<endl;system( "p ause");return 1;elseif(!user0.get_status()i=0;cout<<"當(dāng)前用戶為空,/當(dāng)前不存在用戶歡迎注冊!useri.set_status(1); cout<<"請輸入用戶名:"&

26、lt;<e ndl;/"<<e ndl;為新用戶分配權(quán)利cin>>n;cout<<"請輸入密碼:"<<e ndl;cin>>c;useri.set_user( n,c);/調(diào)用Cuse的成員函數(shù),傳遞用戶名與密碼"<<e ndl;cout<<"恭喜,創(chuàng)建用戶成功!return i;12elsecout<<"用戶名:" cin>>n;H.cout<<"密碼: cin>>c;cout

27、<<e ndl;19for(i=0;i<5;i+)/查找是否存在此用戶if(useri.get_status()if(!strcm p(n, useri.get_ name()/存在方比較/相等時為0,此判斷為匹/密碼匹配if(!strcm p( c,useri.get_code()cout<<"cout<<"登陸成功! "<<e ndl;歡迎"<<useri.get_name()<<"登陸"<<endl;return i; elsecout&l

28、t;<"密碼錯誤"<<endl;return -1;cout<<"此用戶不存在! "<<endl;return -1;int Cdisk:set_code()/設(shè)置新密碼char temp 110,te mp 210; cout<<"請輸入原密碼"<<endl;/無疑是針對當(dāng)前用戶進(jìn)行操作,故直接 codecin> >te mp1;if(strc mp (te mp 1,code)cout<<"原密碼錯誤!"<<e

29、ndl;return 0; while(1)cout<<"請輸入新密碼:"<<endl;cin> >te mp1;cout<<"請?jiān)俅屋斎胄旅艽a:"<<endl;cin> >te mp2;if(strc mp (te mp 1,te mp 2)cout<<"兩次密碼不相同,請重輸 !"<<endl; break;strc py (code,te mp 1); break; cout<<"密碼設(shè)置成功!"<

30、;<endl;/保存新密碼return 1;int Cdisk: new_user()/準(zhǔn)備創(chuàng)建新用戶char n10,c10;int i=0,j; for(i=0;i<5;i+)if(useri.get_status()=0)/是否有此用戶,此尚未存在break;if(i=5)cout<<"已經(jīng)達(dá)到最大用戶5個,不能再創(chuàng)建!"<<endl;return 0;useri.set_status(1);cout<<"請輸入用戶名:"<<endl;/為新用戶分配權(quán)利cin>>n;if(i&

31、gt;0)for(j=0;j<i-1;j+)if(!strc mp (userj.get_ name(), n)/已有其它用戶存在cout<<"此用戶名已存在!"<<endl;return 0; cout<<"請輸入密碼:"<<e ndl;cin>>c;/調(diào)用Cuse的成員函數(shù),傳遞用戶名與密碼"<<e ndl;/刪除用戶useri.set_user( n,c);cout<<"恭喜,創(chuàng)建用戶成功!return 1;int Cdisk:first_

32、dele_user()char n10,c;int i;cout<<"請輸入你要刪除的用戶名"<<endl;cin>>n;for(i=0;i<5;i+)/在查找用戶的同時,得到用戶序號 iif(!strcm p( useri.get_ name( ),n)&&useri.get_status()break;/找到,跳出if(i=5)cout<<"出錯啦,此用戶不存在!"<<endl;return 0;cout<<"確認(rèn)刪除此用戶?確認(rèn)Y,取消任意鍵&q

33、uot;<<endl;cin>>c;if(c!='Y'&&c!='y')cout<<"已經(jīng)取消刪除!"<<endl;return 0;this->dele_user(i);cout<<"用戶刪除成功"<<endl;return 1;Cuse:Cuse()/構(gòu)造函數(shù),初始化成員status=O;/len gth=O;no w=0;Fhead=O;Dhead=O;Cuse:Cuse()/用戶權(quán)利,即是否被創(chuàng)建標(biāo)記 空間當(dāng)前目錄文件目錄

34、析構(gòu),清除程序占用的內(nèi)存disk_e mp ty+=le ngth;len gth=0;UFD *f=Fhead;DIR *d=Dhead;/文件/目錄int Cuse: new_file() /建立新文件while(f!=0)if(f->n ext=0) this->dele_file(f); f=0;break;while(f- >n ext- >n ext!=O)f=f->n ext;this->dele_file(f- >n ext); f->n ext=0;f=Fhead;while(d!=0)if(d- >n ext=0)thi

35、s->dele_dir(d);d=0;break;while(d->n ext->n ext!=0) d=d->n ext;this->dele_dir(d->n ext);d->n ext=0;d=Dhead;int i=0,j=0;UFD *f,*p=0;DIR *D;p=new UFD;/開辟一個新的文件結(jié)構(gòu)體if(p=0)cout<<"無可用內(nèi)存空間,創(chuàng)建文件失?。?quot;<<endl;return 1;cout<<"請輸入建立的文件名:cin>>p->n ame;

36、if(no w=0) f=Fhead;elsef=no w->File_head;H./根目錄下的文件鏈當(dāng)前目錄下的文件鏈檢查是否文件重名while(f!=0)if(!strcm p(p->n ame,f- >n ame)cout<<"此文件已存在!"<<endl;/退出return 0;f=f->n ext;cout<<"rr<<"cin>>p->le ngth; cout<<"rr<<"長度:"屬性(0 :只

37、讀,cin>>p->attnbute;cout<<e ndl;if(p->le ngth>disk_e mp ty)cout<<"文件太大,空間不足,1讀寫):"/空間不足當(dāng)前空間為:"<<disk_e mp ty<<e ndl;delete p;return 0;disk_e mp ty=disk_e mpty-p->le ngth;/for(i=0;i< p->le ngth&&i<10;i+)for(j;j<10000;j+)if(di

38、sk_blockj=0)p->ai=j;disk_blockj=1;j+;break;/空閑剩余空閑盤塊文件較小時,直接地址,文件數(shù)據(jù)盤塊位示圖法得到此空間標(biāo)記為已分配出去跳出尋找,為文件分配下一空間p-> p1=0;p-> p2=0;if(p->le ngth>10)p-> p1=new in t100;/for(i=10;i< p->le ngth&&i <110;i+) for(j;j<10000;j+) if(disk_blockj=0) (p-> p1)i-10=j; disk_blockj=1; j+

39、;break;if(p->le ngth>110)一級索引二級索引超過10,用一級索引為一級索引分配 100個空間/j,繼續(xù)前面的值p-> p2=new in t100100;for(i=110;i< p->le ngth;i+) for(j;j<10000;j+) if(disk_blockj=0) /超過110,得用二級索引int m=(i-110)/100; int k=(i-110)%100;p-> p2mk=j; disk_blockj=1; j+;break;/在一級索引的基礎(chǔ)上,2/j,繼續(xù)前面的值/行/列if(no w=0)p->

40、next=Fhead;/后繼結(jié)點(diǎn)指向頭,即新指點(diǎn)在前Fhead=p; /新結(jié)點(diǎn)在頭else/根目錄下的文件p->n ext=no w->File_head;no w->File_head=p;21/用戶總空間大小增加/子目錄下空間大小增加while(D!=0) int Cuse: new_dir()/建立新目錄len gth+=p->le ngth;if(no w!=0)no w->le ngth+=p->le ngth;D=now->above;/ 上一級目錄/上級目錄(根目錄已實(shí)現(xiàn))空間增加D->le ngth+=p->le ngth;

41、D=D->above; / 逐級向上27DIR *p,*h; cout<<"請輸入新目錄的名字:"<<endl;p=new DIR;cin>>p->n ame;p->Dir_head=0;p->le ngth=0;p-> File_head=0;if(no w=0)/目錄名目錄下的目錄鏈為空目錄下的文件為空 當(dāng)前為主目錄h=Dhead; /第一次時,h=0;指向目錄鏈elseh=no w->Dir_head;/ 當(dāng)前的目錄鏈 while(h!=0) /此目錄下存在其它子目錄 if(!strcm p(h-

42、>n ame ,p->n ame)cout<<"此目錄已存在!"<<endl;return 0;h=h->n ext;if(no w=0)p->above=O; p->n ext=Dhead; Dhead=p;/當(dāng)前為主目錄/主目錄里目錄的上一結(jié)點(diǎn)為0/把原目錄接入新目錄后面( Dhead初始為0)/Dhead始終指向最新目錄結(jié)點(diǎn) else/當(dāng)前目錄為新目錄的上一結(jié)點(diǎn)/反序插入新目錄p->above=now;p->n ext=no w->Dir_head;now->Dir_head=p;/ 更新目

43、錄鏈cout<<"目錄創(chuàng)建成功"<<endl;return 1;int Cuse:goback()/向上返回if(no w=0)cout<<"已是主目錄,不能向上!"<<endl;return 0;now=no w->above;/上一結(jié)點(diǎn)return 1;int Cuse:o pen _dir()/打開目錄char n ame10;DIR *p;if(now=0)/當(dāng)前主目錄p=Dhead;elsep=now->Dir_head;/p 指向目錄鏈cout<<"請輸入你要打

44、開的目錄名:”<<endl;cin>>n ame;/int flag=0;while( p!=0)if(strcm p(p->n ame ,n ame)=O)now=p; /找至U目錄,now標(biāo)記return 1;p=p->n ext;cout<<"當(dāng)前沒此目錄"<<endl;刪除文件的前面工作return 0;int Cuse:first_dele_file() /char temp 10,a5;cout<<"你要刪除的文件名:"<<endl;cin> >t

45、e mp;UFD *f=Fhead; /數(shù)據(jù)文件頭指針UFD *above=0;if(no w!=0)f=now->File_head;/當(dāng)前目錄下的數(shù)據(jù)文件while(f!=0)if(!strc mp(f->n ame,tem p)break; /找到,跳出above=f; /標(biāo)記第一個文件f=f->n ext;if(f=0)cout<<"此文件不存在"<<endl;return 0;cout<<"確定刪除"<<f->name<<"文件嗎?按 0確定,其他鍵取

46、消"<<endl;cin> >a;if(a0!='0')cout<<"已取消刪除文件。"<<endl;return 0;disk_empty+=f->length;/回收此數(shù)據(jù)文件的空間大小if(now=0)/ 根目錄if(f=Fhead)Fhead=Fhead->n ext;elseabove->n ext=f- >n ext; elseDIR *d=now;while(d!=0)d->le ngth=f->le ngth;d=d->above;if(f=n

47、o w->File_head)no w->File_head=no w->File_head->n ext;elseabove->n ext=f- >n ext;len gth-=f->le ngth; this->dele_file(f);cout<<"刪除成功"<<endl; return 1;int Cuse:dele_file(UFD *f) /具體實(shí)現(xiàn)刪除文件int i=0,m;for(i=0;i<10&&i<f->le ngth;i+)m=f->ai;

48、disk_blockm=0;if(f-> p1!=0)for(i=10;i<110&&i <f->le ngth;i+)m=f-> p1i-10; disk_blockm=0;delete(f-> p1);if(f-> p2!=0)for(i=110;i<f->le ngth;i+)m=(f-> p2)(i-110)/100(i-110)%100; disk_blockm=0;delete(f-> p2);/回收一級索引/回收二級索引/回收文件具體空間,重置空閑delete f;f=0;/要刪除的文件為空了ret

49、urn 1;int Cuse:first_dele_dir()/刪除目錄的前奏char n10;char c;DIR *p ,*above=0;p=Dhead; /指向根目錄下的目錄鏈if(no w!=0)p=now->Dir_head;/指向當(dāng)前目錄下的目錄鏈cout<<"要刪除的目錄名:"<<endl;cin>>n;while (p !=0)if(!strc mp(p-> name, n)break; /找到要刪除的目錄,跳出above=p; /保存前一結(jié)點(diǎn)p=p->n ext;if(p=0)cout<<

50、"沒有這個目錄!"<<endl;return 0;cout<<"確定刪除當(dāng)前目錄及此目標(biāo)上的所有信息嗎?按0確定,其他鍵取消"<<e ndl;cin> >c; if(c!='0') return 0;disk_empty+=p->length;/ 回收磁盤空間if(no w=0)if(p=Dhead)/如果是根目錄下頭結(jié)點(diǎn),直接移動Dhead=Dhead->n ext;elseDheadabove-> next=p-> next;/中間抽掉目標(biāo)else29if(p=n

51、o w->Dir_head)no w->Dir_head=no w->Dir_head->n ext; elseabove->n ext=p->n ext; above=now; / 當(dāng)前目錄while(above!=0)above->length-=p->length;/用above標(biāo)記當(dāng)前目錄,進(jìn)行大小更新above=above->above; / 向上一級/根目錄大小更新len gth-=p->le ngth;this->dele_dir( p);p=0;"<<e ndl;cout<<&q

52、uot;刪除成功!return 1;int Cuse:dele_dir(DIR *p)/具體實(shí)現(xiàn)刪除目錄的工作31int flag=O;DIR *d=p->Dir_head;UFD *f=p->File_head; if(f!=0)/當(dāng)前目錄下的目錄鏈表/當(dāng)前目錄下的文件鏈while( p-> File_head->n ext!=0)/刪除目錄里的文件f=p-> File_head;while(f- >n ext->n ext!=0) f=f->n ext;this->dele_file(f- >n ext); f->n ext

53、=0;if(p-> File_head->n ext=0)this->dele_file( p->File_head);/刪除頭文件p-> File_head=0; if(d!=0)/刪除目錄下的目錄while( p->Dir_head->n ext!=0) d=p->Dir_head;while(d->n ext- >n ext!=0)d=d->n ext;this->dele_dir(d->n ext);d->n ext=0;if(p->Dir_head->n ext=0)this->dele_dir( p->Dir_head);/ p->Dir_head=0;delete p;p=0;return 1;刪除目錄鏈頭結(jié)點(diǎn)/釋放p占用的內(nèi)存置0顯示當(dāng)前目錄int Cuse:dis_ no w() /DIR *d=Dhead;UFD *f=Fhead;if(no w!=0)d=now->Dir_head;/當(dāng)前目錄下

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論