操作系統(tǒng)課程設計---操作系統(tǒng)之文件管理部分的設計與實現_第1頁
已閱讀1頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  操作系統(tǒng)之文件管理部分的設計與實現</p><p><b>  摘 要</b></p><p>  本系統(tǒng)根據操作系統(tǒng)理論課上學習的操作系統(tǒng)中關于文件管理實現方法,在采用混合索引文件結構、成組鏈接法的基礎上實現單用戶的磁盤文件管理部分,包括:文件的邏輯結構、文件的物理結構、目錄結構、磁盤分配回收、文件的保護和用戶接口。</p>&l

2、t;p>  本論文主要闡述四部分內容,引言部分,主要說明本次操作系統(tǒng)課程設計的性質、教學目的、教學任務與要求、意義以及論文的結構安排;系統(tǒng)分析與設計部分,主要闡述系統(tǒng)的主要功能模塊以及每個模塊計劃采用的實現方法和原理;系統(tǒng)實現部分,主要通過流程圖等工具描述主要模塊的實現流程;最后一部分,結束語部分,主要書寫已經實現的本系統(tǒng)存在的不足、改進方案和在課程設計中的實際感受。</p><p>  關鍵詞:操作系統(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性質

7、1</b></p><p>  1.2 教學目的1</p><p>  1.3 任務和要求1</p><p><b>  1.4意義1</b></p><p>  1.5 論文結構安排2</p><p>  二 文件管理部分系統(tǒng)分析與設計2</p><p

8、><b>  2.1系統(tǒng)要求2</b></p><p>  2.2 文件存儲的實現方法和原理2</p><p>  2.2.1磁盤模擬2</p><p>  2.2.2文件的邏輯結構2</p><p>  2.2.3文件的物理結構3</p><p>  2.2.4目錄結構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磁盤空閑塊數顯示5</p><p><b>  三 系統(tǒng)實現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磁盤的空閑塊數查詢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盤內移動文件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文件樹形結構19</p><p>  3.4.2顏色顯示20</p><p>  3.4.3建立樹節(jié)點20</p>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

30、delete文件名 </p><p>  知道要刪除的文件,回收其文件所占磁盤塊,刪除目錄項。</p><p>  移動文件:move 源文件名 目標文件名</p><p>  注意:磁盤內和磁盤間文件移動的不同,磁盤內的移動實際只是將文件目錄項復制到目標處,然后將原始的文件目錄刪除,并不需要真的移動文件;磁盤間的文件移動實際上是先拷貝文件到目標磁盤,然后再刪

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

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

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

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

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

36、t;/p><p><b>  2.3 磁盤管理</b></p><p>  2.3.1磁盤的分配</p><p>  首先檢索專用塊第0項記錄的空閑塊數是否為1,若為1,則查詢 第一項是否為0,為0則無空閑塊可分配,否則將第一項記錄的塊號中所有內容復制到專用塊,然后把該塊號對應的空閑塊分配出去;若專用塊第0項記錄的空閑塊數是否不為1,則把專用塊中

37、記錄的最后一個空閑塊分配出去。</p><p>  2.3.2磁盤的歸還</p><p>  當歸還一塊時,首先檢索專用塊登記的空閑塊數是否為10,若不為10,則只要把歸還塊的塊號登記到專用塊中且將空閑塊數加1,若專用塊登記的空閑塊數已經為10,則把專用塊中的內容寫到所歸還的空閑塊中,該歸還塊作為新組的第一塊,記錄其塊號到專用塊,專用塊登記的空閑塊數為1。 </p><

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

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

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

41、代碼(以C盤為例):</p><p>  if (q == 0) </p><p><b>  {</b></p><p>  if (d[0] > 1) /*若該組不止一個空閑塊*/</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) /*只剩一個空閑塊*/</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;//無空閑塊可分</p><p><b>  }</b></p><p>  return -1;</p><p><b>  }</b></p><p>  3.1.3磁盤的注銷</p><p>  首先將模擬磁盤中的所有內容讀到字節(jié)數組d中,按成組鏈接的原理

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

48、<b>  {</b></p><p>  if (d[0] < 10) /*當前組不滿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>  將已占用和未占用的空閑塊號用一個數組byte[] f記錄,數組長度256,前128項記錄C盤盤塊使用情況,后128項記錄D盤盤塊使用情況?;诳臻e塊的成組鏈接,遍歷整個空閑成組鏈,若某一盤塊為空閑(設該盤塊號為k),則f(k)=1,否則f(k)

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

54、gt;  1、讀信息</b></p><p>  從指定的位置begin開始,讀取number個字節(jié)到字節(jié)數組,返回字節(jié)數組。</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)建數組</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數組中的number個字節(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>  根據參數判斷格式化那個盤符,若參數為0,則格式化C盤,為1則格式化D盤。格式化即刪除磁盤中對應分區(qū)的內容,并初始化分區(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>  查詢路徑為全路徑,查詢的若為目錄,則返回該目錄的索引盤塊號,即該目錄的下一級文件的fcb存放的盤塊號;查詢的若為文件,則返回該文件的直接盤塊號,即文件內容的直接地址。Searchpart函數實現查找單個目錄。關鍵代碼:</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("路徑錯誤!");</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é)號,失敗則返回-1。</p><p><b>  3.2.3建立目錄</b></p><p>  實現增加目錄的功能,若存在同名目錄,則無需再創(chuàng)建,直接返回,否則找到目錄的根目錄處添加新的目錄fcb。流程圖如下:</p><p>  3.2.4刪除空目錄</p><p>  查找目錄是否為空,若

68、為空,則刪除,否則返回。關鍵代碼:</p><p>  //查找同名目錄,查找成功則返回字節(jié)號,失敗則返回-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>  先查找該目錄是否為空,若為空則直接刪除,若不為空,則先刪除其子級文件,再刪除空目錄。核心代碼:</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); //子文件或目錄個數</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;//實際字節(jié)號</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個FCB</p><p><b>  {</b><

76、/p><p>  byte[] ffcb = new byte[16];//存放一個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]; //復制文件、目錄名字</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]為關于i的當前目錄的下一級文件全路徑名</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、先根據路徑查找文件所在盤塊,然后讀出盤塊內容。關鍵代碼:</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('\\');//把字符串以\分別存到字符數組中</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盤內移動文件</p><p>  實現同一磁盤分區(qū)內文件的剪切、粘貼功能(不同分區(qū)的移動

90、靠文件的讀出、寫入兩個模塊完成)。核心代碼:</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++) //復制文件名</p><p>  name[k] = fcb[k];</p>

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

93、象為目錄且該fcb與被轉移目錄的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])) //被轉移對象為文件且該fcb與被轉移文件的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,判斷文件為只讀,負責為非只讀。</p><p><b>  3.3.7

97、保存文件</b></p><p>  用在編輯命令之后的保存,實現對已登記文件的保存。首先找到文件的直接地址,再將參數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('\\');//把字符串以\分別存到字符數組中</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>  將文件在只讀和非只讀、隱藏和非隱藏之間轉換。先根據路徑找到文件fcb所在位置,將其屬性項fcb[9]按用戶輸入的類型轉換。</p><p><b>  3.4界面顯示</b></p><p>  3.4.1文件樹形結構<

102、/p><p>  通過scan函數遍歷目錄,建立樹形結構。參數中tag==0則遍歷C盤,為1則遍歷D盤。遍歷從根目錄開始,所搜索到的fcb為文件fcb則直接建立一個以文件名為名稱的樹節(jié)點,若為目錄fcb則先建立一個以目錄名為名稱的樹節(jié)點,再遍歷該目錄的索引塊,若不為空則為每個文件建立該目錄結點下的樹節(jié)點。以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];//存放一個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>  根據盤塊使用情況調節(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é)點</p><p><b>  流程圖</b></p><p>  3.4.4刪除樹節(jié)點</p><p>  首先根據要刪除的路徑,判斷操作是在C盤還是在D盤,然后判斷刪除的

119、路徑是目錄還是文件,如果是文件結點,則可直接刪除,否則需要檢查刪除目錄有沒有內層結點,如果有內層結點則先刪除內層結點,在刪除目錄結點,沒有內層結點即可直接刪除目錄結點。核心代碼:</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>  { //刪除目錄結點的內層所有結點</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格式化結點</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é)點</p><p><b>  else</b></p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  四 結束語</b

132、></p><p>  首先,系統(tǒng)并沒有實現所要求的相對路徑的功能。</p><p>  然后,對于文件,并沒有實現一級索引功能,每個文件只為其分配了一個空閑塊。這樣,事實上,沒有實現課程設計所要求,這樣的實現不太規(guī)范。</p><p>  最后,編寫此系統(tǒng),采用了C#語言,C#語言是一門面向對象的語言,但是,在實現此系統(tǒng)中,一方面因為我對C#這門語言掌握的不

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論