操作系統(tǒng)課程設(shè)計--基于文件分配表的文件管理系統(tǒng)_第1頁
已閱讀1頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  學年論文(課程設(shè)計)</p><p>  題目: 操作系統(tǒng)課程設(shè)計 </p><p><b> ?。ㄕn程設(shè)計)任務(wù)書</b></p><p><b> ?。ㄖ笇?dǎo)教師用表)</b></p><p><b>  指

2、導(dǎo)教師簽字:</b></p><p><b>  系主任簽字:</b></p><p>  基于文件分配表的文件管理系統(tǒng)</p><p><b>  摘 要</b></p><p>  本系統(tǒng)根據(jù)操作系統(tǒng)理論課上學習的操作系統(tǒng)中關(guān)于文件管理實現(xiàn)方法,在采用顯式鏈接存儲、文件分配表的基礎(chǔ)

3、上實現(xiàn)單用戶的磁盤文件管理部分,包括:文件的邏輯結(jié)構(gòu)、文件的物理結(jié)構(gòu)、目錄結(jié)構(gòu)、磁盤分配回收。</p><p>  本論文主要闡述四部分內(nèi)容,引言部分,主要說明本次操作系統(tǒng)課程設(shè)計的性質(zhì)、教學目的、教學任務(wù)與要求、意義以及論文的結(jié)構(gòu)安排;系統(tǒng)分析與設(shè)計部分,主要闡述系統(tǒng)的主要功能模塊以及每個模塊計劃采用的實現(xiàn)方法和原理;系統(tǒng)實現(xiàn)部分,主要通過流程圖等工具描述主要模塊的實現(xiàn)流程;最后一部分,結(jié)束語部分,主要書寫已經(jīng)

4、實現(xiàn)的本系統(tǒng)存在的不足、改進方案和在課程設(shè)計中的實際感受。</p><p>  關(guān)鍵詞:操作系統(tǒng) 文件管理 文件分配表 存儲管理</p><p><b>  目 錄</b></p><p><b>  一 引言1</b></p><p><b>  1.1 性質(zhì)1</b&

5、gt;</p><p>  1.2 教學目的1</p><p>  1.3 任務(wù)和要求1</p><p><b>  1.4 意義1</b></p><p>  1.5 論文結(jié)構(gòu)安排1</p><p>  二 系統(tǒng)分析與設(shè)計3</p><p>  2.1 系統(tǒng)要求

6、3</p><p>  2.1.1 文件的邏輯結(jié)構(gòu)3</p><p>  2.1.2 磁盤模擬3</p><p>  2.1.3 目錄結(jié)構(gòu)3</p><p>  2.1.4 磁盤分配4</p><p>  2.1.5 屏幕顯示4</p><p>  2.2 實現(xiàn)方法和原理5<

7、/p><p>  2.2.1 文件的邏輯結(jié)構(gòu)5</p><p>  2.2.2 文件的物理結(jié)構(gòu)和目錄結(jié)構(gòu)5</p><p>  2.2.3 目錄結(jié)構(gòu)6</p><p>  2.2.4 磁盤狀態(tài)7</p><p><b>  三 系統(tǒng)實現(xiàn)8</b></p><p>  

8、3.1 磁盤管理8</p><p>  3.1.1 磁盤的創(chuàng)建8</p><p>  3.1.2 磁盤的初始化函數(shù)8</p><p>  3.1.3 畫樹結(jié)點9</p><p>  3.1.4 畫樹9</p><p>  3.1.5 讀FAT表畫磁盤11</p><p>  3.1.

9、6 磁盤的分配和回收13</p><p>  3.2 目錄結(jié)構(gòu)的實現(xiàn)15</p><p>  3.2.1 創(chuàng)建目錄15</p><p>  3.2.2 刪除空目錄19</p><p>  3.2.3 刪除目錄22</p><p><b>  3.3 文件26</b></p>

10、<p>  3.3.1 主框架26</p><p>  3.3.2 建立文件26</p><p>  3.3.3刪除文件29</p><p>  3.3.5移動文件31</p><p>  3.3.5復(fù)制文件32</p><p>  3.3.6文件的拷貝35</p><p&

11、gt;  3.3.7 文件的顯示36</p><p><b>  四 結(jié)束語37</b></p><p><b>  參考文獻38</b></p><p><b>  一 引言</b></p><p><b>  1.1 性質(zhì)</b></p&

