版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 《操作系統(tǒng)》課程設(shè)計</p><p> 設(shè)計名稱: 模擬文件管理系統(tǒng) </p><p> 課程設(shè)計負責人: </p><p> 課程設(shè)計成員:
2、 </p><p><b> 二〇一一年十二月</b></p><p> 目錄Contents</p><p> 第一部分:課程設(shè)計目的3</p><p> 第二部分:設(shè)計要求3</p><p> 第三部分:運行環(huán)境3</p><p> 第四部分:
3、實驗內(nèi)容4</p><p> 4.1前期知識鞏固4</p><p><b> 4.2設(shè)計任務(wù)5</b></p><p> 4.3詳細設(shè)計部分10</p><p> 4.3.1數(shù)據(jù)結(jié)構(gòu)10</p><p> 4.3.2主要函數(shù)11</p><p> 4
4、.3.3系統(tǒng)流程圖11</p><p> 第五部分:調(diào)試分析13</p><p> 5.1用戶登錄13</p><p> 5.2創(chuàng)建文件14</p><p> 5.3查看文件15</p><p> 5.4刪除文件15</p><p> 5.5修改文件夾位置16</
5、p><p> 第六部分:參考文獻16</p><p> 第七部分:附錄17</p><p> 7.1心得體會17</p><p> 7.2源代碼(代碼文字已縮小)17</p><p> 第一部分:課程設(shè)計目的</p><p> 本設(shè)計的目的是實現(xiàn)操作系統(tǒng)和相關(guān)系統(tǒng)軟件的設(shè)計,其中
6、涉及進程編程、I/O操作、存儲管理、文件系統(tǒng)等操作系統(tǒng)概念。具體指在內(nèi)存中開辟一個虛擬的磁盤空間作為文件存儲器,在其上實現(xiàn)一個簡單的單用戶文件系統(tǒng)。在退出這個文件系統(tǒng)時應(yīng)將該文件系統(tǒng)保存到磁盤上,以便下次可以再將它恢復(fù)到內(nèi)存的虛擬磁盤空間中。</p><p><b> 第二部分:設(shè)計要求</b></p><p> (1)對進行認真分析,列出實驗具體步驟,寫出符合題
7、目要求的程序清單,準備出調(diào)試程序使用的數(shù)據(jù)。</p><p> (2)設(shè)計一個10個用戶的文件系統(tǒng),每次用戶可保存10個文件,一次運行用戶可以打開5個文件。</p><p> (3)程序采用二級文件目錄(即設(shè)置主目錄MFD)和用戶文件目錄(UFD)。另外,為打開文件設(shè)置了運行文件目錄(AFD)。</p><p> (4)文件保護簡單使用三位保護碼:允許讀寫執(zhí)行
8、、對應(yīng)位為1,對應(yīng)位為0,則表示不允許讀寫、執(zhí)行。</p><p> (5)以完整的論文形式提交原始代碼、設(shè)計文檔和可運行程序。提交的文檔應(yīng)當包括:設(shè)計題目,程序清單,運行結(jié)果分析,算法及其優(yōu)缺點,以及通過上機取得了哪些經(jīng)驗。程序清單要求格式規(guī)范,注意加注釋(包含關(guān)鍵字、方法、變量等),在每個模塊前加注釋。</p><p> (6)本組交一份設(shè)計文檔的同時每名組員交一份實踐體會。<
9、;/p><p><b> 第三部分:運行環(huán)境</b></p><p> windows xp 系統(tǒng),windows 7 旗艦版系統(tǒng)</p><p> 編譯器:Microsoft Visual C++ 6.0</p><p><b> 編輯語言:c++</b></p><p&g
10、t;<b> 第四部分:實驗內(nèi)容</b></p><p><b> 4.1前期知識鞏固</b></p><p><b> A、文件系統(tǒng):</b></p><p> 文件系統(tǒng)是操作系統(tǒng)的五大功能模塊之一,主要實現(xiàn)操作系統(tǒng)對程序、數(shù)據(jù)、設(shè)備等的管理。文件系統(tǒng)的主要功能:完成文件存儲空間管理,實現(xiàn)文
11、件名到物理地址的映射,實現(xiàn)文件和目錄的操作管理,提供文件共享能力和安全措施等功能。</p><p><b> B、文件</b></p><p> 文件是信息的一種組織形式,是存儲在外存上的帶有標識號的一組相關(guān)信息的集合,而這個集合既可以由相關(guān)聯(lián)的字符流組成,也可以由相關(guān)聯(lián)的記錄組成。</p><p> 文件的構(gòu)成:文件控制塊(FCB)、數(shù)
12、據(jù)。FCB是系統(tǒng)在管理文件時所需信息的數(shù)據(jù)結(jié)構(gòu),是文件存在的惟一標志。包括了文件的基本屬性,大致有文件名、地址、存取控制信息(如文件所有者、同組用戶、訪問權(quán)限)以及使用信息(如創(chuàng)建日期、修改日期)。</p><p><b> C、文件目錄</b></p><p> 文件控制塊的有序集合稱為文件目錄。文件目錄的基本功能是實現(xiàn)文件名與其存放位置的映射。</p&g
13、t;<p><b> D、文件的物理結(jié)構(gòu)</b></p><p> 常用的結(jié)構(gòu)有順序結(jié)構(gòu)、鏈接結(jié)構(gòu)、文件分配表結(jié)構(gòu)FAT、索引結(jié)構(gòu)、多級索引結(jié)構(gòu)。</p><p><b> E、文件操作</b></p><p> 文件的操作就是創(chuàng)建/刪除文件、打開/關(guān)閉文件、讀/寫文件等</p><
14、;p><b> F、磁盤空間管理</b></p><p> 文件系統(tǒng)的一個重要任務(wù)是對磁盤空間進行管理。</p><p> 磁盤空間管理的關(guān)鍵問題是磁盤空閑空間的管理。</p><p> 常用的空閑塊管理方法有:空閑文件目錄法、空閑塊鏈法、位示圖法、空閑塊成組鏈接法。</p><p><b>
15、4.2設(shè)計任務(wù)</b></p><p> 建立一個大文件,把它假象成一張盤,在其中實現(xiàn)一個簡單的模擬Linux文件系統(tǒng)。</p><p> 在現(xiàn)有機器硬盤上開辟1M的硬盤空間,模擬作為作為設(shè)定的硬盤空間。</p><p> 編寫一管理程序simdisk對此空間進行管理,以模擬Linux文件系統(tǒng),要求:</p><p><
16、;b> 盤塊大小1k </b></p><p> 空閑盤塊的管理:Linux位圖法</p><p> 結(jié)構(gòu):超級塊, i結(jié)點區(qū), 根目錄區(qū)</p><p> 該文件管理程序的功能要求如下:</p><p> Format:對文件存儲器進行格式化 mkdir:用于創(chuàng)建子目錄</p>
17、<p> dir:用于顯示目錄</p><p><b> cd:更改當前目錄</b></p><p> create:創(chuàng)建文件</p><p><b> write:寫文件</b></p><p><b> read:讀文件</b></p>
18、<p><b> del:刪除文件</b></p><p> access: 權(quán)限</p><p><b> 程序的總體流程為:</b></p><p><b> 初始化文件目錄;</b></p><p> 輸出提示符,等待接受命令,分析鍵入的命令;<
19、;/p><p> 對合法的命令,執(zhí)行相應(yīng)的處理程序,否則輸出錯誤信息,繼續(xù)等待新命令,直到鍵入EXIT退出為止。總體流程圖如下所示:</p><p> 以下是各功能模塊流程圖:</p><p><b> 4.3詳細設(shè)計部分</b></p><p><b> 4.3.1數(shù)據(jù)結(jié)構(gòu)</b></p
20、><p><b> 4.3.2主要函數(shù)</b></p><p> 4.3.3系統(tǒng)流程圖</p><p> (1)Login 用戶登錄</p><p> 用戶輸入用戶名和密碼,在passwd文件中查找是否有此用戶,核對密碼。正確則登陸成功,當前目錄設(shè)定到當前用戶文件夾下。</p><p> ?。?/p>
21、2)format 格式化</p><p> 初始化超級塊,初始化主目錄,初始化管理員admin 目錄,初始化用戶目錄,初始化 用戶passwd文件。</p><p> ?。?)create 創(chuàng)建文本文件</p><p> 查找當前目錄下是否有同名文件,是則退出,否則讓用戶輸入文本文件內(nèi)容,以‘###’結(jié)束。申請硬盤空間,申請失敗則結(jié)束。將文件內(nèi)容寫入硬盤空間。
22、修改當前目錄的結(jié)構(gòu),修改超級塊。</p><p> ?。?)cdir 創(chuàng)建文件夾</p><p> 查找當前目錄下是否有同名文件,是則退出,否則,申請硬盤空間,申請失敗則結(jié)束。將文件夾內(nèi)容寫入硬盤空間。修改當前目錄的結(jié)構(gòu),修改超級塊,寫入模擬硬盤。</p><p> ?。?)read edit –讀取和追加文本文件</p><p> ?。?
23、)Read----查找當前目錄下是否該文件,沒有則退出,否則調(diào)用access()權(quán)限判斷,有權(quán)限則判斷是不是文件,不是則退出,是文件則讀取文件并顯示。</p><p> (7)Edit----調(diào)用讀取文件模塊,讀取成功則用戶輸入追加的內(nèi)容,如果追加的內(nèi)容大于一個硬盤分配空間則申請分配空間,失敗則退出,申請成功則保存文件。</p><p> (8)access(文件名) 權(quán)限判斷<
24、/p><p> 先判斷當前目錄是否有該文件,在當前目錄的硬盤空間找到該文件,判斷當前登錄用戶是哪個組,判斷是否該用戶創(chuàng)建,判斷該文件的可見級別。</p><p> 如果是該用戶創(chuàng)建的 則有讀寫權(quán)限如果當前用戶是管理員組的 也具有讀寫權(quán)限如果該文件是用戶可查看文件則都具有權(quán)限。</p><p> (9)cd –進入子目錄 或上級目錄</p><p
25、> 查找當前目錄是否有該子目錄,沒有則退出,調(diào)用access()判斷當前用戶是否有權(quán)限,無則退出,有則讀取該子目錄的目錄,將當前目錄指向該目錄。</p><p> ?。?0)attr(文件名)查看文件或者文件夾的屬性</p><p> 先查找當前目錄下是否有該文件或目錄,有則判斷文件是否系統(tǒng)文件,是否文本文件,是否目錄,由誰創(chuàng)建,屬于什么組,占用的空間和目錄。將其全部顯示出來。&
26、lt;/p><p> ?。?1)del 刪除文件或目錄</p><p> 查找當前目錄是否有該文件名,沒有則退出,有則調(diào)用access()判斷是否有權(quán)限,有則判斷是否為系統(tǒng)文件,是則無法刪除,不是則判斷是否是文件,是文件則直接刪除,不是則判斷是否文件夾,是文件夾則判斷該文件夾下是否有文件,有文件則無法刪除。提示用戶是否刪除,確認則刪除文件,修改當前文件夾目錄和硬盤空間結(jié)構(gòu),修改超級塊,寫入模
27、擬硬盤。</p><p> (12)Dir 列文件目錄(列出文件名、物理地址、保護碼和文件長度)</p><p><b> 第五部分:調(diào)試分析</b></p><p><b> 5.1用戶登錄</b></p><p> 初始登陸界面,根據(jù)注冊用戶的信息,每次登陸有三次登陸機會,如果失敗即結(jié)束
28、并退出,用戶名和驗證碼與注冊的信息一致則進入系統(tǒng),下圖顯示的是登陸時失敗的畫面:</p><p> 登陸成功后畫面顯示:</p><p><b> 5.2創(chuàng)建文件</b></p><p> 創(chuàng)建文件并輸入文件內(nèi)容,我們的創(chuàng)建文件模式為“CREAT +文件名稱”,下圖的名稱為123,之后系統(tǒng)顯示輸入文件內(nèi)容,同時會提醒內(nèi)容以“###”結(jié)尾,
29、此便于系統(tǒng)識別,具體畫面如下所示:</p><p> 下面是創(chuàng)建文件夾,文件夾不需要輸入文件信息。</p><p><b> 5.3查看文件</b></p><p> 根據(jù)之前創(chuàng)建的文件,可以查看當前文件夾中已經(jīng)創(chuàng)建文件的信息。命令“dir”。</p><p><b> 5.4刪除文件</b>
30、;</p><p> 創(chuàng)建文件夾并刪除,創(chuàng)建文件夾的命令為“CDIR+文件夾名稱”,下圖以123為例;刪除命令為DEL+文件夾名稱/文件名稱,下圖還以AAA文件夾為例,如下圖所示:</p><p> 刪除后查看,可以驗證文件已經(jīng)刪除。</p><p> 5.5修改文件夾位置</p><p><b> 第六部分:參考文獻<
31、;/b></p><p> [1] 羅宇等 . 《操作系統(tǒng)(第2版)》.電子工業(yè)出版社</p><p> [2] 譚浩強 .《C++程序設(shè)計》.清華大學出版社[3] 寧正元等 . 《算法與數(shù)據(jù)結(jié)構(gòu)》.清華大學出版社[4] 林銳 . 《高質(zhì)量程序設(shè)計》.電子工業(yè)出版社</p><p> [5] 張乃孝 .《算法與數(shù)據(jù)結(jié)構(gòu)-c語言描述》(第二版).高等教
32、育出版社</p><p> [6] 嚴蔚敏等.《數(shù)據(jù)結(jié)構(gòu)(C語言版)》.清華大學出版社</p><p> [7] 蘇仕華等.《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計》.機械工業(yè)出版社</p><p><b> 第七部分:附錄</b></p><p><b> 7.1心得體會</b></p><
33、p> 在本次課程設(shè)計剛剛開始時,不知道怎么設(shè)計,只知道大概的結(jié)構(gòu)。后來認真閱讀課本有關(guān)的知識,知道怎樣設(shè)計結(jié)構(gòu)體才方便文件操作。知道怎樣設(shè)計后,寫程序時也遇到很多的障礙,特別是指針的改接和指向和出錯處理。此時深感自己編程能力的不足,經(jīng)過多次修改,終于設(shè)計好了該設(shè)計。</p><p> 通過該課程設(shè)計,使我們更了解了課本知識,鞏固了課本知識,同時也使我們的編程能力有了一定的提高,最重要的是我們深切體會到團
34、隊的重要,怎么配合和分工才能更快更好的完成任務(wù)。</p><p> 7.2源代碼(代碼文字已縮小)</p><p> #include<iostream></p><p> #include <time.h></p><p> #include <string></p><p&g
35、t; #include <fstream></p><p> #include <sstream></p><p> #include <stdlib.h></p><p> #include <stdio.h></p><p> #include <string.h>&l
36、t;/p><p> #include <iomanip></p><p> #include <io.h></p><p> #include <malloc.h></p><p> #include <dos.h></p><p> #include <co
37、nio.h></p><p> #include <windows.h></p><p> #define BOOL int </p><p> using namespace std;</p><p> const unsigned FILE_SYS_SIZE = 1024 * 1024; //模擬文件系統(tǒng)的容量
38、設(shè)為1M </p><p> const unsigned BITMAP_LEN = 64; //位示圖的長度 512/8 </p><p> const unsigned BLOCK_SIZE = 512; //一個文件塊的大小 </p><p> const unsigned BLOCK_COUNT = 512; //文件系統(tǒng)中文件塊的數(shù)量
39、</p><p> const unsigned NAME_LEN = 15; //最長文件名的長度 </p><p> const unsigned PASSWORD_LEN = 15; //用戶密碼的最大長度 </p><p> const unsigned LOGIN_COUNT = 3;
40、 //用戶登錄嘗試次數(shù) </p><p> const unsigned COMMAND_LEN = 200; //命令行最大長度 </p><p> const unsigned PRO_SET_COMM_COU = 11; //預(yù)設(shè)命令數(shù)</p><p> const unsigned USER_NAME_SIZE=15;//最大
41、用戶名長度 </p><p> const unsigned USER_PASSWORD_SIZE=15;//最大用戶密碼長度</p><p> const unsigned MAX_USER_NUMBER=10;//最多用戶數(shù)目</p><p> const unsigned MAX_FILE_SIZE=200;//最大文本字符數(shù)目</p>&
42、lt;p> const char *PRO_SET_COMM[] = {"creat", "format", "read", "write", "logout", "del", "cdir", "cd", "dir", "exit"
43、,"help"}; </p><p> //文件元素可供操作性權(quán)限 </p><p> typedef enum </p><p><b> { </b></p><p> pub, //任何人可做任何操作(公共文件,所有人都可查看) </p><p> p
44、rotect, //非創(chuàng)建者或ADMIN,只可以察看 (保護,只有自己和管理員可查看)</p><p> pri //非創(chuàng)建者或ADMIN,不可以做任何操作 (系統(tǒng)文件)</p><p> } FileAccess; </p><p><b> //文件元素類型 </b></p><p> typed
45、ef enum </p><p><b> { </b></p><p> file, //文件 </p><p> dir //文件夾 </p><p> } FileType; </p><p> //表示 文件狀態(tài) </p><p> typ
46、edef enum FileStatus</p><p><b> { </b></p><p><b> closed, </b></p><p><b> opened, </b></p><p><b> reading, </b></
47、p><p><b> writing </b></p><p><b> } ; </b></p><p> //一個文件索引結(jié)構(gòu) (文件節(jié)點)</p><p> struct FileIndexElement </p><p><b> { </b
48、></p><p> unsigned Index; //文件元素索引編號 </p><p> char FileName[NAME_LEN]; //文件元素名 </p><p> char ParentName[NAME_LEN]; //父節(jié)點名 </p><p> unsigned Fil
49、eBlockId; //文件元素所在物理塊編號 </p><p> unsigned FileLevel; //文件元素所在層次,層+文件元素名為一個文件元素的邏輯位置 </p><p> char creatTime[18];//文件創(chuàng)建時間</p><p> char *filecontent;//文件內(nèi)容</p><p&
50、gt; BOOL effect; //是否有效,0-無效,1-有效 </p><p> FileType Type; //識別文件還是目錄 </p><p><b> }; </b></p><p> //文件索引結(jié)構(gòu)或目錄表項 (文件目錄結(jié)構(gòu)) </p><p> struct File
51、Index </p><p><b> { </b></p><p> FileIndexElement *FIStart; //文件系統(tǒng)中的文件索引起始位置 </p><p> unsigned FILen; //文件索引的最大長度 </p><p> unsigned FICount; //文
52、件索引數(shù)量 </p><p><b> }; </b></p><p> //文件塊的結(jié)構(gòu) (存儲數(shù)據(jù)塊結(jié)構(gòu))</p><p> struct FileBlock;</p><p> typedef struct FileBlock *pFileBlock;</p><p> str
53、uct FileBlock </p><p><b> { </b></p><p> unsigned FileBlockId; //文件塊編號 </p><p> unsigned BLOCK_SIZE; //文件塊的容量 </p><p> char *FileBlockAddr; //文件塊地址 &
54、lt;/p><p> pFileBlock next; //下一個文件塊的地址 </p><p><b> }; </b></p><p> //文件系統(tǒng)的位示圖結(jié)構(gòu) (用于顯示分配的存儲器分配情況)</p><p> struct BitMap</p><p><b> {
55、</b></p><p> unsigned BITMAP_LEN; //文件位示圖長度 </p><p> char *BMStart; //位示圖的起始指針 </p><p><b> }; </b></p><p> //文件系統(tǒng)結(jié)構(gòu) (超級塊的結(jié)構(gòu) ,全局變量)</p&
56、gt;<p> struct SuperBlock</p><p><b> { </b></p><p> char *FSStart; //文件系統(tǒng)的起始地址 </p><p> unsigned SuperBlockSize; //文件系統(tǒng)的容量 </p><p> Bit
57、Map bm; //文件系統(tǒng)中的位示圖 </p><p> unsigned BLOCK_COUNT; //文件系統(tǒng)中文件塊的數(shù)量 </p><p> pFileBlock head; //文件系統(tǒng)中文件塊首地址 </p><p> FileIndex FI; //文件系統(tǒng)中的文件索引 </p><p>&l
58、t;b> }; </b></p><p> //登陸用戶的數(shù)據(jù)結(jié)構(gòu) (用戶的數(shù)據(jù)結(jié)構(gòu))</p><p> struct User;</p><p> typedef struct User *pUser;</p><p> struct User</p><p><b>
59、 { </b></p><p> char *UserName; //用戶名稱</p><p> char *password; //用戶密碼</p><p> int isAdmin; //用戶類型,1表示管理員,0表示用戶</p><p> pUser NextUser;</p>&l
60、t;p><b> };</b></p><p> struct LoginStruct{</p><p> int User_Login_tims;</p><p> int UserNum;</p><p> pUser pUserList;</p><p><b>
61、 };</b></p><p> //文件系統(tǒng)中的元素結(jié)構(gòu),包括文件和文件夾 (邏輯文件的定義,樹形結(jié)構(gòu))</p><p> struct FSElement;</p><p> typedef struct FSElement *pFSElement;</p><p> struct FSElement</p&
62、gt;<p><b> { </b></p><p> pFSElement parent; //指向自己的父親節(jié)點 </p><p> unsigned FileLevel; //文件元素所在層次,層+文件元素名為一個文件元素的邏輯位置 </p><p> char FileName[NAME_LEN];
63、 //文件元素名 </p><p> unsigned FileBlockId; //文件元素所在物理塊編號 </p><p> unsigned FileElemLen; //文件元素的長度 </p><p> FileType Type; //文件元素類型 </p><p> FileAccess
64、Access; //文件元素可供操作的權(quán)限 </p><p> User Creator; //文件創(chuàng)建者 </p><p> char CreateTime[18]; //創(chuàng)建時間,日期格式:MM/DD/YY HH:MI:SS </p><p> char LastModTime[18]; //最后一次修改時間 </p&g
65、t;<p> char *FileData; //一個文件的數(shù)據(jù)開始地址,文件夾時該值為NULL </p><p> FileStatus fileStu; //如果是一個文件表示文件當前的狀態(tài) </p><p><b> }; </b></p><p><b> //系統(tǒng)當前狀態(tài) </b
66、></p><p> struct CurrentStatus</p><p><b> { </b></p><p> User CurrentUser; //當前用戶 </p><p> unsigned FileLevel; //用戶所在文件系統(tǒng)層 </p><p&g
67、t; FSElement *CurrParent; //當前層的父節(jié)點 </p><p> char *CurrentPath; //當前路徑 </p><p><b> }; </b></p><p> SuperBlock FS; //一個全局文件系統(tǒng)的變量 </p><p> CurrentS
68、tatus CS; //當前系統(tǒng)狀態(tài) </p><p> FSElement *base; //文件元素的根 </p><p> LoginStruct LoginS;//用戶列表,在登錄的時候用到,以鏈表形式存儲</p><p> bool InitFileSys(); //(初始化文件函數(shù))</p><p> //========
69、================================================================================</p><p> //函數(shù)說明:權(quán)利 聲明</p><p> void Right(void)</p><p><b> {</b></p><p>
70、 cout<<"文件管理系統(tǒng) [版本1.4]\n";</p><p> cout<<"版權(quán)所有 (c) 2011 計算機4班。保留所有權(quán)利。\n\n";</p><p><b> return;</b></p><p><b> }</b><
71、/p><p> //==========================================================================================</p><p> // 函數(shù)介紹:尋找第一個 空白 的文件塊ID </p><p> // 返 回 值:返回第一個空白塊的ID </p><p&
72、gt; unsigned FindBlankFileBlockId(void) </p><p><b> { </b></p><p> unsigned char c; </p><p> //通過位示圖 查找 可以簡化</p><p> for (unsigned i = 0; i < FS.bm.
73、BITMAP_LEN / 8; i++) </p><p><b> { </b></p><p> c = FS.bm.BMStart[i] | 0x7F; </p><p> if (c == 0x7F) </p><p><b> { </b></p><p>
74、 return i * 8; //一個字節(jié)左邊第一位為0,表示該區(qū)域未使用 </p><p><b> } </b></p><p> c = FS.bm.BMStart[i] | 0xBF; </p><p> if (c == 0xBF) </p><p><b> { </b>&l
75、t;/p><p> return i * 8 + 1; </p><p><b> } </b></p><p> c = FS.bm.BMStart[i] | 0xDF; </p><p> if (c == 0xDF) </p><p><b> { </b>&
76、lt;/p><p> return i * 8 + 2; </p><p><b> } </b></p><p> c = FS.bm.BMStart[i] | 0xEF; </p><p> if (c == 0xEF) </p><p><b> { </b>
77、</p><p> return i * 8 + 3; </p><p><b> } </b></p><p> c = FS.bm.BMStart[i] | 0xF7; </p><p> if (c == 0xF7) </p><p><b> { </b>
78、;</p><p> return i * 8 + 4; </p><p><b> } </b></p><p> c = FS.bm.BMStart[i] | 0xFB; </p><p> if (c == 0xFB) </p><p><b> { </b&g
79、t;</p><p> return i * 8 + 5; </p><p><b> } </b></p><p> c = FS.bm.BMStart[i] | 0xFD; </p><p> if (c == 0xFD) </p><p><b> { </b
80、></p><p> return i * 8 + 6; </p><p><b> } </b></p><p> c = FS.bm.BMStart[i] | 0xFE; </p><p> if (c == 0xFE) </p><p><b> { </
81、b></p><p> return i * 8 + 7; </p><p><b> } </b></p><p><b> } </b></p><p> return BLOCK_COUNT + 1; </p><p><b> } <
82、;/b></p><p> //================================================================================================</p><p> // 函數(shù)介紹:尋找第一個 文件塊地址 (根據(jù)文件塊ID,找文件塊)</p><p> // 輸入?yún)?shù):file
83、blockid 文件塊ID </p><p> // 返 回 值:返回文件塊的地址 </p><p> char * FindBlankFileBlock(unsigned fileblockid) </p><p><b> { </b></p><p> FileBlock *fblock = FS.head
84、; </p><p> while (fblock->next != NULL) </p><p><b> { </b></p><p> if (fblock->FileBlockId == fileblockid) </p><p><b> { </b></p>
85、;<p> return fblock->FileBlockAddr; //如果找到文件塊,返回文件塊的地址,</p><p><b> } </b></p><p><b> else </b></p><p><b> { </b></p><p&g
86、t; fblock = fblock->next; </p><p><b> } </b></p><p><b> } </b></p><p> return NULL; //沒有找到,返回空。</p><p><b> } </b></p>
87、<p> //==================================================================================================</p><p> // 函數(shù)介紹:得到當前時間的字符串 </p><p> // 輸入?yún)?shù):時間字符串的指針 </p><p> voi
88、d GetCurrent_Time(char *currtime) </p><p><b> { </b></p><p> char dbuffer [9]; </p><p> char tbuffer [9]; </p><p> _strdate(dbuffer); //獲得日期</p>
89、<p> _strtime(tbuffer); //獲得時間</p><p> strcpy(currtime, dbuffer); </p><p> strcat(currtime, " "); </p><p> strcat(currtime, tbuffer); </p><p> //將兩者
90、拼接在一起,并用空格隔開</p><p><b> } </b></p><p> //=================================================================================================================</p><p> //
91、函數(shù)介紹:更新文件索引 </p><p> // 輸入?yún)?shù):fileblockid 文件塊ID </p><p> void AddFileIndex(unsigned fileblockid, unsigned filelevel, char *filename, char *parentname,FileType temp) </p><p><b&g
92、t; { </b></p><p> FS.FI.FIStart[FS.FI.FICount].FileBlockId = fileblockid; </p><p> FS.FI.FIStart[FS.FI.FICount].FileLevel = filelevel; </p><p> strcpy(FS.FI.FIStart[FS.FI.
93、FICount].FileName, filename); </p><p> FS.FI.FIStart[FS.FI.FICount].Type = temp; </p><p> if (parentname == NULL) </p><p><b> { </b></p><p> memset(FS.
94、FI.FIStart[FS.FI.FICount].ParentName, '\0', NAME_LEN); </p><p> //如果沒有父親節(jié)點的話,將其父親節(jié)點格式化</p><p><b> } </b></p><p><b> else </b></p><p>
95、<b> { </b></p><p> strcpy(FS.FI.FIStart[FS.FI.FICount].ParentName, parentname); </p><p><b> } </b></p><p> FS.FI.FIStart[FS.FI.FICount].Index = FS.FI.FIC
96、ount; </p><p> FS.FI.FIStart[FS.FI.FICount].effect = 1; </p><p> GetCurrent_Time(FS.FI.FIStart[FS.FI.FICount].creatTime);</p><p> FS.FI.FICount ++; </p><p><b>
97、 } </b></p><p> //==================================================================================================</p><p> // 函數(shù)介紹:更新位示圖 </p><p> // 輸入?yún)?shù):fileblockid 文件塊
98、ID 更改對應(yīng)的位示圖</p><p> void UpdateBitMap(unsigned fileblockid) </p><p><b> { </b></p><p> //計復(fù)所在位示圖的位置 </p><p> int dirInBitmap = ((int)(fileblockid / 8));
99、 </p><p> int dirInChar = fileblockid % 8; </p><p> char *c = &(FS.bm.BMStart[dirInBitmap]); </p><p><b> int xor; </b></p><p> switch (dirInChar) &l
100、t;/p><p><b> { </b></p><p> case 0: xor=0x80; break; </p><p> case 1: xor=0x40; break; </p><p> case 2: xor=0x20; break; </p><p> case 3:
101、xor=0x10; break; </p><p> case 4: xor=0x08; break; </p><p> case 5: xor=0x04; break; </p><p> case 6: xor=0x02; break; </p><p> case 7: xor=0x01; break; </p
102、><p><b> } </b></p><p> *c = *c^xor; </p><p><b> } </b></p><p> //=============================================================================
103、=====================================</p><p> // 函數(shù)介紹:創(chuàng)建一個文件元素 </p><p> // 輸入?yún)?shù):acc 文件元素可操作權(quán)限,filename 文件元素名稱,type 文件元素類型,filecontent 文件內(nèi)容, parent 指向其父節(jié)點</p><p> // 返 回 值:返回一個文件元
104、素的指針 </p><p> pFSElement CreateFileElement(FileAccess acc, char *filename, FileType type, char *filecontent, FSElement *parent) </p><p><b> { </b></p><p> unsigned bl
105、ankFileBlockId = FindBlankFileBlockId();//尋找空閑的文件塊</p><p> char *blank = FindBlankFileBlock(blankFileBlockId); //blank為找的空白文件塊的地址</p><p> FSElement *fs = (FSElement *)blank; </p><p&
106、gt; int flag = 0; </p><p> for(int i=1;i<FS.FI.FICount;i++) </p><p><b> { </b></p><p> //判斷是否有完全相同的文件,(文件名,文件是否有效,文件的層次,文件的類型)</p><p> if (strcmp(FS
107、.FI.FIStart[i].FileName,filename)==0 && FS.FI.FIStart[i].effect == 1 && FS.FI.FIStart[i].FileLevel == CS.FileLevel &&FS.FI.FIStart[i].Type == type) </p><p><b> { </b><
108、;/p><p> printf("文件名重復(fù)!\n"); </p><p> flag = 1; </p><p> return NULL;</p><p><b> } </b></p><p><b> } </b></p>&l
109、t;p> //if(flag) return NULL;</p><p> //查找第一個空白文件塊ID </p><p> if (blankFileBlockId >= BLOCK_COUNT) </p><p><b> { </b></p><p> //如果沒有空白的文件塊存儲的話<
110、/p><p> printf("未找到一個文件塊的id\n"); </p><p> return NULL; </p><p><b> } </b></p><p> //查找第一個空白塊的地址 </p><p> if (blank == NULL) </p
111、><p><b> { </b></p><p> printf("未找到一個文件塊的地址\n"); </p><p> return NULL; </p><p><b> } </b></p><p><b> //更新索引表<
112、;/b></p><p> fs->Access = acc;//文件操作權(quán)限</p><p> fs->Creator = CS.CurrentUser; //文件的創(chuàng)建者</p><p> GetCurrent_Time(fs->CreateTime); //文件創(chuàng)建時間</p><p> fs->F
113、ileBlockId = blankFileBlockId; //文件所在的文件快號</p><p> fs->FileLevel = CS.FileLevel; //文件所在的邏輯層次</p><p> strcpy(fs->FileName, filename); </p><p> strcpy(fs->LastModTime, fs-
114、>CreateTime); //最后修改時間</p><p> fs->Type = type; //文件類型</p><p> fs->parent = parent; </p><p> if (type == dir) </p><p><b> { </b></p>&
115、lt;p> fs->FileElemLen = sizeof(FSElement); </p><p> fs->FileData = NULL; </p><p><b> } </b></p><p><b> else </b></p><p><b>
116、{ </b></p><p> fs->FileElemLen=(unsigned)strlen(filecontent);</p><p> // fs->FileElemLen = (unsigned)strlen(filename); </p><p> fs->fileStu = closed; </p>
117、<p> fs->FileData = (char *)fs + sizeof(FSElement); </p><p> if (filecontent) </p><p><b> { </b></p><p> strcpy(fs->FileData, filecontent); </p>
118、<p><b> } </b></p><p><b> } </b></p><p> for(i=0;i<FS.FI.FICount;i++)</p><p><b> {</b></p><p> if(strcmp(FS.FI.FIStart[
119、i].FileName,filename)==0 && FS.FI.FIStart[i].effect == 1 && FS.FI.FIStart[i].FileLevel == CS.FileLevel &&FS.FI.FIStart[i].Type == type)</p><p><b> {</b></p><p
120、> FS.FI.FIStart[i].filecontent=filecontent;</p><p><b> }</b></p><p><b> }</b></p><p><b> //更新索引 </b></p><p> if (parent ==
121、NULL) </p><p><b> { </b></p><p> AddFileIndex(blankFileBlockId, CS.FileLevel, filename, NULL,type); </p><p><b> } </b></p><p><b> els
122、e </b></p><p><b> { </b></p><p> AddFileIndex(blankFileBlockId, CS.FileLevel, filename, parent->FileName,type); </p><p><b> } </b></p>&l
123、t;p> //更新BITMAP 位示圖</p><p> UpdateBitMap(blankFileBlockId); </p><p> return fs; </p><p><b> } </b></p><p> //=======================================
124、===========================================================</p><p> // 函數(shù)介紹:創(chuàng)建文件塊鏈表 </p><p> // 輸入?yún)?shù):datahead 第一塊數(shù)據(jù)的地址,blockcap 一個文件塊的大小,len 鏈表的長度 </p><p> // 返 回 值:返回鏈表的頭指針 <
125、/p><p> FileBlock * CreateFileBlockList(char *datahead, unsigned blockcap, unsigned len) </p><p><b> { </b></p><p> if (datahead == NULL || len == 0) </p><p&g
126、t;<b> { </b></p><p> return NULL; </p><p><b> } </b></p><p> FileBlock *head; //文件塊鏈表頭指針</p><p> FileBlock *pnew; </p><p> Fi
127、leBlock *pold; </p><p> //將每個文件塊分配內(nèi)存空間</p><p> head = pold = pnew = (FileBlock *)malloc(sizeof(FileBlock)); </p><p> for ( unsigned i = 0; i < len; i++) </p><p>&
128、lt;b> { </b></p><p> pold->FileBlockId = i; </p><p> pold->BLOCK_SIZE = BLOCK_SIZE; </p><p> pold->FileBlockAddr = datahead + i * blockcap; </p><p&g
129、t; memset(pold->FileBlockAddr, '\0', blockcap); </p><p> //分別將每個文件塊初始化,并將其文件塊大小的空間 格式化。</p><p> if (i != len - 1) </p><p><b> { </b></p><p>
130、 pnew = (FileBlock *)malloc(sizeof(FileBlock)); </p><p><b> } </b></p><p><b> else </b></p><p><b> { </b></p><p> pnew = NULL;
131、</p><p><b> } </b></p><p> pold->next = pnew; </p><p> pold = pnew; </p><p><b> } </b></p><p> return head; </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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《操作系統(tǒng)》課程設(shè)計--模擬文件管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計--模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計---模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計-模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計——操作系統(tǒng)課程設(shè)計模擬操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計報告--虛擬文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設(shè)計--基于linux的模擬文件系統(tǒng)的設(shè)計與實現(xiàn)
- 操作系統(tǒng)課程設(shè)計--文件管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計---文件管理系統(tǒng)設(shè)計
- 操作系統(tǒng)課程設(shè)計---文件系統(tǒng)的模擬
- 操作系統(tǒng)課程設(shè)計報告----文件管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計---磁盤文件操作
- 模擬操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計--模擬操作系統(tǒng)的實現(xiàn)
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計---操作系統(tǒng)之文件管理部分的設(shè)計與實現(xiàn)
- 操作系統(tǒng)課程設(shè)計(文件系統(tǒng)管理)
- 操作系統(tǒng)課程設(shè)計--基于文件分配表的文件管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計-文件管理實驗報告
評論
0/150
提交評論