操作系統(tǒng)課程設(shè)計(jì)---操作系統(tǒng)之文件管理部分的設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)
已閱讀1頁(yè),還剩27頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  操作系統(tǒng)之文件管理部分的設(shè)計(jì)與實(shí)現(xiàn)</p><p><b>  摘 要</b></p><p>  本系統(tǒng)根據(jù)操作系統(tǒng)理論課上學(xué)習(xí)的操作系統(tǒng)中關(guān)于文件管理實(shí)現(xiàn)方法,在采用混合索引文件結(jié)構(gòu)、成組鏈接法的基礎(chǔ)上實(shí)現(xiàn)單用戶的磁盤文件管理部分,包括:文件的邏輯結(jié)構(gòu)、文件的物理結(jié)構(gòu)、目錄結(jié)構(gòu)、磁盤分配回收、文件的保護(hù)和用戶接口。</p>&l

2、t;p>  本論文主要闡述四部分內(nèi)容,引言部分,主要說(shuō)明本次操作系統(tǒng)課程設(shè)計(jì)的性質(zhì)、教學(xué)目的、教學(xué)任務(wù)與要求、意義以及論文的結(jié)構(gòu)安排;系統(tǒng)分析與設(shè)計(jì)部分,主要闡述系統(tǒng)的主要功能模塊以及每個(gè)模塊計(jì)劃采用的實(shí)現(xiàn)方法和原理;系統(tǒng)實(shí)現(xiàn)部分,主要通過(guò)流程圖等工具描述主要模塊的實(shí)現(xiàn)流程;最后一部分,結(jié)束語(yǔ)部分,主要書寫已經(jīng)實(shí)現(xiàn)的本系統(tǒng)存在的不足、改進(jìn)方案和在課程設(shè)計(jì)中的實(shí)際感受。</p><p>  關(guān)鍵詞:操作系統(tǒng)

3、 文件管理 混合索引 成組鏈接</p><p><b>  ABSTRACT</b></p><p>  According to the system operating on the theory of learning in the operating system on the document management method, used in mix

4、ed-index file structure of the group's links to law based on single-user disk file management, including: the logical structure of the document, document The physical structure of the directory structure, the distrib

5、ution of the recovery disk, file protection and user interface. This paper on a four-part, the introductory remarks, the main operating system that t</p><p>  key words: Operating system Document Mana

6、gement Index Mixed Group's links</p><p><b>  目 錄</b></p><p><b>  目 錄1</b></p><p><b>  一 引言1</b></p><p><b>  1.1性質(zhì)

7、1</b></p><p>  1.2 教學(xué)目的1</p><p>  1.3 任務(wù)和要求1</p><p><b>  1.4意義1</b></p><p>  1.5 論文結(jié)構(gòu)安排2</p><p>  二 文件管理部分系統(tǒng)分析與設(shè)計(jì)2</p><p

8、><b>  2.1系統(tǒng)要求2</b></p><p>  2.2 文件存儲(chǔ)的實(shí)現(xiàn)方法和原理2</p><p>  2.2.1磁盤模擬2</p><p>  2.2.2文件的邏輯結(jié)構(gòu)2</p><p>  2.2.3文件的物理結(jié)構(gòu)3</p><p>  2.2.4目錄結(jié)構(gòu)3<

9、;/p><p>  2.2.5磁盤分配3</p><p>  2.2.6用戶接口3</p><p>  2.2.7屏幕顯示5</p><p>  2.3 磁盤管理5</p><p>  2.3.1磁盤的分配5</p><p>  2.3.2磁盤的歸還5</p><p&

10、gt;  2.3.3磁盤狀態(tài)的顯示5</p><p>  2.3.4磁盤空閑塊數(shù)顯示5</p><p><b>  三 系統(tǒng)實(shí)現(xiàn)6</b></p><p><b>  3.1磁盤管理6</b></p><p>  3.1.1磁盤初始化6</p><p>  3.1.

11、2磁盤的分配7</p><p>  3.1.3磁盤的注銷7</p><p>  3.1.4磁盤盤塊的顏色顯示8</p><p>  3.1.5磁盤的空閑塊數(shù)查詢9</p><p>  3.1.6磁盤的信息讀寫9</p><p>  3.1.7格式化磁盤10</p><p>  3.2

12、目錄管理10</p><p>  3.2.1目錄的查詢10</p><p>  3.2.2查找同名目錄11</p><p>  3.2.3建立目錄12</p><p>  3.2.4刪除空目錄13</p><p>  3.2.5刪除目錄13</p><p>  3.3文件管理15&

13、lt;/p><p>  3.3.1創(chuàng)建文件15</p><p>  3.3.2刪除文件16</p><p>  3.3.3拷貝文件16</p><p>  3.3.4錄入文件17</p><p>  3.3.5盤內(nèi)移動(dòng)文件17</p><p>  3.3.6判斷文件只讀與否18</

14、p><p>  3.3.7保存文件18</p><p>  3.3.8改變文件屬性18</p><p>  3.4界面顯示19</p><p>  3.4.1文件樹形結(jié)構(gòu)19</p><p>  3.4.2顏色顯示20</p><p>  3.4.3建立樹節(jié)點(diǎn)20</p>

15、<p>  3.4.4刪除樹節(jié)點(diǎn)21</p><p>  3.4.5格式化結(jié)點(diǎn)22</p><p><b>  四 結(jié)束語(yǔ)23</b></p><p><b>  一 引言</b></p><p><b>  1.1性質(zhì)</b></p><