12、gt;<p>  操作系統(tǒng)是計算機科學與技術(shù)專業(yè)的專業(yè)基礎(chǔ)課和主干課。操作系統(tǒng)對計算機系統(tǒng)資源實施管理,是所有其他軟件與計算機硬件的唯一接口,所有用戶在使用計算機時都要得到操作系統(tǒng)的服務(wù)。</p><p><b>  1.2 教學目的</b></p><p>  通過模擬操作系統(tǒng)的文件管理功能的實現(xiàn),加深對操作系統(tǒng)和原理和操作系統(tǒng)實現(xiàn)方法的理解,達到編程

13、的目的,提高學生運用理論知識分析問題、解決問題的能力,為學生從事科學研究和獨立負擔計算機及應(yīng)用方面的工作打好扎實的基礎(chǔ)。</p><p><b>  1.3 任務(wù)和要求</b></p><p>  模擬采用多道程序設(shè)計方法的單用戶操作系統(tǒng),本系統(tǒng)要求實現(xiàn)的邏輯結(jié)構(gòu)、文件的物理結(jié)構(gòu)、目錄結(jié)構(gòu)、磁盤的分配回收、文件的保護的實現(xiàn)。</p><p>&

14、lt;b>  1.4 意義</b></p><p>  通過模擬操作系統(tǒng)原理的實現(xiàn),加深對操作系統(tǒng)工作原理和操作系統(tǒng)實現(xiàn)方法的理解,掌握了初步分析實際問題的能力,為其今后在相關(guān)領(lǐng)域開展工作打下堅實的基礎(chǔ)。同時使學生系統(tǒng)科學的收到分析問題和解決問題的訓(xùn)練,提高運用理論只是解決實際問題的能力。</p><p>  1.5 論文結(jié)構(gòu)安排</p><p>

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

16、設(shè)計</b></p><p><b>  2.1 系統(tǒng)要求</b></p><p>  文件管理和用戶接口部分實現(xiàn)的主要是單用戶的磁盤文件管理部分,包括文件的邏輯結(jié)構(gòu)、物理結(jié)構(gòu)、目錄、磁盤分配回收的實現(xiàn)。</p><p>  2.1.1 文件的邏輯結(jié)構(gòu)</p><p>  文件的邏輯結(jié)構(gòu)采用流式結(jié)構(gòu);<

17、/p><p>  文件均采用文本文件;</p><p>  系統(tǒng)中有兩種文件,一種是存放任意字符的文件,一種是可執(zhí)行文件。可執(zhí)行文件的內(nèi)容就是模擬系統(tǒng)內(nèi)進程的程序體。</p><p>  文件中要有一種特定命令的“可執(zhí)行”文件,文件中的命令非常簡單,包括:</p><p>  x=; 給x賦值一位數(shù)</p><p> 

18、 x++; x加1</p><p>  x--; x減1</p><p>  !; 第一個?為A,B,C中某個設(shè)備,第二個?為一位數(shù),表示使用設(shè)備的時間(由于沒有實際設(shè)備,所以無法知道設(shè)備何時工作完成,所以假定一個數(shù),這個數(shù)隨著系統(tǒng)時間增加而遞減,減到0時,認為是設(shè)備工作完成);</p><p>  end. 表示文件結(jié)束,同時將結(jié)果寫入文件out

19、,其中包括文件路徑名和x的值。</p><p>  2.1.2 磁盤模擬</p><p>  用一個文件disk1模擬磁盤,磁盤的每個盤塊64字節(jié),模擬磁盤共有128塊。第0、1塊存放文件分配表,第2塊存放根目錄,其余存放子目錄和文件。</p><p>  2.1.3 目錄結(jié)構(gòu)</p><p>  目錄結(jié)構(gòu)采用樹型目錄結(jié)構(gòu)。</p>

20、;<p> ?、倌夸涰梼?nèi)容(8個字節(jié)):</p><p>  目錄名、文件名:3個字節(jié);</p><p><b>  擴展名:2個字節(jié);</b></p><p>  目錄、文件屬性:1字節(jié);</p><p>  起始盤塊號:1個字節(jié);</p><p><b>  文件長度:

21、1字節(jié)。</b></p><p><b> ?、诟夸?lt;/b></p><p>  根目錄位置固定,為磁盤第2塊,大小固定,共8項,占用模擬磁盤第2塊;</p><p><b> ?、圩幽夸?lt;/b></p><p>  位置不固定,大小不固定。</p><p> 

22、 2.1.4 磁盤分配</p><p>  磁盤的分配采用鏈接結(jié)構(gòu)(顯式鏈接)的分配方式。系統(tǒng)采用文件分配表方式記錄磁盤空間的使用情況和鏈接結(jié)構(gòu)的指針。</p><p>  因為磁盤有占用磁盤由128塊,所以文件分配表中一項需要1字節(jié),而磁盤由128塊,因而需要128項,所以模擬磁盤空間中的第0、1塊被用來存放文件分配表。</p><p>  2.1.5 屏幕顯示&

