版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、文件系統(tǒng)實(shí)驗(yàn)1.1 實(shí)驗(yàn)?zāi)康暮鸵?.1.1 實(shí)驗(yàn)?zāi)康耐ǔ0盐募c管理信息資源的管理程序的集合稱為文件系統(tǒng),它是操作系統(tǒng)中負(fù)責(zé)存取和管理信息資源的模塊,采用統(tǒng)一的方法管理用戶信息和系統(tǒng)信息的存儲、檢索、更新、共享和保護(hù),并為用戶提供一套行之有效的文件使用及操作方法。本實(shí)驗(yàn)利用高級語言編寫程序模擬文件系統(tǒng),了解文件系統(tǒng)的基本結(jié)構(gòu)和文件的各種操作方法,加深理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實(shí)現(xiàn),從而幫助學(xué)生對各種文件操作命令的實(shí)質(zhì)內(nèi)容和執(zhí)行過程有比較深入的了解。1.1.2 實(shí)驗(yàn)要求1采用高級語言編寫程序模擬文件系統(tǒng),文件系統(tǒng)采用多級目錄結(jié)構(gòu),實(shí)現(xiàn)對文件和目錄的創(chuàng)建、刪除、重命名、變更權(quán)限、顯示文件內(nèi)容、
2、修改文件內(nèi)容等操作。2撰寫實(shí)驗(yàn)報(bào)告,報(bào)告應(yīng)包含以下內(nèi)容:(1)實(shí)驗(yàn)?zāi)康?;?)實(shí)驗(yàn)內(nèi)容;(3)設(shè)計(jì)思路;(4)程序流程圖;(5)程序中主要數(shù)據(jù)結(jié)構(gòu)和函數(shù)說明;(6)帶注釋的源程序代碼;(7)程序運(yùn)行結(jié)果及分析(8)實(shí)驗(yàn)收獲與體會1.2 預(yù)備知識1.2.1 文件和文件系統(tǒng)1.文件概念現(xiàn)代計(jì)算機(jī)系統(tǒng)中都配置了外存,大量的程序和數(shù)據(jù)以文件的形式存放在外存。如果由用戶直接管理文件,不僅要求用戶熟悉外存特性,了解各種文件的屬性,以及它們在外存上的位置,而且多用戶環(huán)境下還必須能保持?jǐn)?shù)據(jù)的安全性和一致性,這是用戶不能勝任的。因而,現(xiàn)代操作系統(tǒng)中都配備文件系統(tǒng),以適應(yīng)系統(tǒng)資源管理和用戶使用信息的需要。文件是指
3、由創(chuàng)建者所定義的、具有文件名的一組相關(guān)元素的集合。用戶通過文件名就可對文件進(jìn)行訪問,文件名是由字母或數(shù)字組成的字母或數(shù)字串,其格式和長度都因系統(tǒng)而異。操作系統(tǒng)提供文件系統(tǒng)的優(yōu)點(diǎn)有:(1)便于用戶使用。(2)文件安全可靠。(3)系統(tǒng)能有效利用存儲空間,優(yōu)化安排不同屬主文件的位置。(4)文件系統(tǒng)還能提供文件共享功能。2.文件命名在不同的操作系統(tǒng)中對文件名的規(guī)定有所不同,文件名的格式和長度因系統(tǒng)而異。一般來說,文件名由文件名和擴(kuò)展名兩部分組成,前者用于標(biāo)識文件,后者用于區(qū)分文件類型,中間用“.”分割開來,它們都是字母或數(shù)字所組成的字母數(shù)字串。早期文件名的長度僅限18個字符,現(xiàn)在文件名最長可達(dá)255個
4、字符。擴(kuò)展名是添加在文件名后面的若干個附加字符,又稱為后綴名,用于只是文件類型。例如,.txt指明純文本文件,.exe表示可執(zhí)行二進(jìn)制代碼文件,.obj表示編譯或匯編生成的目標(biāo)文件。3.文件類型為便于管理和控制文件,將文件分為多種類型,下面是幾種常用的文件分類方法。(1)按用途分類:系統(tǒng)文件,庫文件,用戶文件。(2)按存取控制屬性分類:只讀文件,讀寫文件,不保護(hù)文件。(3)按信息流向:輸入文件,輸出文件,輸入輸出文件。(4)按文件中數(shù)據(jù)的形式分類:源文件,目標(biāo)文件,可執(zhí)行文件。4.文件屬性文件屬性是指操作系統(tǒng)為文件配置的控制和管理信息,其目的是為方便系統(tǒng)和用戶對文件的管理和使用,這組屬性包括以
5、下內(nèi)容。(1)文件基本屬性:文件名和擴(kuò)展名、文件屬性ID,文件所屬組ID等。(2)文件類型屬性:如普通文件、目錄文件、系統(tǒng)文件、隱藏文件、設(shè)備文件等。也可按文件信息分為ASCII碼文件、二進(jìn)制碼文件等。(3)文件保護(hù)屬性:規(guī)定誰能夠訪問文件,以何種方式訪問。常用的文件訪問方式有可讀、可寫、可執(zhí)行、可更新、可刪除等;有的系統(tǒng)還為文件設(shè)置口令用作保護(hù)。(4)文件管理屬性:如文件創(chuàng)建時間、最后訪問時間、最后修改時間等。(5)文件控制屬性:文件邏輯結(jié)構(gòu)信息,如:記錄鍵、記錄類型、記錄個數(shù)、記錄長度、成組因子數(shù)等;文件物理結(jié)構(gòu)信息,如:文件所在設(shè)備名、物理設(shè)備類型、記錄存放的盤塊號或文件信息首選盤塊號,
6、也可指出文件索引的位置等。5.文件存取方法存取方法是指讀寫文件存儲器上的物理記錄的方法,由于文件類型不同,用戶使用的要求也不同,因而需要操作系統(tǒng)提供多種存取方法來滿足用戶要求。常用的存取方法如下:(1)順序存取。無論是無結(jié)構(gòu)字節(jié)流文件還是有結(jié)構(gòu)記錄式文件,存取操作都在上次操作的基礎(chǔ)上進(jìn)行。順序存取主要用于磁帶文件,但也適用于磁盤上的順序文件。(2)直接存取。又稱隨機(jī)存取,可以非順序的從文件中的任何位置存取文件內(nèi)容。它通常用于磁盤文件。(3)索引存取。這是基于索引文件的存取方法,由于文件中的記錄不按位置而是按其記錄名或記錄鍵來編址,所以用戶提供記錄名或記錄鍵之后,先按名搜索,再查找所需要的記錄。
7、在實(shí)際系統(tǒng)中,大都采用多級索引以加速記錄的查找過程。6.文件系統(tǒng)文件系統(tǒng)是操作系統(tǒng)中負(fù)責(zé)管理和存取文件的程序模塊。它是由管理文件所需的數(shù)據(jù)結(jié)構(gòu)和相應(yīng)的管理軟件以及訪問文件的一組操作所組成。1.2.2 文件目錄為了對文件實(shí)施有效的管理,必須對它們加以妥善組織,這主要是通過文件目錄實(shí)現(xiàn)的。對目錄管理的要求如下:(1) 實(shí)現(xiàn)“按名存取”(2) 提高對目錄的檢索速度。(3) 實(shí)現(xiàn)文件共享(4) 允許文件重名1.文件控制塊文件控制塊(File Control Block,F(xiàn)CB)是操作系統(tǒng)為每個文件建立的唯一數(shù)據(jù)結(jié)構(gòu),其中包括了全部文件屬性,其目的是為了方便操作系統(tǒng)對文件的管理、控制和存取。于是一個文件
8、有兩部分組成:FCB和文件體(文件信息)。有了FCB就可以方便的實(shí)現(xiàn)文件的按名存取。每當(dāng)創(chuàng)建一個文件時,系統(tǒng)就要為其建立一個FCB,用來記錄文件的屬性信息;每當(dāng)存取文件時,先找到其FCB,再找到文件信息盤塊號、首塊物理位置或索引表就能存取文件信息。2.一級目錄結(jié)構(gòu)目錄結(jié)構(gòu)的組織關(guān)系到文件系統(tǒng)的存取速度,也關(guān)系到文件的共享性和安全性。因此組織好文件的目錄,是設(shè)計(jì)好文件系統(tǒng)的重要環(huán)節(jié)。最簡單的文件目錄是一級目錄結(jié)構(gòu),所有FCB排列在一張線性表中。一級目錄的優(yōu)點(diǎn)是簡單,但它只能實(shí)現(xiàn)目錄管理中最基本的按名存取功能,文件重名和文件共享問題難以解決。3.兩級目錄結(jié)構(gòu)兩級目錄結(jié)構(gòu)將文件目錄分成主文件目錄和用
9、戶文件目錄兩級。系統(tǒng)為每個用戶建立一個用戶文件目錄(UFD),每個用戶的文件目錄登記了該用戶建立的所有文件名及其屬性信息。主目錄(MFD)則登記了進(jìn)入系統(tǒng)的各個用戶文件目錄的情況,每個用戶占一個表目,說明該用戶目錄的屬性,包括用戶名、目錄大小、組織形式及其所在的位置等。兩級目錄結(jié)構(gòu)提高了目錄檢索的速度;允許不同的用戶目錄中使用相同的文件名;不同用戶也可以使用不同的文件名或相同的文件名來訪問系統(tǒng)中的同一個共享文件。兩級目錄結(jié)構(gòu)雖然比較簡單實(shí)用,但缺乏靈活性,特別是難以反映現(xiàn)實(shí)世界的多層次關(guān)系。4.多級樹形目錄結(jié)構(gòu)在現(xiàn)代操作系統(tǒng)中,所有文件系統(tǒng)都支持多級目錄結(jié)構(gòu),根目錄是唯一的,每一級目錄可以是下
10、一級目錄的說明,也可以是文件的說明,從而形成樹狀目錄結(jié)構(gòu)。如圖8.1是Linux目錄層次結(jié)構(gòu),它是一棵倒置的有根樹,樹根是根目錄,從根向下,每個樹枝是子目錄,而樹葉是文件。樹狀多級目錄結(jié)構(gòu)有許多優(yōu)點(diǎn),可以較好地反映現(xiàn)實(shí)世界中具有層次關(guān)系的數(shù)據(jù)結(jié)合,確切地反映系統(tǒng)內(nèi)部文件的分支結(jié)構(gòu);不同文件可以重名,只要它們不位于同一末端子目錄中即可;易于規(guī)定不同層次或子目錄中文件的不同存取權(quán)限,便于文件的保護(hù)、保密和共享等,有利于系統(tǒng)的維護(hù)和查找。圖8.1 Linux目錄層次結(jié)構(gòu)1.2.3 文件結(jié)構(gòu)在系統(tǒng)中的所有文件都存在著以下兩種形式的文件結(jié)構(gòu):(1) 文件的邏輯結(jié)構(gòu)。這是從用戶觀點(diǎn)出發(fā)所觀察到的文件組織形
11、式,即文件是由一系列的邏輯記錄組成的,是用戶可以直接處理的數(shù)據(jù)及其結(jié)構(gòu),它獨(dú)立于文件的物理特性。(2) 文件的物理結(jié)構(gòu)。這是指系統(tǒng)將文件存儲在外存上所形成的一種存儲組織形式,是用戶不能看見的。文件的物理結(jié)構(gòu)不僅與存儲介質(zhì)的存儲性能有關(guān),而且與所采用的外存分配方式有關(guān)。1. 文件邏輯結(jié)構(gòu)文件的邏輯結(jié)構(gòu)分為兩種形式:流式文件和記錄式文件。(1)流式文件這是一種無結(jié)構(gòu)的文件,文件內(nèi)的數(shù)據(jù)不再組成紀(jì)錄,只是一串順序的信息集合,稱為字節(jié)流文件。流式文件中的每個字節(jié)都有一個索引,第一個字節(jié)的索引為0,第二個字節(jié)的索引為1打開文件的進(jìn)程使用文件讀寫指針來訪問文件中的特定字節(jié)。當(dāng)文件打開時,文件讀寫指針指向首
12、字節(jié),每k個字節(jié)的讀或?qū)懖僮魍瓿?,則將文件讀寫指針加k。事實(shí)上,有許多應(yīng)用不再要求文件內(nèi)再區(qū)分記錄,因而,為了簡化系統(tǒng),大多數(shù)現(xiàn)代操作系統(tǒng)如Linux系統(tǒng)只提供流式文件。(2)記錄式文件這是一種有結(jié)構(gòu)的文件,它包含若干邏輯記錄,邏輯記錄是文件中按信息在邏輯上的獨(dú)立含義所劃分的信息單位,記錄在文件中的排列按其出現(xiàn)次序編號,記錄0,記錄1。記錄式文件中有兩種常用的記錄組織和使用方法:記錄式順序文件:文件的記錄順序生成并被順序訪問。記錄式索引順序文件:這種文件使用索引表,表項(xiàng)包含記錄鍵和索引指針,記錄鍵有應(yīng)用程序確定,而索引指針便指向相應(yīng)記錄。這種文件可針對特定記錄進(jìn)行存取,它也保持著順序訪問記錄的
13、功能。2.文件物理結(jié)構(gòu)(1)順序文件將文件中邏輯上連續(xù)的信息存放到存儲介質(zhì)的相鄰物理塊上形成順序結(jié)構(gòu),叫做順序文件,又稱連續(xù)文件。這種文件結(jié)構(gòu)的優(yōu)點(diǎn)是管理簡單,存取速度快。主要缺點(diǎn)是建立文件之前需預(yù)先確定文件長度,以便分配存儲空間;修改、插入和添加文件記錄有一定的難度;對于變長記錄的處理很困難;對磁盤做連續(xù)分配會造成空閑塊的浪費(fèi)。(2)連接文件。把邏輯文件中各個邏輯記錄存放到一些磁盤塊中,這些磁盤塊可以是不連續(xù)的,用指針把這些磁盤塊按邏輯記錄的順序連接起來,形成了文件的連接結(jié)構(gòu)。文件信息存放在磁盤的若干物理塊中,第一塊文件信息的物理地址由FCB給出,而每塊的連接字出文件的下一個物理塊位置。通常
14、,當(dāng)連接字的內(nèi)容為0時,表示文件至本塊結(jié)束。連接文件結(jié)構(gòu)的優(yōu)點(diǎn)是易于文件擴(kuò)充,不要求占用連續(xù)的外存空間,存儲空間利用率高。由于連接文件只能按連接指針順序搜索,因此存取速度慢。(3)索引文件索引結(jié)構(gòu)是實(shí)現(xiàn)非連續(xù)存儲的另一種方法,適用于數(shù)據(jù)記錄保存在磁盤上的文件,系統(tǒng)為每個文件建立索引表(index table),可以有不同的索引形式,一種是記錄組成文件的磁盤塊號,這種索引表只是磁盤塊號的序列,適用于流式文件;另一種其索引表項(xiàng)包含記錄鍵及其磁盤塊號,適用于記錄式文件。利用索引表來搜索記錄的文件稱為索引文件,索引表可存放在FCB中,打開文件時就可使用索引表訪問文件信息,大文件的索引表很大。有些文件系
15、統(tǒng)讓索引表置于單獨(dú)的物理塊中且可駐留在磁盤上,F(xiàn)CB中僅包含索引表的地址。索引文件結(jié)構(gòu)既可滿足文件動態(tài)增、刪的要求,存儲空間的利用率也較高;索引結(jié)構(gòu)既適用于順序存取,也適用于隨機(jī)存取,可以方便、較迅速地實(shí)現(xiàn)文件的存取。缺點(diǎn)是由于使用索引表而增加了存儲空間的開銷。1.2.4 文件系統(tǒng)的接口文件系統(tǒng)作為一個高效管理文件的程序,其運(yùn)行更多的是在系統(tǒng)內(nèi)部運(yùn)行,而用戶所需要關(guān)心只是它的接口。文件系統(tǒng)通常向用戶提供以下兩類接口。第一類是與文件有關(guān)的操作命令或者作業(yè)控制語言中與文件有關(guān)的語句,構(gòu)成文件系統(tǒng)命令接口;第二類是提供給用戶程序使用的文件系統(tǒng)調(diào)用,構(gòu)成了用戶和文件系統(tǒng)的另一個接口,稱為程序接口。文件
16、系統(tǒng)提供給用戶程序的一組系統(tǒng)調(diào)用,包括建立、打開、關(guān)閉、撤銷、讀、寫和控制。通過這些系統(tǒng)調(diào)用,用戶可以獲得文件系統(tǒng)的各種服務(wù)?;疚募到y(tǒng)調(diào)用有建立文件、打開文件、讀寫文件、關(guān)閉文件等。1.3 文件系統(tǒng)模擬實(shí)現(xiàn)1.3.1 實(shí)驗(yàn)內(nèi)容編寫程序模擬一個簡單的文件系統(tǒng),具體實(shí)驗(yàn)內(nèi)容如下:(1)實(shí)現(xiàn)多級目錄結(jié)構(gòu),而非二級目錄結(jié)構(gòu)。(2)實(shí)現(xiàn)文件和目錄的創(chuàng)建、刪除、重命名和讀寫權(quán)限控制功能。(3)實(shí)現(xiàn)顯示文件內(nèi)容和更改文件內(nèi)容的功能。(4)創(chuàng)建文件或目錄時,采用動態(tài)申請的方式請求存儲空間分配,在刪除文件或目錄時,還需對申請的空間進(jìn)行釋放。(5)為觀察各種命令執(zhí)行情況,要求以樹形結(jié)構(gòu)直觀地顯示命令執(zhí)行后的目
17、錄結(jié)構(gòu)。1.3.2 實(shí)驗(yàn)指導(dǎo)1.主要數(shù)據(jù)結(jié)構(gòu)說明(1)文件控制塊(FCB)應(yīng)包含:文件名、文件內(nèi)容、父目錄地址、同級目錄文件地址、讀寫權(quán)限等信息。其數(shù)據(jù)結(jié)構(gòu)及說明如下:typedef struct FILE char name256;/文件名char content1000;/文件內(nèi)容struct FILE *frontFile;/同級目錄上一文件struct FILE *nextFile;/同級目錄下一文件struct FOLDER *parentFolder; /父目錄int canRead; /是否可讀int canWrite; /是否可寫FILE, *PFILE;(2)目錄結(jié)構(gòu)type
18、def struct FOLDERchar name256; /目錄名struct FOLDER *nextFolder; /同級下一目錄struct FOLDER *frontFolder; /同級上一目錄struct FOLDER *parentFolder; /父目錄struct FOLDER *firstChildFolder; /子目錄struct FILE *firstChildFile; /子文件int canRead; /是否可讀int canWrite; /是否可寫FOLDER, *PFOLDER; (3)在模擬程序中,應(yīng)先建立文件系統(tǒng)的根目錄,文件系統(tǒng)中的操作都在此目錄下完
19、成,且不得直接對根目錄操作。PFOLDER root;/根目錄(4)在指定目錄下新建立的文件和目錄,都通過該目錄中最后一個子文件或子目錄的nextFile或nextFolder指針建立連接;若該目錄之中無任何子文件和子目錄,則通過該目錄的firstChildFolder(或firstChildFile)指針建立連接。如圖8.2所示。圖8.2 多級目錄結(jié)構(gòu)2.文件系統(tǒng)模擬程序執(zhí)行流程(1)程序運(yùn)行時,系統(tǒng)首先根據(jù)目錄FOLDER結(jié)構(gòu)建立根目錄root,并為其分配空間,初始化其信息。(2)程序給出一個菜單,用戶根據(jù)菜單選項(xiàng)前的數(shù)字,選擇要執(zhí)行的操作命令。(3)若在根目錄下建立子目錄,則建立一個新F
20、OLDER并為其分配空間后,利用根目錄中的子目錄節(jié)點(diǎn)指針與該子目錄建立連接。(4)若在根目錄下建立文件,則建立一個新FCB并為其分配空間后,利用根目錄中的子文件節(jié)點(diǎn)指針與該文件建立連接。(5)對指定文件或目錄進(jìn)行刪除、重命名、設(shè)置權(quán)限等操作時,需要先在文件系統(tǒng)中找到目標(biāo)文件或目錄才可進(jìn)行下一步的操作,否則提示用戶目標(biāo)文件或目錄不存在。(6)若文件或目錄若不具有可讀權(quán)限,不會在文件系統(tǒng)中顯示,處于隱藏狀態(tài),但并不代表不存在;文件或目錄若不具有可寫權(quán)限,則不能對在該目錄下執(zhí)行創(chuàng)建,刪除,不能重命名該目錄;不能更改文件內(nèi)容。(7)每次執(zhí)行操作命令后,為直觀地觀察執(zhí)行情況,會顯示輸出命令執(zhí)行后的目錄結(jié)
21、構(gòu)。文件系統(tǒng)執(zhí)行流程如圖8.3所示。圖8.3 文件系統(tǒng)執(zhí)行流程3.各種操作命令流程圖本實(shí)驗(yàn)?zāi)M實(shí)現(xiàn)多個目錄和文操作命令,這里給出其中部分操作命令的流程圖。創(chuàng)建目錄、刪除目錄、重命名目錄、更改目錄權(quán)限和更改文件內(nèi)容的流程圖如圖8.6圖8.10所示。 圖8.6 創(chuàng)建目錄流程圖圖8.7 刪除目錄流程圖圖8.8 重命名目錄流程圖圖8.9 更改目錄權(quán)限流程圖圖8.10 更改文件內(nèi)容流程圖1.3.3 程序示例#include "stdio.h"#include "string.h"#include "stdlib.h"typedef struct
22、 FOLDER / 目錄結(jié)構(gòu)char name256; / 目錄名struct FOLDER *nextFolder; / 同級下一目錄struct FOLDER *frontFolder; / 同級上一目錄struct FOLDER *parentFolder; / 父目錄struct FOLDER *firstChildFolder; / 子目錄struct FILE *firstChildFile; / 子文件int canRead; / 是否可讀int canWrite; / 是否可寫FOLDER, *PFOLDER;typedef struct FILE/ 文件控制塊信息char n
23、ame256; / 文件名char content1000; / 文件內(nèi)容struct FILE *frontFile; / 同級目錄上一文件struct FILE *nextFile; / 同級目錄下一文件struct FOLDER *parentFolder;/ 父目錄int canRead; / 是否可讀int canWrite; / 是否可寫FILE, *PFILE;PFOLDER root;/ 根目錄int count=0; / 控制輸出格式int flagD=0; / 刪除標(biāo)記PFOLDER findCurrentFolder(PFOLDER currentFolder, char
24、 name)/ 查找指定目錄PFOLDER folder;if(currentFolder=NULL)return NULL;/ 沒找到if(strcmp(currentFolder->name, name)=0)return currentFolder;/ 查找目錄為當(dāng)前目錄folder=findCurrentFolder(currentFolder->firstChildFolder, name);if(folder!=NULL)return folder;/ 查找目錄在子目錄中folder=findCurrentFolder(currentFolder->nextFol
25、der, name);if(folder!=NULL)return folder;/ 查找目錄在同級其它目錄中return NULL;/ 沒找到PFILE findCurrentFile(PFOLDER currentFolder, char name) / 查找指定文件PFILE tempFile;if(currentFolder=NULL)return NULL;/ 沒找到tempFile=currentFolder->firstChildFile;while(tempFile!=NULL)/ 遍歷當(dāng)前目錄子文件if(strcmp(tempFile->name, name)=0
26、)return tempFile;/ 找到了tempFile=tempFile->nextFile;tempFile=findCurrentFile(currentFolder->firstChildFolder, name);if(tempFile!=NULL)return tempFile;/ 查找文件在子目錄中tempFile=findCurrentFile(currentFolder->nextFolder, name);if(tempFile!=NULL)return tempFile;/ 查找文件在同級其它目錄中return NULL;/ 沒找到PFOLDER p
27、repareWorkBeforeCreate()PFOLDER currentFolder=NULL;char name256;printf("輸入當(dāng)前目錄名稱:");gets(name);fflush(stdin);currentFolder=findCurrentFolder(root, name);if(currentFolder=NULL)puts("目錄不存在!");return NULL;if(currentFolder->canWrite=0)puts("權(quán)限不夠,不予創(chuàng)建!");return NULL;retur
28、n currentFolder;void createFolder()/ 當(dāng)前目錄中創(chuàng)建新目錄PFOLDER currentFolder = prepareWorkBeforeCreate();if (currentFolder = NULL) / 目標(biāo)目錄不存在return;char name256;printf("輸入新目錄名稱:");gets(name);fflush(stdin);PFOLDER newFolder;newFolder=(PFOLDER)malloc(sizeof(FOLDER);strcpy(newFolder->name, name);ne
29、wFolder->firstChildFolder=NULL;/ 初始化新目錄newFolder->firstChildFile=NULL;newFolder->nextFolder=NULL;newFolder->parentFolder=NULL;newFolder->frontFolder=NULL;newFolder->canRead=1;newFolder->canWrite=1;if(currentFolder->firstChildFolder=NULL)/ 當(dāng)前目錄下無子目錄currentFolder->firstChild
30、Folder=newFolder;newFolder->parentFolder=currentFolder;else/ 當(dāng)前目錄下有子目錄PFOLDER tempFolder=currentFolder->firstChildFolder;PFOLDER lastFolder;/ 保存當(dāng)前currentFolder下最后一個子folderwhile(tempFolder!=NULL)/ 同級目錄下不得有相同目錄lastFolder=tempFolder;if(strcmp(tempFolder->name, newFolder->name)=0)printf(&quo
31、t;%s目錄下已有同名目錄!n", currentFolder->name);free(newFolder);return;tempFolder=tempFolder->nextFolder;lastFolder->nextFolder=newFolder;/ 將新目錄與同級舊目錄建立連接newFolder->frontFolder=lastFolder;puts("創(chuàng)建成功!");void createFile()/ 當(dāng)前目錄中創(chuàng)建新文件PFOLDER currentFolder = prepareWorkBeforeCreate();i
32、f (currentFolder = NULL) / 目標(biāo)目錄不存在return;char name256;printf("輸入新文件名稱:");gets(name);fflush(stdin);PFILE newFile;newFile=(PFILE)malloc(sizeof(FILE);strcpy(newFile->name, name);printf("是否輸入文件內(nèi)容?");char ans=getchar();fflush(stdin);if(ans='y' | ans='Y')printf("
33、;輸入文件內(nèi)容:");gets(newFile->content);elsestrcpy(newFile->content, "");fflush(stdin);newFile->nextFile=NULL;/ 初始化新文件信息newFile->frontFile=NULL;newFile->parentFolder=NULL;newFile->canRead=1;newFile->canWrite=1;if(currentFolder->firstChildFile=NULL)/ 當(dāng)前目錄下無子文件currentF
34、older->firstChildFile=newFile;newFile->parentFolder=currentFolder;else/ 當(dāng)前目錄下有子文件PFILE tempFile=currentFolder->firstChildFile;PFILE lastFile;/ 保存當(dāng)前currentFolder下最后一個子filewhile(tempFile!=NULL)/ 同級目錄下不得有相同文件lastFile=tempFile;if(strcmp(tempFile->name, newFile->name)=0)printf("%s目錄下已
35、有同名文件!n", currentFolder->name);free(newFile);return;tempFile=tempFile->nextFile;lastFile->nextFile=newFile;/ 將新文件與同級文件建立連接newFile->frontFile=lastFile;puts("創(chuàng)建成功!");void inputName(char name)printf("輸入名稱:");gets(name);fflush(stdin);void deleteAllChild(PFOLDER curre
36、ntFolder)/ 刪除該目錄下所有內(nèi)容PFILE tempFile, dFile;if(currentFolder=NULL)return;if(flagD)deleteAllChild(currentFolder->nextFolder);flagD=1;deleteAllChild(currentFolder->firstChildFolder);/ 遍歷子目錄tempFile=currentFolder->firstChildFile;while(tempFile!=NULL)/ 刪除該目錄子文件dFile=tempFile;tempFile=tempFile-&g
37、t;nextFile;free(dFile);/(釋放空間)free(currentFolder);/ 刪除該目錄(釋放空間)void deleteFolder()/ 刪除目錄所有內(nèi)容char name256;inputName(name);if(strcmp(name, "root")=0)puts("根目錄不準(zhǔn)刪除!");return;PFOLDER currentFolder=findCurrentFolder(root, name);if(currentFolder=NULL)printf("目錄不存在!");return;i
38、f(currentFolder->canWrite=0)puts("權(quán)限不夠,不予刪除!");return;if(currentFolder->frontFolder=NULL)currentFolder->parentFolder->firstChildFolder=currentFolder->nextFolder;/ 斷開連接if(currentFolder->nextFolder!=NULL)/ 重設(shè)為頭currentFolder->nextFolder->frontFolder=NULL;elsecurrentFol
39、der->frontFolder->nextFolder=currentFolder->nextFolder;/ 斷開連接deleteAllChild(currentFolder);/(釋放空間)puts("刪除成功!");void deleteFile()/ 刪除文件char name256;inputName(name);PFILE currentFile=findCurrentFile(root, name);if(currentFile=NULL)printf("文件不存在!");return;if(currentFile-&g
40、t;frontFile=NULL)currentFile->parentFolder->firstChildFile=currentFile->nextFile;/ 斷開連接if(currentFile->nextFile!=NULL)currentFile->nextFile->frontFile=NULL;/ 重設(shè)為頭elsecurrentFile->frontFile->nextFile=currentFile->nextFile;/ 斷開連接free(currentFile);/ 刪除文件puts("刪除成功!"
41、);void displayFileSystemStructure(PFOLDER currentFolder)/ 輸出目錄結(jié)構(gòu)PFILE tempFile;if(currentFolder!=NULL && currentFolder->canRead)/ 是否可讀for(int i=0; i<count; i+)printf(" ");printf("|-");printf(currentFolder->name);int length=15-count*2-strlen(currentFolder->name
42、);for(i=0; i<length; i+)/ 權(quán)限printf(" ");if(count=0)printf(" canRead canWriten");elseprintf("<dir> %d %dn", currentFolder->canRead, currentFolder->canWrite);else if(currentFolder=NULL)count-;return;count+;tempFile=currentFolder->firstChildFile;while(tem
43、pFile!=NULL)/ 遍歷子文件if(tempFile->canRead=1)/ 是否可讀for(int i=0; i<count; i+)printf(" ");printf("|-");printf(tempFile->name);int length=20-count*2-strlen(tempFile->name);for(i=0; i<length; i+)/ 權(quán)限printf(" ");if(count=0)printf(" canRead canWriten");e
44、lseprintf(" %d %dn", tempFile->canRead, tempFile->canWrite);tempFile=tempFile->nextFile;displayFileSystemStructure(currentFolder->firstChildFolder);/ 遍歷子目錄displayFileSystemStructure(currentFolder->nextFolder);/ 遍歷同級目錄void showFileContent()/ 顯示文件內(nèi)容PFILE currentFile=NULL;char
45、name256;printf("輸入文件名:");gets(name);fflush(stdin);currentFile=findCurrentFile(root, name);if(currentFile=NULL)puts("文件不存在!");return;if(!currentFile->canRead)puts("權(quán)限不夠,無法讀??!");return;printf("文件內(nèi)容:%sn", currentFile->content);printf("文件長度:%dn", s
46、trlen(currentFile->content);void changeFileContent()/ 更改文件內(nèi)容PFILE currentFile=NULL;char name256;printf("輸入文件名:");gets(name);fflush(stdin);currentFile=findCurrentFile(root, name);if(currentFile=NULL)puts("文件不存在!");return;if(!currentFile->canWrite)puts("權(quán)限不夠,不予修改!")
47、;return;printf("輸入文件內(nèi)容:");gets(currentFile->content);fflush(stdin);puts("更改成功!");void changeAllChildPermission(PFOLDER currentFolder, int canRead, int canWrite)/ 更改子目錄下所有目錄和文件權(quán)限PFILE tempFile;if(currentFolder!=NULL)currentFolder->canRead=canRead;currentFolder->canWrite=c
48、anWrite;else if(currentFolder=NULL)return;tempFile=currentFolder->firstChildFile;while(tempFile!=NULL)/ 遍歷子文件tempFile->canRead=canRead;tempFile->canWrite=canWrite;tempFile=tempFile->nextFile;changeAllChildPermission(currentFolder->firstChildFolder, canRead, canWrite);/ 遍歷子目錄if(current
49、Folder->firstChildFolder!=NULL)changeAllChildPermission(currentFolder->firstChildFolder->nextFolder, canRead, canWrite);/ 遍歷同級目錄void changeFolderPermission()/ 更改目錄權(quán)限char name256;inputName(name);if(strcmp(name, "root")=0)puts("根目錄不準(zhǔn)更改權(quán)限!");return;PFOLDER currentFolder=NUL
50、L;currentFolder=findCurrentFolder(root, name);if(currentFolder=NULL)puts("目錄不存在!");return;printf("輸入目錄權(quán)限(讀和寫):");scanf("%d%d", ¤tFolder->canRead, ¤tFolder->canWrite);fflush(stdin);changeAllChildPermission(currentFolder, currentFolder->canRea
51、d, currentFolder->canWrite);/ 更改當(dāng)前目錄權(quán)限時,同時更改其目錄下所有文件和目錄權(quán)限puts("權(quán)限更改成功!");void changeFilePermission()/ 更改文件權(quán)限char name256;inputName(name);PFILE currentFile=NULL;currentFile=findCurrentFile(root, name);if(currentFile=NULL)puts("文件不存在!");return;printf("輸入文件權(quán)限(讀和寫)");sca
52、nf("%d%d", ¤tFile->canRead, ¤tFile->canWrite);fflush(stdin);puts("權(quán)限更改成功!");int fileNameIsDuplication(PFILE currentFile, char name)/ 判斷新重命名的文件是否重名PFILE tempFile=currentFile->frontFile;while(tempFile!=NULL)/ 向前掃描if(strcmp(tempFile->name, name)=0)pri
53、ntf("文件重名!n");return 1;tempFile=tempFile->frontFile;tempFile=currentFile->nextFile;while(tempFile!=NULL)/向后掃描if(strcmp(tempFile->name, name)=0)printf("文件重名!n");return 1; tempFile=tempFile->nextFile;return 0;int folderNameIsDuplication(PFOLDER currentFolder, char name)/判斷新重命名的目錄是否重名PFOLDER tempFolder=currentFolder->frontFolder;while(tempFolder!=NULL)/向前掃描if(strcmp(tempFolder->na
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版投資擔(dān)保合同風(fēng)險(xiǎn)控制條款3篇
- 如何記憶更多的知識點(diǎn)
- 二零二五年度鋰離子蓄電池銷售合同范本3篇
- 二零二五年度個人間家庭農(nóng)場貸款合同3篇
- 零擔(dān)貨物運(yùn)輸合同三篇
- 教師行業(yè)安全生產(chǎn)工作總結(jié)
- 二零二五年度影視制作公司演員個人聘用合同2篇
- 二零二五個人住宅租賃合同(含租賃保證金退還條件)2篇
- 二零二五年度個人擔(dān)保合同書范本:珠寶首飾抵押擔(dān)保
- 二零二五年度綠色快遞柜場地租賃與快遞代收協(xié)議書3篇
- 公司法務(wù)部工作細(xì)則(草案)
- Creo-7.0基礎(chǔ)教程-配套課件
- 六年級人教版上冊數(shù)學(xué)計(jì)算題練習(xí)題(及答案)100解析
- 第18課《文言文二則 鐵杵成針》(學(xué)習(xí)任務(wù)單)- 四年級語文下冊部編版
- 《功能材料概論》期末考試試卷及參考答案2023年12月
- 機(jī)器設(shè)備抵押合同
- 超聲科質(zhì)量控制制度及超聲科圖像質(zhì)量評價細(xì)則
- 腹瀉的護(hù)理課件
- 初中物理滬粵版八年級下冊《第六章 力和機(jī)械》章節(jié)練習(xí)(含答案)
- 風(fēng)險(xiǎn)告知卡(電梯)
- 金礦管理制度
評論
0/150
提交評論