16、p>  操作系統(tǒng)是計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)的主要專業(yè)基礎(chǔ)課和主干課。操作系統(tǒng)對(duì)計(jì)算機(jī)系統(tǒng)資源實(shí)施管理,是所有其他軟件與計(jì)算機(jī)硬件的唯一接口,所有用戶在使用計(jì)算機(jī)時(shí)都要得到操作系統(tǒng)提供的服務(wù)。</p><p><b>  1.2 教學(xué)目的</b></p><p>  通過(guò)模擬操作系統(tǒng)的全部或者部分功能的實(shí)現(xiàn),加深對(duì)操作系統(tǒng)工作原理和操作系統(tǒng)實(shí)現(xiàn)方法的理解,達(dá)到練習(xí)編程

17、的目的,提高學(xué)生運(yùn)用理論知識(shí)分析問題、解決問題的能力,為學(xué)生從事科學(xué)研究和獨(dú)立負(fù)擔(dān)計(jì)算機(jī)及其應(yīng)用方面的工作打好扎實(shí)的基礎(chǔ)。</p><p><b>  1.3 任務(wù)和要求</b></p><p><b>  課程設(shè)計(jì)總體要求</b></p><p>  模擬采用多道程序設(shè)計(jì)方法的單用戶操作系統(tǒng),該操作系統(tǒng)包括四部分內(nèi)容:文

18、件管理和用戶接口、存儲(chǔ)管理、設(shè)備管理、進(jìn)程管理。功能模塊圖如下:</p><p><b>  1.4意義</b></p><p>  通過(guò)模擬操作系統(tǒng)原理的實(shí)現(xiàn),加深對(duì)操作系統(tǒng)工作原理和操作系統(tǒng)實(shí)現(xiàn)方法的理解,掌握了初步分析實(shí)際問題的能力,為其今后在相關(guān)領(lǐng)域開展工作打下堅(jiān)實(shí)的基礎(chǔ)。同時(shí)使學(xué)生系統(tǒng)科學(xué)地受到分析問題和解決問題的訓(xùn)練,提高運(yùn)用理論知識(shí)解決實(shí)際問題的能力。&

19、lt;/p><p>  1.5 論文結(jié)構(gòu)安排</p><p>  本論文主要闡述四部分內(nèi)容,引言部分,主要說(shuō)明本次操作系統(tǒng)課程設(shè)計(jì)的性質(zhì)、教學(xué)目的、教學(xué)任務(wù)與要求、意義以及論文的結(jié)構(gòu)安排;系統(tǒng)分析與設(shè)計(jì)部分,主要闡述系統(tǒng)的主要功能模塊以及每個(gè)模塊計(jì)劃采用的實(shí)現(xiàn)方法和原理;系統(tǒng)實(shí)現(xiàn)部分,主要通過(guò)實(shí)現(xiàn)思想說(shuō)明、流程圖等工具描述主要模塊的實(shí)現(xiàn)流程;最后一部分,結(jié)束語(yǔ)部分,主要書寫已經(jīng)實(shí)現(xiàn)的本系統(tǒng)存在

20、的不足、改進(jìn)方案和在課程設(shè)計(jì)中的實(shí)際感受</p><p>  二 文件管理部分系統(tǒng)分析與設(shè)計(jì)</p><p><b>  2.1系統(tǒng)要求</b></p><p>  本系統(tǒng)要求實(shí)現(xiàn)文件的邏輯結(jié)構(gòu)、文件的物理結(jié)構(gòu)、目錄結(jié)構(gòu)、磁盤分配和回收、文件的保護(hù)和用戶接口。</p><p>  2.2 文件存儲(chǔ)的實(shí)現(xiàn)方法和原理<

21、;/p><p><b>  2.2.1磁盤模擬</b></p><p>  磁盤是斷電后內(nèi)容不丟失的,因此用文件模擬磁盤。用一個(gè)文件disk1模擬磁盤,要求模擬系統(tǒng)至少存在一個(gè)磁盤邏輯分析,建議實(shí)現(xiàn)兩個(gè)磁盤邏輯分區(qū)。</p><p>  磁盤的每個(gè)盤塊128字節(jié),模擬磁盤共有256塊。</p><p>  磁盤中第0塊存放專

22、用塊內(nèi)容,第1、2塊存放根目錄,其余存放子目錄和文件。</p><p>  2.2.2文件的邏輯結(jié)構(gòu) </p><p>  文件的邏輯結(jié)構(gòu)采用流式結(jié)構(gòu),文件的內(nèi)容均采用文本文件,系統(tǒng)中有兩種文件,一種是存放任意字符的文件,一種是可執(zhí)行文件,可執(zhí)行文件的內(nèi)容就是系統(tǒng)內(nèi)進(jìn)程的程序體。</p><p>  可執(zhí)行文件要包括如下命令:</p><p&

23、gt;  X=?; 給i賦值一位數(shù)</p><p><b>  X++; i加1</b></p><p><b>  X--; i減1</b></p><p>  !??; 第一個(gè)?為A,B,C中某個(gè)設(shè)備,第二個(gè)?為一位數(shù),表示使用設(shè)備的時(shí)間</p><p>  end; 表示文件結(jié)束<

24、;/p><p>  2.2.3文件的物理結(jié)構(gòu)</p><p>  采用混合索引結(jié)構(gòu)。每個(gè)目錄項(xiàng)包括一個(gè)直接地址項(xiàng)和一個(gè)一級(jí)索引項(xiàng)。</p><p><b>  2.2.4目錄結(jié)構(gòu)</b></p><p>  目錄結(jié)構(gòu)采用樹型目錄結(jié)構(gòu),每個(gè)目錄項(xiàng)占16個(gè)字節(jié),目錄項(xiàng)內(nèi)容包括:</p><p>  目錄名