23、lt;/p><p>  磁盤目錄顯示,要求顯示磁盤的樹型目錄結(jié)構(gòu);</p><p>  磁盤使用情況,顯示磁盤每一個磁盤塊的空間是占用還是空閑。</p><p>  2.2 實現(xiàn)方法和原理</p><p>  2.2.1 文件的邏輯結(jié)構(gòu)</p><p>  文件邏輯結(jié)構(gòu)采用流式結(jié)構(gòu):</p><p>

24、;  文件的內(nèi)容均采用文本文件,系統(tǒng)有兩種文件:</p><p>  一種是存放任意字符的文件</p><p>  一種是可執(zhí)行文件:可執(zhí)行文件的內(nèi)容就是系統(tǒng)內(nèi)進程的程序體:文件中要有一種可執(zhí)行文件,文家中的命令非常簡單,金保國一下幾種指令:</p><p>  x=; 給x賦值一位數(shù)</p><p>  x++; x加1</p

25、><p>  x--; x減1</p><p>  !; 第一個?為A,B,C中某個設(shè)備,第二個?為一位數(shù),表示使用設(shè)備的時間(由于沒有實際設(shè)備,所以無法知道設(shè)備何時工作完成,所以假定一個數(shù),這個數(shù)隨著系統(tǒng)時間增加而遞減,減到0時,認為是設(shè)備工作完成);</p><p>  end. 表示文件結(jié)束,同時將結(jié)果寫入文件out,其中包括文件路徑名和x的值。&l

26、t;/p><p>  2.2.2 文件的物理結(jié)構(gòu)和目錄結(jié)構(gòu)</p><p>  文件的物理結(jié)構(gòu)采用顯式鏈接存儲方式,通過鏈接文件物理塊的指針顯示的存放在外村的一張鏈表中,這張表被稱為文件分配表(FAT)。該表一個磁盤僅設(shè)置一張。磁盤一共有128塊,則該表為128項。若某文件的一個磁盤塊號為i,則這個文件下的磁盤的快好j應(yīng)該記錄在表的第i項,如下圖2.2.2:</p><p&

27、gt;  圖2.2.2 某磁盤文件存放鏈接指針部分內(nèi)容</p><p>  目錄結(jié)構(gòu)采用樹型目錄結(jié)構(gòu)。每個目錄項共占8個字節(jié),目錄項的內(nèi)容包括:</p><p>  目錄名、文件名:3個字節(jié);</p><p><b>  擴展名:2個字節(jié);</b></p><p>  目錄、文件屬性:1字節(jié);</p>&l

28、t;p>  起始盤塊號:1個字節(jié);</p><p><b>  文件長度:1字節(jié)。</b></p><p>  文件的FCB圖如下圖2.2.2 屬性字節(jié)各位作用示意圖:</p><p>  2.2.2 屬性字節(jié)各位作用示意圖</p><p>  根目錄位置固定,為磁盤第2塊,大小固定,共8項,占用模擬磁盤第2塊;子

29、目錄位置不固定,大小不固定。</p><p>  2.2.3 目錄結(jié)構(gòu)</p><p>  目錄結(jié)構(gòu)采用樹形目錄結(jié)構(gòu),根目錄項既可以表示一個普通文件,也可以是下一級目錄的目錄文件的一個說明項,如此層層類推,形成一個樹形層次結(jié)構(gòu),如圖2.2.3所示:</p><p>  2.2.4 磁盤狀態(tài)</p><p>  磁盤的分配采用鏈接結(jié)構(gòu)(顯式鏈接

30、)的分配方式。系統(tǒng)采用文件分配表方式記錄磁盤空間的使用情況和鏈接結(jié)構(gòu)的指針,本設(shè)計的磁盤有一個磁盤:C盤。</p><p>  因為磁盤有占用磁盤由128塊,所以文件分配表中一項需要1字節(jié),而磁盤由128塊,因而需要128項,所以模擬磁盤空間中的第0、1塊被用來存放文件分配表(樣例如2.2.4.1 FAT分配表)。若一個盤塊是某個文件的最后一塊,填寫“-1”表示文件結(jié)束。</p><p>

