

版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)——操作系統(tǒng)課程設(shè)計(jì)模擬操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)--文件管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)--模擬操作系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)---文件管理系統(tǒng)設(shè)計(jì)
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---磁盤文件操作
- 操作系統(tǒng)課程設(shè)計(jì)---geekos操作系統(tǒng)的研究與實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)-- geekos操作系統(tǒng)的研究與實(shí)現(xiàn)
- 操作系統(tǒng)文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告----文件管理系統(tǒng)
- 操作系統(tǒng)程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告-操作系統(tǒng)模擬實(shí)現(xiàn)
- 《操作系統(tǒng)》課程設(shè)計(jì)-- 模擬文件管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)簡(jiǎn)單文件系統(tǒng)的實(shí)現(xiàn)
- 《操作系統(tǒng)》課程設(shè)計(jì)--模擬文件管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)--簡(jiǎn)單文件系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論