25、、文件名:6個(gè)字節(jié)(當(dāng)名小于6字節(jié)時(shí)可以補(bǔ)空格之類特殊字符到6個(gè));</p><p>  擴(kuò)展名:3個(gè)字節(jié)(可執(zhí)行文件擴(kuò)展名為exe,目錄沒有擴(kuò)展名);</p><p>  目錄、文件屬性:1字節(jié);(1字節(jié)8位,每一位可以代表不同的屬性,比如第0位為1表示該目錄項(xiàng)為目錄(文件夾)的登記項(xiàng),為0表示是文件的登記項(xiàng)(FCB);第1位表示是否隱藏,第2位表示是否為只讀文件)</p>

26、<p>  文件長(zhǎng)度:2字節(jié)(目錄沒有長(zhǎng)度,字節(jié)數(shù))。</p><p>  地址:直接地址項(xiàng)1個(gè),一級(jí)索引項(xiàng)1個(gè);</p><p>  根目錄:根目錄位置固定,占用磁盤2塊,大小固定,共16項(xiàng),占用模擬磁盤第1、2塊;</p><p>  子目錄:位置不固定,大小不固定。</p><p><b>  2.2.5磁盤分配&

27、lt;/b></p><p>  磁盤的空閑塊的組織方式采用成組鏈接。磁盤邏輯分為兩個(gè)區(qū)(C盤和D盤),每個(gè)分區(qū)的占128塊。成組鏈接時(shí),專用塊占每個(gè)分區(qū)的第0塊,空閑塊每組登記10個(gè)空閑塊。</p><p><b>  2.2.6用戶接口</b></p><p>  用戶接口提供用戶命令接口,要求文件名中既可以支持相對(duì)路徑的文件名,也可

28、支持絕對(duì)路徑的路徑名。要求實(shí)現(xiàn)以下命令:</p><p>  創(chuàng)建文件:create 文件名</p><p>  建立新文件,如果原來(lái)存在同名文件要提示是否覆蓋。建立新文件,可以只建立一個(gè)目錄項(xiàng),等編輯文件時(shí)再分配文件所需磁盤塊。</p><p>  拷貝文件:copy 源文件名 目標(biāo)文件名</p><p>  拷貝文件可同名拷貝,也可

29、更名拷貝;如果目標(biāo)位置存在同名文件要提示是否覆蓋。</p><p>  拷貝文件首先找到源文件的目錄項(xiàng),然后確認(rèn)目標(biāo)位置可以存放文件的拷貝(即無(wú)同名文件,有同名文件若同意覆蓋,則先刪除同名文件即可),然后根據(jù)源文件目錄項(xiàng)建立目標(biāo)文件的目錄項(xiàng);根據(jù)源文件目錄項(xiàng)指示的文件索引塊和文件內(nèi)容所在位置,一邊為目標(biāo)文件申請(qǐng)磁盤塊,一邊將源文件索引塊和文件內(nèi)容讀出、復(fù)制。</p><p>  刪除文件:

30、delete文件名 </p><p>  知道要?jiǎng)h除的文件,回收其文件所占磁盤塊,刪除目錄項(xiàng)。</p><p>  移動(dòng)文件:move 源文件名 目標(biāo)文件名</p><p>  注意:磁盤內(nèi)和磁盤間文件移動(dòng)的不同,磁盤內(nèi)的移動(dòng)實(shí)際只是將文件目錄項(xiàng)復(fù)制到目標(biāo)處,然后將原始的文件目錄刪除,并不需要真的移動(dòng)文件;磁盤間的文件移動(dòng)實(shí)際上是先拷貝文件到目標(biāo)磁盤,然后再刪

31、除源文件。</p><p>  顯示文件:type 文件名</p><p>  僅僅是顯示文件內(nèi)容。</p><p>  編輯文件:edit 文件名</p><p>  注意只讀文件不可以修改。</p><p>  在修改文件過(guò)程中,文件的長(zhǎng)短在變化,注意磁盤塊分回收和分配。</p><p>

32、  改變文件屬性:change 文件名 屬性</p><p>  將文件在只讀和非只讀、隱藏和非隱藏之間轉(zhuǎn)換。</p><p>  磁盤格式化命令 format 盤符</p><p>  格式化即將所有磁盤塊回收,即認(rèn)為除0、1、2外磁盤塊均為空閑,將根目錄所有目錄項(xiàng)置為空目錄項(xiàng)。</p><p>  建立目錄:makdir 目錄</p

33、><p>  建立目錄,若同名目錄存在則建立失敗。建立對(duì)應(yīng)目錄(文件夾)的目錄項(xiàng)。</p><p>  改變目錄路徑:chadir目錄</p><p>  改變當(dāng)前工作目錄,命令接口上要提示當(dāng)前工作目錄。</p><p>  刪除空目錄:rdir 目錄</p><p>  當(dāng)前目錄、非空目錄、根目錄不能刪除,只刪除空目錄項(xiàng)

34、。</p><p>  刪除目錄:deldir 目錄</p><p>  既可刪除空目錄又可刪除非空目錄,對(duì)于非空目錄,首先要?jiǎng)h除其下文件和目錄然后才能刪除其本身。采用樹的后序遍歷算法,對(duì)目錄樹進(jìn)行遍歷,遍歷中的訪問換成刪除,文件則調(diào)用文件刪除,空目錄則調(diào)用空目錄刪除。</p><p>  運(yùn)行可執(zhí)行文件:可執(zhí)行文件的文件名。</p><p>