31、  圖2.2.4.1 某磁盤文件存放鏈接指針部分內(nèi)容</p><p>  磁盤狀態(tài)的顯示以位示圖的方式顯示如圖2.2.4.2 位示圖,每個盤塊大小為64B,一共是128個盤塊。盤塊的塊號從0編起,依次為0,1,2,3,···,127。位示圖用字長為16位的字來構(gòu)造,共128個字,其中已使用的盤塊號標號為1,未使用的盤塊號標號為0。</p><p>  2.2.

32、4.2 位示圖</p><p><b>  三 系統(tǒng)實現(xiàn)</b></p><p><b>  3.1 磁盤管理</b></p><p>  3.1.1 磁盤的創(chuàng)建</p><p>  創(chuàng)建過程如下圖3.1.1</p><p>  3.1.1 磁盤創(chuàng)建流程圖</p>

33、<p>  FileStream Disk = new FileStream(harddisk, FileMode.Open);//harddisk為要建立的磁盤路徑</p><p>  byte[] FAT = new byte[128]; //FAT表的容量是128,為磁盤創(chuàng)建FAT表</p><p>  3.1.2 磁盤的初始化函數(shù)</p><p&g

34、t;  初始化FAT標的時候讀入的disnum的值都為0。</p><p>  #region RecordFileFAT(記錄文件的FAT表項)</p><p>  public void RecordFileFAT(int[] disknum, string harddisk)</p><p><b>  {</b></p>

35、<p>  FileStream Disk = new FileStream(harddisk, FileMode.Open);</p><p>  byte[] bydata = new byte[disknum.Length];</p><p>  for (int i = 0; i < disknum.Length; i++)</p><p>

36、<b>  {</b></p><p>  bydata[i] = Convert.ToByte(disknum[i]);</p><p><b>  }</b></p><p>  int j = 0;</p><p>  while (j != disknum.Length - 1)</p

37、><p><b>  {</b></p><p>  Disk.Seek(disknum[j] - 1, SeekOrigin.Begin);</p><p>  Disk.WriteByte(bydata[j + 1]);</p><p><b>  j++;</b></p><p

38、><b>  }</b></p><p>  Disk.Seek(disknum[disknum.Length - 1] - 1, SeekOrigin.Begin);</p><p>  Disk.WriteByte(253);</p><p>  Disk.Close();</p><p><b> 

39、 }</b></p><p>  #endregion</p><p>  3.1.3 畫樹結(jié)點</p><p>  #region ReadFile(讀文件畫節(jié)點)</p><p>  public void ReadFile(TreeView treeView, ContextMenuStrip contextMenuStri

40、p, ImageList imageList)</p><p><b>  {</b></p><p>  treeView.Nodes.Clear(); //刪除集合中所有樹節(jié)點</p><p>  //重新添加樹節(jié)點 </p><p>  treeView.ImageList = imageList

41、;</p><p>  TreeNode root = new TreeNode("計算機", 0, 0);</p><p>  TreeNode node_C = new TreeNode("本地磁盤C", 4, 4);</p><p>  node_C.ContextMenuStrip = contextMenuStrip

42、;</p><p>  treeView.Nodes.Add(root);</p><p>  root.Nodes.Add(node_C);</p><p>  DrawTree(node_C, 3, "disk1.txt", contextMenuStrip);</p><p>  treeView.ExpandAll

43、();</p><p><b>  }</b></p><p>  #endregion</p><p><b>  3.1.4 畫樹</b></p><p>  #region DrawTree</p><p>  public void DrawTree(TreeNode

44、 node, int disknum, string harddisk, ContextMenuStrip contextmenustrip)</p><p><b>  {</b></p><p>  char[] charname = new char[2];</p><p>  byte[] bytename = new byte[3];

45、</p><p>  int n = 0;</p><p>  for (int i = 0; i < 8; i++)</p><p><b>  {</b></p><p>  FileStream Disk = new FileStream(harddisk, FileMode.Open);</p>

46、<p>  Disk.Seek(64 * (disknum - 1) + n, SeekOrigin.Begin);</p><p>  Disk.Read(bytename, 0, 3); //讀文件名</p><p>  string name = UTF8Encoding.UTF8.GetString(byten

47、ame); //文件名轉(zhuǎn)換為string類型</p><p>  Disk.Seek(2, SeekOrigin.Current);</p><p>  int attr = Disk.ReadByte();</p><p>  Disk.Close();</p><p>  if (attr == 8)

48、 //目錄</p><p><b>  {</b></p><p>  FileStream Disk1 = new FileStream(harddisk, FileMode.Open);</p><p>  TreeNode m_childnode = new TreeNode(name, 1, 1);</p>

49、<p>  m_childnode.ContextMenuStrip = contextmenustrip;</p><p>  node.Nodes.Add(m_childnode);</p><p>  Disk1.Seek(64 * (disknum - 1) + 6 + n, SeekOrigin.Begin);</p><p>  int d

50、isknumber = Disk1.ReadByte();</p><p>  Disk1.Close();</p><p>  DrawTree(m_childnode, disknumber, harddisk, contextmenustrip);</p><p>  n = n + 8;</p><p><b>  cont

51、inue;</b></p><p><b>  }</b></p><p>  else if (attr == 2 || attr == 3) //exe文件</p><p><b>  {</b></p><p>  name += ".ex";<