35、;<b>  2.2.7屏幕顯示</b></p><p><b>  屏幕顯示要求包括:</b></p><p>  用戶命令接口,用于系統(tǒng)運(yùn)行時(shí)用戶輸入命令;</p><p>  磁盤目錄顯示,要求顯示磁盤的樹型目錄結(jié)構(gòu);</p><p>  磁盤使用情況,顯示磁盤每一個(gè)磁盤塊的空間是否空閑。&l

36、t;/p><p><b>  2.3 磁盤管理</b></p><p>  2.3.1磁盤的分配</p><p>  首先檢索專用塊第0項(xiàng)記錄的空閑塊數(shù)是否為1,若為1,則查詢 第一項(xiàng)是否為0,為0則無(wú)空閑塊可分配,否則將第一項(xiàng)記錄的塊號(hào)中所有內(nèi)容復(fù)制到專用塊,然后把該塊號(hào)對(duì)應(yīng)的空閑塊分配出去;若專用塊第0項(xiàng)記錄的空閑塊數(shù)是否不為1,則把專用塊中

37、記錄的最后一個(gè)空閑塊分配出去。</p><p>  2.3.2磁盤的歸還</p><p>  當(dāng)歸還一塊時(shí),首先檢索專用塊登記的空閑塊數(shù)是否為10,若不為10,則只要把歸還塊的塊號(hào)登記到專用塊中且將空閑塊數(shù)加1,若專用塊登記的空閑塊數(shù)已經(jīng)為10,則把專用塊中的內(nèi)容寫到所歸還的空閑塊中,該歸還塊作為新組的第一塊,記錄其塊號(hào)到專用塊,專用塊登記的空閑塊數(shù)為1。 </p><

38、p>  2.3.3磁盤狀態(tài)的顯示</p><p>  磁盤的狀態(tài)在每次分配和回收磁盤塊的函數(shù)過(guò)程中實(shí)現(xiàn),每分配一個(gè)空閑塊,將相應(yīng)pictureBox由淺粉色改為紅色,表示該磁盤塊已經(jīng)被占用;每回收一塊磁盤塊的時(shí)候,將相應(yīng)pictureBox由紅色色改為淺粉色,表示該磁盤塊空閑。</p><p>  2.3.4磁盤空閑塊數(shù)顯示</p><p>  系統(tǒng)每分配一個(gè)

39、空閑塊,實(shí)現(xiàn)對(duì)應(yīng)分區(qū)空閑塊數(shù)減1,相應(yīng)的,每回收一個(gè)空閑塊,對(duì)應(yīng)分區(qū)空閑塊數(shù)加1。</p><p><b>  三 系統(tǒng)實(shí)現(xiàn)</b></p><p><b>  3.1磁盤管理</b></p><p>  3.1.1磁盤初始化</p><p>  磁盤初始化實(shí)現(xiàn)空閑塊的成組鏈接,每組記錄10個(gè)空閑塊

40、,最后一組記錄9塊,專用塊記錄6塊。模擬磁盤共分兩個(gè)區(qū),每個(gè)分區(qū)各占128個(gè)盤塊。其實(shí)現(xiàn)的關(guān)鍵代碼(以C盤為例):</p><p>  3.1.2磁盤的分配</p><p>  首先將模擬磁盤中的所有內(nèi)容讀到字節(jié)數(shù)組d中,按成組鏈接的原理,從專用塊開始檢索,若專用塊登記的空閑塊數(shù)大于1,則直接從專用塊中分配空閑塊,否則,檢索專用塊鏈接的下一組是否存在,存在則拷貝、分配,不存在則不分配。關(guān)鍵

41、代碼(以C盤為例):</p><p>  if (q == 0) </p><p><b>  {</b></p><p>  if (d[0] > 1) /*若該組不止一個(gè)空閑塊*/</p><p><b>  {</b></p><p><b&g

42、t;  i = d[0];</b></p><p><b>  s = d[i];</b></p><p><b>  d[0]--;</b></p><p>  Write_To_Disk(d, 0, 128);</p><p><b>  return s;</b&g

43、t;</p><p><b>  }</b></p><p>  else if (d[0] == 1) /*只剩一個(gè)空閑塊*/</p><p><b>  {</b></p><p>  if (d[1] != 0) /*還有其它空閑塊組*/</p>&

44、lt;p><b>  {</b></p><p>  s = disk[1];</p><p>  for (i = 0; i <= 10; i++)</p><p>  d[i] = d[s * 128 + i];</p><p>  Write_To_Disk(d, 0, 128);</p>

45、<p>  Write_To_Disk(p, s*128, 128);</p><p><b>  return s;</b></p><p><b>  }</b></p><p>  else /*沒有其它空閑塊組*/</p><p>  ret

46、urn -1;//無(wú)空閑塊可分</p><p><b>  }</b></p><p>  return -1;</p><p><b>  }</b></p><p>  3.1.3磁盤的注銷</p><p>  首先將模擬磁盤中的所有內(nèi)容讀到字節(jié)數(shù)組d中,按成組鏈接的原理

47、,從專用塊開始檢索,若專用塊登記的空閑塊數(shù)小于10,則直接將回收的空閑塊號(hào)記錄到專用塊中,否則將專用塊內(nèi)容拷貝到回收的空閑塊,該空閑塊作為第一項(xiàng)記錄到專用塊,專用塊記錄塊號(hào)置1。</p><p>  參數(shù)j為要回收的空閑塊號(hào),j<128則說(shuō)明該盤塊回收到C盤分區(qū)中,否則回收到D盤。關(guān)鍵代碼:</p><p>  if (j < 128)</p><p>

48、<b>  {</b></p><p>  if (d[0] < 10) /*當(dāng)前組不滿10塊*/</p><p><b>  {</b></p><p><b>  i = d[0];</b></p><p>  d[i + 1] = (byte)j;&

49、lt;/p><p><b>  d[0]++;</b></p><p>  Write_To_Disk(d, 0, 128);</p><p><b>  }</b></p><p>  else /*已有10塊*/</p><p><b> 

50、 {</b></p><p>  for (i = 0; i <= 10; i++)</p><p>  d[j * 128 + i] = d[i];</p><p><b>  d[0] = 1;</b></p><p>  d[1] = (byte)j;</p><p>  

51、for (k = 0; k < 128; k++)</p><p>  p[k] = d[j * 128 + k];</p><p>  Write_To_Disk(d, 0, 2);</p><p>  Write_To_Disk(p, j* 128, 128);</p><p><b>  }</b></

52、p><p><b>  }</b></p><p>  3.1.4磁盤盤塊的顏色顯示</p><p>  將已占用和未占用的空閑塊號(hào)用一個(gè)數(shù)組byte[] f記錄,數(shù)組長(zhǎng)度256,前128項(xiàng)記錄C盤盤塊使用情況,后128項(xiàng)記錄D盤盤塊使用情況?;诳臻e塊的成組鏈接,遍歷整個(gè)空閑成組鏈,若某一盤塊為空閑(設(shè)該盤塊號(hào)為k),則f(k)=1,否則f(k)

53、=0,數(shù)組f返回到調(diào)用處,調(diào)用函數(shù)根據(jù)數(shù)組中的數(shù)據(jù)判斷盤塊的使用情況并用顏色差異在界面中標(biāo)示。關(guān)鍵代碼:</p><p>  3.1.5磁盤的空閑塊數(shù)查詢</p><p>  調(diào)用顏色顯示模塊中的cor函數(shù),得到空閑塊記錄數(shù)組,根據(jù)得到的數(shù)組計(jì)算每個(gè)分區(qū)的空閑塊塊數(shù)。</p><p>  3.1.6磁盤的信息讀寫</p><p><b&

54、gt;  1、讀信息</b></p><p>  從指定的位置begin開始,讀取number個(gè)字節(jié)到字節(jié)數(shù)組,返回字節(jié)數(shù)組。</p><p>  public byte[] Get_From_Disk(int begin, int number)</p><p><b>  {</b></p><p>  

55、byte[] b = new byte[number]; //創(chuàng)建數(shù)組</p><p>  FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);//創(chuàng)建讀文件流</p><p>  fs.Seek(begin, SeekOrigin.Begin);</p><p>

56、;  fs.Read(b, 0, number);</p><p>  fs.Close();</p><p><b>  return b;</b></p><p><b>  }</b></p><p><b>  2、寫信息</b></p><p>

57、;  從指定的模擬磁盤開始的位置begin起,把file數(shù)組中的number個(gè)字節(jié)寫入到磁盤中。</p><p>  public void Write_To_Disk(byte[] file, int begin, int number)</p><p><b>  {</b></p><p>  FileStream fs = new Fi

58、leStream(path, FileMode.Open, FileAccess.Write); //創(chuàng)建寫文件流</p><p>  fs.Seek(begin, SeekOrigin.Begin);</p><p>  fs.Write(file, 0, number);</p><p>  fs.Close();</p><p>&

59、lt;b>  }</b></p><p>  3.1.7格式化磁盤</p><p>  根據(jù)參數(shù)判斷格式化那個(gè)盤符,若參數(shù)為0,則格式化C盤,為1則格式化D盤。格式化即刪除磁盤中對(duì)應(yīng)分區(qū)的內(nèi)容,并初始化分區(qū)中的空閑塊。代碼:</p><p>  public void format(int disknum)</p><p>

60、<b>  {</b></p><p>  byte[] bb = new byte[16256]; //將出專用塊外的所有塊清空(共127塊)</p><p>  if (disknum == 0)</p><p>  Write_To_Disk(bb, 128, 16256);</p><p><b> 

61、 else</b></p><p>  Write_To_Disk(bb, 128 * 129, 16256);</p><p>  initial(disknum);</p><p><b>  }</b></p><p><b>  3.2目錄管理</b></p>&l

62、t;p>  3.2.1目錄的查詢</p><p>  查詢路徑為全路徑,查詢的若為目錄,則返回該目錄的索引盤塊號(hào),即該目錄的下一級(jí)文件的fcb存放的盤塊號(hào);查詢的若為文件,則返回該文件的直接盤塊號(hào),即文件內(nèi)容的直接地址。Searchpart函數(shù)實(shí)現(xiàn)查找單個(gè)目錄。關(guān)鍵代碼:</p><p>  public int Search(string[] paths, int Num)<

63、/p><p><b>  {</b></p><p>  int disknum;</p><p>  if(paths[0].StartsWith("c")||paths[0].StartsWith("C"))</p><p>  disknum= 1;</p><

64、;p>  else if (paths[0].StartsWith("d") || paths[0].StartsWith("D"))</p><p>  disknum = 129;</p><p><b>  else</b></p><p><b>  {</b><

65、/p><p>  MessageBox.Show("路徑錯(cuò)誤!");</p><p>  return -2;</p><p><b>  }</b></p><p>  for (int i = 1; disknum != -1 && i < Num; i++)

66、 </p><p>  disknum = searchpart(i,paths[i], disknum);</p><p>  return disknum;</p><p><b>  }</b></p><p>  3.2.2查找同名目錄</p><p&g

67、t;  查找成功則返回字節(jié)號(hào),失敗則返回-1。</p><p><b>  3.2.3建立目錄</b></p><p>  實(shí)現(xiàn)增加目錄的功能,若存在同名目錄,則無(wú)需再創(chuàng)建,直接返回,否則找到目錄的根目錄處添加新的目錄fcb。流程圖如下:</p><p>  3.2.4刪除空目錄</p><p>  查找目錄是否為空,若

68、為空,則刪除,否則返回。關(guān)鍵代碼:</p><p>  //查找同名目錄,查找成功則返回字節(jié)號(hào),失敗則返回-1</p><p>  int dir_fcb = search_dir(paths[pathnum - 1], diskNum);</p><p>  byte[] b = new byte[16];</p><p>  b = Ge

69、t_From_Disk(dir_fcb, 16);</p><p>  int k = (int)b[11]; //注銷磁盤塊</p><p>  Cancel(k); //回收</p><p>  byte[] fcb = new byte[16];</p><p>  Write_

70、To_Disk(fcb, dir_fcb, 16); //清除目錄fcb</p><p><b>  3.2.5刪除目錄</b></p><p>  先查找該目錄是否為空,若為空則直接刪除,若不為空,則先刪除其子級(jí)文件,再刪除空目錄。核心代碼:</p><p>  if (fcb[9] == 0)//path為文件 </p>

71、<p><b>  {</b></p><p>  Delete(path); //直接刪除文件</p><p><b>  return 1;</b></p><p><b>  }</b></p><p><b>  else</b><

72、;/p><p><b>  {</b></p><p>  int count = child_count(path, diskNum); //子文件或目錄個(gè)數(shù)</p><p>  if (count == 0)//path為空目錄</p><p><b>  {</b></p><

73、p>  rdir(path, diskNum); //刪除空目錄</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>  else//path為非空目錄</p><p><b>  {</b></p>

74、<p>  int nextdir_diskNum = fcb[11];</p><p>  string[] str = new string[count];</p><p>  int p = 0;</p><p>  int dd = nextdir_diskNum * 128;//實(shí)際字節(jié)號(hào)</p><p>  byte

75、[] buffer = new byte[128];//buffer是存放第diskNum塊磁盤塊的緩沖</p><p>  buffer = Get_From_Disk(dd, 128);</p><p>  for (int j = 0; j < 8; j++)//將盤塊切分成8個(gè)FCB</p><p><b>  {</b><

76、/p><p>  byte[] ffcb = new byte[16];//存放一個(gè)FCB</p><p>  for (int k = 0; k < 16; k++)</p><p>  ffcb[k] = buffer[j * 16 + k];</p><p>  if (ffcb[10] != 0) //文件fcb</p

77、><p><b>  {</b></p><p>  byte[] b = new byte[6];</p><p>  for (int h = 0; h < 6; h++)</p><p>  b[h] = ffcb[h]; //復(fù)制文件、目錄名字</p><p>  string s =

78、 System.Text.Encoding.Default.GetString(b);</p><p>  s = s.Trim();</p><p>  //將子文件、目錄的路徑得出</p><p>  if (ffcb[9] == 1)//該FCB為目錄</p><p>  str[p] = path + "\\" +

79、 s;</p><p>  else//該FCB為文件</p><p><b>  {</b></p><p>  byte[] t = System.Text.Encoding.Default.GetBytes("txt");</p><p>  if (ffcb[6] == t[0])</p

80、><p>  str[p] = path + "\\" + s + ".txt";</p><p><b>  else</b></p><p>  str[p] = path + "\\" + s + ".exe";</p><p><b

81、>  }</b></p><p>  p = p + 1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  for (int i = 0; i < count; i++) //刪除各文件</p>

82、<p><b>  {</b></p><p>  //str[i]為關(guān)于i的當(dāng)前目錄的下一級(jí)文件全路徑名</p><p>  Delete(str[i]);</p><p><b>  }</b></p><p><b>  }</b></p><

83、;p><b>  }</b></p><p>  rdir(path, diskNum); //刪除空目錄</p><p><b>  return 1;</b></p><p><b>  3.3文件管理</b></p><p><b>  3.3.1創(chuàng)建文

84、件</b></p><p>  建立文件流程圖 :</p><p><b>  3.3.2刪除文件</b></p><p><b>  原理流程圖如下:</b></p><p><b>  3.3.3拷貝文件</b></p><p>  首

85、先根據(jù)路徑查找文件所在盤塊,然后讀出盤塊內(nèi)容。關(guān)鍵代碼:</p><p>  public string file_out(string path)</p><p><b>  {</b></p><p>  string str = "";</p><p>  string[] paths;<

86、/p><p>  paths = path.Split('\\');//把字符串以\分別存到字符數(shù)組中</p><p>  int pathsNum = paths.Length;</p><p>  int diskNum = Search(paths, pathsNum);</p><p>  if (diskNum == -

87、1) // if (filediskNum == 255)</p><p><b>  {</b></p><p>  MessageBox.Show("該文件不存在!");</p><p>  return null;</p><p><b>  }</b></p>

88、;<p>  byte[] bb = new byte[128];</p><p>  bb = Get_From_Disk(diskNum * 128, 128);</p><p>  str = str + System.Text.Encoding.Default.GetString(bb);</p><p>  return str;</p

89、><p><b>  }</b></p><p><b>  3.3.4錄入文件</b></p><p><b>  流程圖如下:</b></p><p>  3.3.5盤內(nèi)移動(dòng)文件</p><p>  實(shí)現(xiàn)同一磁盤分區(qū)內(nèi)文件的剪切、粘貼功能(不同分區(qū)的移動(dòng)

90、靠文件的讀出、寫入兩個(gè)模塊完成)。核心代碼:</p><p>  for (j = 0; j < 8; i++)</p><p><b>  {</b></p><p>  byte[] fcb = new byte[16];</p><p>  for (j = 0; j < 16; j++)</p&

91、gt;<p>  fcb[j] = buffer[i * 16 + j];</p><p>  byte[] name = new byte[6];</p><p>  for (int k = 0; k < 6; k++) //復(fù)制文件名</p><p>  name[k] = fcb[k];</p>

92、;<p>  string str = System.Text.Encoding.Default.GetString(name); //將byte數(shù)組轉(zhuǎn)化為string</p><p>  str = str.Trim();</p><p>  if (index == -1 && str.Equals(paths1[num1 - 1]))//被轉(zhuǎn)移對(duì)

93、象為目錄且該fcb與被轉(zhuǎn)移目錄的fcb同名</p><p><b>  {</b></p><p>  for (int k = 0; k < 16; k++)</p><p>  bb[k] = fcb[k];</p><p><b>  flag = 1;</b></p>&

94、lt;p><b>  break;</b></p><p><b>  }</b></p><p>  else if (index != -1 && str.Equals(paths1[num1 - 2])) //被轉(zhuǎn)移對(duì)象為文件且該fcb與被轉(zhuǎn)移文件的fcb同名</p><p><b>

95、  {</b></p><p>  for (int k = 0; k < 16; k++)</p><p>  bb[k] = fcb[k];</p><p><b>  flag = 1;</b></p><p><b>  break;</b></p><

96、p><b>  }</b></p><p><b>  }</b></p><p>  3.3.6判斷文件只讀與否</p><p>  查找文件fcb所在位置,讀出文件fcb,若屬性fcb[9]==4或5或6或7,判斷文件為只讀,負(fù)責(zé)為非只讀。</p><p><b>  3.3.7

97、保存文件</b></p><p>  用在編輯命令之后的保存,實(shí)現(xiàn)對(duì)已登記文件的保存。首先找到文件的直接地址,再將參數(shù)str變?yōu)锽yte型寫入磁盤指定位置。核心代碼:</p><p>  public void savefile(string path, string str)</p><p><b>  {</b></p&g

98、t;<p>  string[] paths;</p><p>  paths = path.Split('\\');//把字符串以\分別存到字符數(shù)組中</p><p>  int pathsNum = paths.Length;</p><p>  int diskNum = Search(paths, pathsNum);</

99、p><p>  if (diskNum == -1)</p><p><b>  {</b></p><p>  MessageBox.Show("不存在此路徑!");</p><p><b>  return;</b></p><p><b>  

100、}</b></p><p>  byte[] bb = new byte[128];</p><p>  bb = System.Text.Encoding.Default.GetBytes(str);</p><p>  Write_To_Disk(bb, diskNum * 128, 128);</p><p><b&g

101、t;  }</b></p><p>  3.3.8改變文件屬性</p><p>  將文件在只讀和非只讀、隱藏和非隱藏之間轉(zhuǎn)換。先根據(jù)路徑找到文件fcb所在位置,將其屬性項(xiàng)fcb[9]按用戶輸入的類型轉(zhuǎn)換。</p><p><b>  3.4界面顯示</b></p><p>  3.4.1文件樹形結(jié)構(gòu)<

102、/p><p>  通過(guò)scan函數(shù)遍歷目錄,建立樹形結(jié)構(gòu)。參數(shù)中tag==0則遍歷C盤,為1則遍歷D盤。遍歷從根目錄開始,所搜索到的fcb為文件fcb則直接建立一個(gè)以文件名為名稱的樹節(jié)點(diǎn),若為目錄fcb則先建立一個(gè)以目錄名為名稱的樹節(jié)點(diǎn),再遍歷該目錄的索引塊,若不為空則為每個(gè)文件建立該目錄結(jié)點(diǎn)下的樹節(jié)點(diǎn)。以C盤為例代碼如下:</p><p>  if (tag == 0)</p>

103、<p><b>  {</b></p><p>  int d = disknum * 128;</p><p>  byte[] buffer = new byte[256];</p><p>  buffer = file.Get_From_Disk(d, 256); </p><p>  for (

104、int i = 0; i < 16; i++)</p><p>  { byte[] ffcb = new byte[16];//存放一個(gè)FCB</p><p>  for (int k = 0; k < 16; k++)</p><p>  ffcb[k] = buffer[i * 16 + k];</p><p>  i

105、f (ffcb[10] != 0) //如果fcb不為空 </p><p><b>  {</b></p><p>  byte[] b = new byte[6];</p><p>  for (int h = 0; h < 6; h++)</p><p>  b[h]

106、 = ffcb[h];</p><p>  string s = System.Text.Encoding.Default.GetString(b);</p><p>  s = s.Trim();</p><p>  if (ffcb[9] == 1 || ffcb[9] == 5 || ffcb[9] == 7 || ffcb[9] == 3)

107、 str = s;</p><p>  else //該FCB為文件</p><p><b>  {</b></p><p>  byte[] t = System.Text.Encoding.Default.GetBytes("txt");</p>

108、<p>  if (ffcb[6] == t[0])</p><p>  str = s + ".txt";</p><p><b>  else</b></p><p>  str = s + ".exe";</p><p><b>  }</b>

109、</p><p>  tree = treeView1.SelectedNode;</p><p>  TreeNode st = new TreeNode(str);</p><p>  treeView1.SelectedNode.Nodes.Add(st);</p><p>  if (ffcb[9] == 1)

110、 //該FCB為目錄</p><p><b>  {</b></p><p>  treeView1.SelectedNode = st;</p><p>  int next_disk_Num = ffcb[11];</p><p>  Scan_1(tag, next_disk_Num); //找子目錄<

111、;/p><p><b>  }</b></p><p>  treeView1.SelectedNode = tree;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b&g

112、t;</p><p><b>  3.4.2顏色顯示</b></p><p>  根據(jù)盤塊使用情況調(diào)節(jié)各盤塊顏色差異,在界面顯示。</p><p>  public void Label_Color(int task) //顏色顯示</p><p><b>  {</b>&l

113、t;/p><p>  byte [] F = new byte [256];</p><p>  for (int i = 0; i < 128; i++)</p><p><b>  F[i] = 0;</b></p><p>  if (task == 0)</p><p><b>

114、;  {</b></p><p>  file.cor(0, F); //file_C.cor(0,F);</p><p>  for (int i = 0; i < 128; i++)</p><p>  if (F[i] != 1)</p><p>  this.C[i].BackColor = Color.FromAr

115、gb(255, 0, 0);</p><p><b>  else</b></p><p>  this.C[i].BackColor = Color.FromArgb(255, 192, 192);</p><p><b>  }</b></p><p>  else if (task == 1)

116、</p><p><b>  {</b></p><p>  //file_D.cor(1,F);</p><p>  file.cor(1, F);</p><p>  for (int i = 128; i < 256; i++)</p><p>  if (F[i] != 1)<

117、/p><p>  this.D[i].BackColor = Color.FromArgb(255, 0, 0);</p><p><b>  else</b></p><p>  this.D[i].BackColor = Color.FromArgb(255, 192, 192);</p><p><b>  

118、}</b></p><p><b>  }</b></p><p>  3.4.3建立樹節(jié)點(diǎn)</p><p><b>  流程圖</b></p><p>  3.4.4刪除樹節(jié)點(diǎn)</p><p>  首先根據(jù)要?jiǎng)h除的路徑,判斷操作是在C盤還是在D盤,然后判斷刪除的