52、;/p><p>  TreeNode e_childnode = new TreeNode(name, 2, 2);</p><p>  e_childnode.ContextMenuStrip = contextmenustrip;</p><p>  node.Nodes.Add(e_childnode);</p><p>  n = n +

53、 8;</p><p><b>  continue;</b></p><p><b>  }</b></p><p>  else if (attr == 4 || attr == 5) //txt文件</p><p><b>  {</b></p>

54、<p>  name += ".tx";</p><p>  TreeNode t_childnode = new TreeNode(name, 3, 3);</p><p>  t_childnode.ContextMenuStrip = contextmenustrip;</p><p>  node.Nodes.Add(t_ch

55、ildnode);</p><p>  n = n + 8;</p><p><b>  continue;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</

56、b></p><p>  n = n + 8;</p><p><b>  continue;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>&l

57、t;/p><p>  #endregion</p><p>  3.1.5 讀FAT表畫磁盤</p><p>  磁盤狀態(tài)的顯示如下圖3.1.5 磁盤狀態(tài)圖:</p><p>  3.1.5 磁盤狀態(tài)圖</p><p><b>  完成算法:</b></p><p>  #re

58、gion DrawDisk(讀FAT畫磁盤)</p><p>  public void DrawDisk(GroupBox groupbox, string harddisk)</p><p><b>  {</b></p><p>  groupbox.Controls.Clear();</p><p>  File

59、Stream Disk = new FileStream(harddisk, FileMode.Open);</p><p>  byte[] FAT = new byte[128];</p><p>  Disk.Seek(0, SeekOrigin.Begin);</p><p>  Disk.Read(FAT, 0, 128);</p><

60、p>  Disk.Close();</p><p>  PictureBox[] PB = new PictureBox[128];</p><p>  for (int i = 0; i < 3; i++)</p><p><b>  {</b></p><p>  PB[i] = new PictureB

61、ox(); //實例化</p><p>  PB[i].BorderStyle = BorderStyle.Fixed3D;</p><p>  PB[i].BackColor = Color.GreenYellow;</p><p>  PB[i].Size = new System.Drawing.Size(15, 15);</p><p

62、><b>  }</b></p><p>  for (int i = 3; i < 128; i++)</p><p><b>  {</b></p><p>  PB[i] = new PictureBox(); //實例化</p><p>  PB[i].BorderStyle

63、 = BorderStyle.Fixed3D;</p><p>  PB[i].Size = new System.Drawing.Size(15, 15);</p><p><b>  }</b></p><p>  //初始化picturebox的位置</p><p>  int j = 0;</p>

64、<p><b>  int k;</b></p><p>  int n = 0;</p><p>  for (int i = 0; i < 8; i++)</p><p><b>  {</b></p><p><b>  k = 0;</b></p&

65、gt;<p>  while (j != 16 * (i + 1))</p><p><b>  {</b></p><p>  PB[j].Location = new System.Drawing.Point(17 + 16 * k, 21 + 16 * n);</p><p><b>  j++;</b>

66、;</p><p><b>  k++;</b></p><p><b>  }</b></p><p><b>  n++;</b></p><p><b>  }</b></p><p>  for (int i = 3; i

67、< 128; i++)</p><p><b>  {</b></p><p>  if (FAT[i] != 0)</p><p><b>  {</b></p><p>  PB[i].BackColor = Color.Blue;</p><p><b>

68、;  }</b></p><p>  if (FAT[i] == 0)</p><p><b>  {</b></p><p>  PB[i].BackColor = Color.Gray;</p><p><b>  }</b></p><p><b>

69、;  }</b></p><p>  for (int i = 0; i < 128; i++)</p><p><b>  {</b></p><p>  groupbox.Controls.Add(PB[i]);</p><p><b>  }</b></p>&

70、lt;p><b>  }</b></p><p>  #endregion</p><p>  3.1.6 磁盤的分配和回收</p><p>  磁盤的分配時先查找控盤塊,然后將空盤塊標記由0標記為1,表示已分配。</p><p>  過程如3.1.6 磁盤分配:</p><p>  3.1