119、路徑是目錄還是文件,如果是文件結(jié)點(diǎn),則可直接刪除,否則需要檢查刪除目錄有沒有內(nèi)層結(jié)點(diǎn),如果有內(nèi)層結(jié)點(diǎn)則先刪除內(nèi)層結(jié)點(diǎn),在刪除目錄結(jié)點(diǎn),沒有內(nèi)層結(jié)點(diǎn)即可直接刪除目錄結(jié)點(diǎn)。核心代碼:</p><p>  while (i < 2 )</p><p><b>  {</b></p><p><b>  j = 0;</b>

120、</p><p>  int temp=0;</p><p><b>  flag = 0;</b></p><p>  while ((flag == 0) && (j < treeView1.SelectedNode.Nodes.Count)) </p>

121、<p><b>  {</b></p><p>  if (paths[i].Equals(treeView1.SelectedNode.Nodes[j].Text))</p><p><b>  {</b></p><p>  treeView1.SelectedNode = treeView1.Selecte

122、dNode.Nodes[j];</p><p><b>  flag = 1;</b></p><p><b>  temp = 1;</b></p><p><b>  }</b></p><p><b>  else</b></p>&l

123、t;p><b>  j++;</b></p><p><b>  }</b></p><p>  if (temp== 1&&index ==-1)</p><p>  { //刪除目錄結(jié)點(diǎn)的內(nèi)層所有結(jié)點(diǎn)</p><p>  while ((flag == 1) &&

124、amp; (k < treeView1.SelectedNode.Nodes.Count)) </p><p><b>  {</b></p><p>  treeView1.SelectedNode.Nodes[k].Remove();</p><p><b>  k++;</b></p>&

125、lt;p><b>  }</b></p><p>  this.treeView1.SelectedNode.Remove();</p><p><b>  return;</b></p><p><b>  }</b></p><p>  else if (temp =

126、= 1 && index != -1)</p><p><b>  {</b></p><p>  while ((flag == 1) && (k < treeView1.SelectedNode.Nodes.Count))</p><p><b>  {</b></p>

127、<p>  if (paths[i+1].Equals(treeView1.SelectedNode.Nodes[k].Text))</p><p><b>  {</b></p><p>  treeView1.SelectedNode.Nodes[k].Remove();</p><p><b>  return;&

128、lt;/b></p><p><b>  }</b></p><p><b>  k++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  i++;

129、</b></p><p><b>  }</b></p><p>  3.4.5格式化結(jié)點(diǎn)</p><p>  public void format()</p><p><b>  {</b></p><p>  TreeNode t = treeView1.Se

130、lectedNode;</p><p>  DialogResult result = MessageBox.Show("您確定要格式化嗎?", "信息提示", MessageBoxButtons.YesNo);</p><p>  if (result == DialogResult.Yes)</p><p>  t.Nod

131、es.Clear(); //清除所有節(jié)點(diǎn)</p><p><b>  else</b></p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  四 結(jié)束語(yǔ)</b

132、></p><p>  首先,系統(tǒng)并沒有實(shí)現(xiàn)所要求的相對(duì)路徑的功能。</p><p>  然后,對(duì)于文件,并沒有實(shí)現(xiàn)一級(jí)索引功能,每個(gè)文件只為其分配了一個(gè)空閑塊。這樣,事實(shí)上,沒有實(shí)現(xiàn)課程設(shè)計(jì)所要求,這樣的實(shí)現(xiàn)不太規(guī)范。</p><p>  最后,編寫此系統(tǒng),采用了C#語(yǔ)言,C#語(yǔ)言是一門面向?qū)ο蟮恼Z(yǔ)言,但是,在實(shí)現(xiàn)此系統(tǒng)中,一方面因?yàn)槲覍?duì)C#這門語(yǔ)言掌握的不

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論