71、.6 磁盤分配</p><p>  然后再將返回的分配數(shù)組記錄文件,然后將文件讀入數(shù)組中,應(yīng)用RecordFileFAT函數(shù),記錄保存的信息,并將磁盤的FAT表存儲信息的盤塊標記為1。</p><p><b>  實現(xiàn)函數(shù):</b></p><p>  #region SearchFAT(查找空盤塊)</p><p> 

72、 public int[] SearchFAT(int n, string harddisk)</p><p><b>  {</b></p><p>  FileStream Disk = new FileStream(harddisk, FileMode.Open);</p><p>  byte[] FAT = new byte[128]

73、;</p><p>  Disk.Seek(0, SeekOrigin.Begin);</p><p>  Disk.Read(FAT, 0, FAT.Length);</p><p>  Disk.Close();</p><p>  int k = 0;</p><p>  while (k < 128)&l

74、t;/p><p><b>  {</b></p><p>  if (FAT[k] == 0)</p><p><b>  {</b></p><p><b>  break;</b></p><p><b>  }</b></p

75、><p><b>  k++;</b></p><p><b>  }</b></p><p>  if (k == 128)</p><p><b>  {</b></p><p>  MessageBox.Show("磁盤已滿!",

76、"注意");</p><p>  return null;</p><p><b>  }</b></p><p>  int[] disknum = new int[n];</p><p>  int j = 0;</p><p>  for (int i = 0; i &l

77、t; 128; i++)</p><p><b>  {</b></p><p>  if (FAT[i] == 0)</p><p><b>  {</b></p><p>  while (j < n)</p><p><b>  {</b>&

78、lt;/p><p>  disknum[j] = i + 1;</p><p><b>  j++;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  if (j == n)</p&g

79、t;<p><b>  {</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p&g

80、t;<p>  int[] newdisknum = new int[j];</p><p>  for (int t = 0; t < j; t++)</p><p><b>  {</b></p><p>  newdisknum[t] = disknum[t];</p><p><b>

81、;  }</b></p><p>  if (j < n)</p><p><b>  {</b></p><p>  return newdisknum;</p><p><b>  }</b></p><p><b>  else</b&

82、gt;</p><p><b>  {</b></p><p>  return disknum;</p><p><b>  }</b></p><p><b>  }</b></p><p>  #endregion</p><p

83、>  #region RecordFileFAT(記錄文件的FAT表項)</p><p>  public void RecordFileFAT(int[] disknum, string harddisk)</p><p><b>  {</b></p><p>  FileStream Disk = new FileStream(ha

84、rddisk, FileMode.Open);</p><p>  byte[] bydata = new byte[disknum.Length];</p><p>  for (int i = 0; i < disknum.Length; i++)</p><p><b>  {</b></p><p>  b

85、ydata[i] = Convert.ToByte(disknum[i]);</p><p><b>  }</b></p><p>  int j = 0;</p><p>  while (j != disknum.Length - 1)</p><p><b>  {</b></p>

86、;<p>  Disk.Seek(disknum[j] - 1, SeekOrigin.Begin);</p><p>  Disk.WriteByte(bydata[j + 1]);</p><p><b>  j++;</b></p><p><b>  }</b></p><p>

87、;  Disk.Seek(disknum[disknum.Length - 1] - 1, SeekOrigin.Begin);</p><p>  Disk.WriteByte(253);</p><p>  Disk.Close();</p><p><b>  }</b></p><p>  #endregion&

88、lt;/p><p>  磁盤回收時,先確定回收的磁盤的盤塊和長度,然后再將分配的表項中的1改為0。其中dums.Length為刪除盤塊的數(shù)量,dums函數(shù)記錄要撤銷的盤塊號。</p><p>  for (int t = 0; t < dnums.Length; t++)</p><p><b>  {</b></p><

89、p>  Disk.Seek(dnums[t] - 1, SeekOrigin.Begin);</p><p>  Disk.WriteByte(0);</p><p><b>  }</b></p><p>  3.2 目錄結(jié)構(gòu)的實現(xiàn)</p><p>  3.2.1 創(chuàng)建目錄</p><p>

90、;  建立目錄首先要找到建立目錄的位置(父目錄),然后查找該目錄是否存在,如果父目錄不存在,不能建立,如果存在,查找是否存在同名目錄,存在,不能建立,不存在,則查找一個空目錄項,,為該目錄項申請一個盤塊,并填寫目錄內(nèi)容,如圖3.2.1創(chuàng)建流程圖所示所示:</p><p>  3.2.1 創(chuàng)建目錄流程圖</p><p><b>  完成函數(shù):</b></p>

91、<p>  #region CreateMenu(建立目錄)</p><p>  public void CreateMenu(string pathname, string harddisk)</p><p><b>  {</b></p><p>  int searchresult = Search(pathname, ha

92、rddisk);</p><p>  string byt = "xx";</p><p>  byte[] type = System.Text.Encoding.ASCII.GetBytes(byt);</p><p>  if (searchresult == 1)</p><p><b>  {</

93、b></p><p>  MessageBox.Show("文件路徑不存在!", "注意", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);</p><p><b>  return;</b></p><p><b>  }</b

94、></p><p>  else if (searchresult == 0)</p><p><b>  {</b></p><p>  string[] pnames = pathname.Split(new char[] { '\\' }); //分割路徑</p><p>

95、  string halfpathname = pathname.Remove(pathname.Length - 4); //去掉最后一個目錄名</p><p>  UTF8Encoding utf = new UTF8Encoding();</p><p>  int disknum = FindFAT(harddisk);</p><p>  byt

96、e disknumber = Convert.ToByte(disknum);</p><p>  if (halfpathname.Length != 2)</p><p><b>  {</b></p><p>  if (FindNullItem(Search(halfpathname, harddisk), harddisk) == 0

97、) //沒有空目錄項</p><p><b>  {</b></p><p>  MessageBox.Show("目錄已滿!");</p><p><b>  return;</b></p><p><b>  }</b></p>&l

98、t;p>  WriteFile(Search(halfpathname, harddisk), FindNullItem(Search(halfpathname, harddisk), harddisk), CreateFCB(utf.GetBytes(pnames[pnames.Length - 1]), type, 8, disknumber, Convert.ToByte(0)), harddisk);</p>

99、<p>  RecordMenuFAT(disknum, harddisk);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if (FindNullItem(3,

100、harddisk) == 0) //沒有空目錄項</p><p><b>  {</b></p><p>  MessageBox.Show("目錄已滿!");</p><p><b>  return;</b></p><p><b>  }</b>

101、</p><p>  WriteFile(3, FindNullItem(3, harddisk), CreateFCB(utf.GetBytes(pnames[pnames.Length - 1]), type, 8, disknumber, Convert.ToByte(0)), harddisk);</p><p>  RecordMenuFAT(disknum, harddisk)

102、;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  MessageBox.Show("

103、;文件存在!", "注意", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  }</b></

104、p><p>  #endregion</p><p>  3.2.2 刪除空目錄</p><p>  刪除空目錄首先要找到該目錄,如果目錄不存在,刪除失??;如果存在,但是,是非空目錄,顯示不能刪除,操作失?。蝗羰强漳夸?,將目錄在樹形目錄和磁盤中刪除,如圖3-7所示:</p><p><b>  實現(xiàn)函數(shù):</b></p

105、><p>  #region DeleteEmptyMenu(刪除y空目錄)</p><p>  public void DeleteEmptyMenu(string pathname, string harddisk)</p><p><b>  {</b></p><p>  if (Search(pathname, h

106、arddisk) == 1)</p><p><b>  {</b></p><p>  MessageBox.Show("文件路徑不正確!", "注意", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);</p><p><b>  retu

107、rn;</b></p><p><b>  }</b></p><p>  else if (Search(pathname, harddisk) == 0)</p><p><b>  {</b></p><p>  MessageBox.Show("文件不存在!"

108、, "注意", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  else</b></p>&l

109、t;p><b>  {</b></p><p>  string[] pnames = pathname.Split(new char[] { '\\', '.' });</p><p>  string halfpathname = pathname.Remove(pathname.Length - 3);</p>

110、<p>  int lastdnum = Search(pathname, harddisk);</p><p>  if (pnames[pnames.Length - 1].Equals("tx") || pnames[pnames.Length - 1].Equals("ex"))</p><p><b>  {</

111、b></p><p>  MessageBox.Show("目錄不為空目錄", "注意", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);</p><p><b>  return;</b></p><p><b>  }</b&

112、gt;</p><p>  int attribute;</p><p>  byte[] bytename = new byte[2];</p><p>  UTF8Encoding utf8 = new UTF8Encoding();</p><p>  int n = 0;</p><p>  for (int

113、i = 0; i < 8; i++)</p><p><b>  {</b></p><p>  FileStream Disk = new FileStream(harddisk, FileMode.Open);</p><p>  Disk.Seek(64 * (lastdnum - 1) + n, SeekOrigin.Begin)

114、; //查找</p><p>  Disk.Read(bytename, 0, 2);</p><p>  Disk.Seek(2, SeekOrigin.Current);</p><p>  attribute = Disk.ReadByte();</p><p>  if (attribute == 8)</p><

115、p><b>  {</b></p><p>  pathname = pathname + '\\' + utf8.GetString(bytename);</p><p>  Disk.Close();</p><p>  DeleteMenu(pathname, harddisk);</p><p&

116、gt;<b>  }</b></p><p>  else if (attribute == 2 || attribute == 3 || attribute == 4 || attribute == 5)</p><p><b>  {</b></p><p>  MessageBox.Show("目錄不為空目

117、錄", "注意", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);</p><p>  Disk.Close();</p><p><b>  return;</b></p><p><b>  }</b></p><p

118、><b>  else</b></p><p><b>  {</b></p><p>  Disk.Close();</p><p><b>  break;</b></p><p><b>  }</b></p><p>

119、  n = n + 8;</p><p><b>  }</b></p><p>  int disknum;</p><p>  if (pnames.Length == 2) //c:\aa</p><p><b>  {</b></p><p>  disknum

120、= 3;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  disknum = Search(halfpathname, harddisk);</p><p>

121、;<b>  }</b></p><p>  UTF8Encoding utf = new UTF8Encoding();</p><p>  byte[] name = utf.GetBytes(pnames[pnames.Length - 1]);</p><p>  int item = FindItem(disknum, name, C

122、onvert.ToChar(8), harddisk)[0]; //目錄項</p><p>  int address = FindItem(disknum, name, Convert.ToChar(8), harddisk)[1]; //目錄起始盤塊號</p><p>  DeleteFCB(disknum, item, harddisk); //刪除FCB</p&

123、gt;<p>  FileStream Disk1 = new FileStream(harddisk, FileMode.Open);</p><p>  Disk1.Seek(64 * (address - 1), SeekOrigin.Begin);</p><p>  Disk1.Seek(address - 1, SeekOrigin.Begin);//記錄FAT為

124、0</p><p>  Disk1.WriteByte(0);</p><p>  Disk1.Close();</p><p><b>  }</b></p><p><b>  }</b></p><p>  #endregion</p><p>

125、  3.2.3 刪除目錄</p><p>  刪除目錄是在刪除空目錄的基礎(chǔ)上增加了刪除非空目錄的功能。首先檢查要刪除的目錄是否為空,若為空,調(diào)用刪除空目錄的函數(shù),將其刪除;若不為空,深度優(yōu)先遍歷以該目錄為根節(jié)點的子樹,將其孩子節(jié)點依次都刪除,最后調(diào)用刪除空目錄的函數(shù),將該目錄刪除,就完成了刪除目錄的工作。具體流程如圖3.2.3 刪除目錄流程圖所示:</p><p><b>  實

126、現(xiàn)函數(shù):</b></p><p>  #region DeleteMenu(刪除目錄)</p><p>  public void DeleteMenu(string pathname, string harddisk)</p><p><b>  {</b></p><p>  if (Search(pat

127、hname, harddisk) == 1)</p><p><b>  {</b></p><p>  MessageBox.Show("文件路徑不正確!", "注意", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);</p><p><b&g

128、t;  return;</b></p><p><b>  }</b></p><p>  else if (Search(pathname, harddisk) == 0)</p><p><b>  {</b></p><p>  MessageBox.Show("文件不存

129、在!", "注意", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  else</b></p

130、><p><b>  {</b></p><p>  string[] pnames = pathname.Split(new char[] { '\\', '.' });</p><p>  string halfpathname = pathname.Remove(pathname.Length - 4);<

131、;/p><p>  int lastdnum = Search(pathname, harddisk);</p><p>  int attribute;</p><p>  byte[] bytename = new byte[3];</p><p>  UTF8Encoding utf8 = new UTF8Encoding();</p

132、><p>  int n = 0;</p><p>  for (int i = 0; i < 8; i++)</p><p><b>  {</b></p><p>  FileStream Disk = new FileStream(harddisk, FileMode.Open);</p><

133、p>  Disk.Seek(64 * (lastdnum - 1) + n, SeekOrigin.Begin);</p><p>  Disk.Read(bytename, 0, 3);</p><p>  Disk.Seek(2, SeekOrigin.Current);</p><p>  attribute = Disk.ReadByte();<

134、/p><p>  if (attribute == 8)</p><p><b>  {</b></p><p>  pathname = pathname + '\\' + utf8.GetString(bytename);</p><p>  Disk.Close();</p><p&

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論