版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
文件系統(tǒng)實(shí)驗(yàn)實(shí)驗(yàn)?zāi)康暮鸵髮?shí)驗(yàn)?zāi)康耐ǔ0盐募c管理信息資源的管理程序的集合稱(chēng)為文件系統(tǒng),它是操作系統(tǒng)中負(fù)責(zé)存取和管理信息資源的模塊,采用統(tǒng)一的方法管理用戶(hù)信息和系統(tǒng)信息的存儲(chǔ)、檢索、更新、共享和保護(hù),并為用戶(hù)提供一套行之有效的文件使用及操作方法。本實(shí)驗(yàn)利用高級(jí)語(yǔ)言編寫(xiě)程序模擬文件系統(tǒng),了解文件系統(tǒng)的基本結(jié)構(gòu)和文件的各種操作方法,加深理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實(shí)現(xiàn),從而幫助學(xué)生對(duì)各種文件操作命令的實(shí)質(zhì)內(nèi)容和執(zhí)行過(guò)程有比較深入的了解。實(shí)驗(yàn)要求1.采用高級(jí)語(yǔ)言編寫(xiě)程序模擬文件系統(tǒng),文件系統(tǒng)采用多級(jí)目錄結(jié)構(gòu),實(shí)現(xiàn)對(duì)文件和目錄的創(chuàng)建、刪除、重命名、變更權(quán)限、顯示文件內(nèi)容、修改文件內(nèi)容等操作。2.撰寫(xiě)實(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ù)說(shuō)明;(6)帶注釋的源程序代碼;(7)程序運(yùn)行結(jié)果及分析(8)實(shí)驗(yàn)收獲與體會(huì)預(yù)備知識(shí)文件和文件系統(tǒng)1.文件概念現(xiàn)代計(jì)算機(jī)系統(tǒng)中都配置了外存,大量的程序和數(shù)據(jù)以文件的形式存放在外存。如果由用戶(hù)直接管理文件,不僅要求用戶(hù)熟悉外存特性,了解各種文件的屬性,以及它們?cè)谕獯嫔系奈恢?,而且多用?hù)環(huán)境下還必須能保持?jǐn)?shù)據(jù)的安全性和一致性,這是用戶(hù)不能勝任的。因而,現(xiàn)代操作系統(tǒng)中都配備文件系統(tǒng),以適應(yīng)系統(tǒng)資源管理和用戶(hù)使用信息的需要。文件是指由創(chuàng)建者所定義的、具有文件名的一組相關(guān)元素的集合。用戶(hù)通過(guò)文件名就可對(duì)文件進(jìn)行訪(fǎng)問(wèn),文件名是由字母或數(shù)字組成的字母或數(shù)字串,其格式和長(zhǎng)度都因系統(tǒng)而異。操作系統(tǒng)提供文件系統(tǒng)的優(yōu)點(diǎn)有:(1)便于用戶(hù)使用。(2)文件安全可靠。(3)系統(tǒng)能有效利用存儲(chǔ)空間,優(yōu)化安排不同屬主文件的位置。(4)文件系統(tǒng)還能提供文件共享功能。2.文件命名在不同的操作系統(tǒng)中對(duì)文件名的規(guī)定有所不同,文件名的格式和長(zhǎng)度因系統(tǒng)而異。一般來(lái)說(shuō),文件名由文件名和擴(kuò)展名兩部分組成,前者用于標(biāo)識(shí)文件,后者用于區(qū)分文件類(lèi)型,中間用“.”分割開(kāi)來(lái),它們都是字母或數(shù)字所組成的字母數(shù)字串。早期文件名的長(zhǎng)度僅限1~8個(gè)字符,現(xiàn)在文件名最長(zhǎng)可達(dá)255個(gè)字符。擴(kuò)展名是添加在文件名后面的若干個(gè)附加字符,又稱(chēng)為后綴名,用于只是文件類(lèi)型。例如,.txt指明純文本文件,.exe表示可執(zhí)行二進(jìn)制代碼文件,.obj表示編譯或匯編生成的目標(biāo)文件。3.文件類(lèi)型 為便于管理和控制文件,將文件分為多種類(lèi)型,下面是幾種常用的文件分類(lèi)方法。 (1)按用途分類(lèi):系統(tǒng)文件,庫(kù)文件,用戶(hù)文件。 (2)按存取控制屬性分類(lèi):只讀文件,讀寫(xiě)文件,不保護(hù)文件。 (3)按信息流向:輸入文件,輸出文件,輸入輸出文件。 (4)按文件中數(shù)據(jù)的形式分類(lèi):源文件,目標(biāo)文件,可執(zhí)行文件。4.文件屬性文件屬性是指操作系統(tǒng)為文件配置的控制和管理信息,其目的是為方便系統(tǒng)和用戶(hù)對(duì)文件的管理和使用,這組屬性包括以下內(nèi)容。(1)文件基本屬性:文件名和擴(kuò)展名、文件屬性ID,文件所屬組ID等。(2)文件類(lèi)型屬性:如普通文件、目錄文件、系統(tǒng)文件、隱藏文件、設(shè)備文件等。也可按文件信息分為ASCII碼文件、二進(jìn)制碼文件等。(3)文件保護(hù)屬性:規(guī)定誰(shuí)能夠訪(fǎng)問(wèn)文件,以何種方式訪(fǎng)問(wèn)。常用的文件訪(fǎng)問(wèn)方式有可讀、可寫(xiě)、可執(zhí)行、可更新、可刪除等;有的系統(tǒng)還為文件設(shè)置口令用作保護(hù)。(4)文件管理屬性:如文件創(chuàng)建時(shí)間、最后訪(fǎng)問(wèn)時(shí)間、最后修改時(shí)間等。(5)文件控制屬性:文件邏輯結(jié)構(gòu)信息,如:記錄鍵、記錄類(lèi)型、記錄個(gè)數(shù)、記錄長(zhǎng)度、成組因子數(shù)等;文件物理結(jié)構(gòu)信息,如:文件所在設(shè)備名、物理設(shè)備類(lèi)型、記錄存放的盤(pán)塊號(hào)或文件信息首選盤(pán)塊號(hào),也可指出文件索引的位置等。 5.文件存取方法存取方法是指讀寫(xiě)文件存儲(chǔ)器上的物理記錄的方法,由于文件類(lèi)型不同,用戶(hù)使用的要求也不同,因而需要操作系統(tǒng)提供多種存取方法來(lái)滿(mǎn)足用戶(hù)要求。常用的存取方法如下:(1)順序存取。無(wú)論是無(wú)結(jié)構(gòu)字節(jié)流文件還是有結(jié)構(gòu)記錄式文件,存取操作都在上次操作的基礎(chǔ)上進(jìn)行。順序存取主要用于磁帶文件,但也適用于磁盤(pán)上的順序文件。(2)直接存取。又稱(chēng)隨機(jī)存取,可以非順序的從文件中的任何位置存取文件內(nèi)容。它通常用于磁盤(pán)文件。(3)索引存取。這是基于索引文件的存取方法,由于文件中的記錄不按位置而是按其記錄名或記錄鍵來(lái)編址,所以用戶(hù)提供記錄名或記錄鍵之后,先按名搜索,再查找所需要的記錄。在實(shí)際系統(tǒng)中,大都采用多級(jí)索引以加速記錄的查找過(guò)程。6.文件系統(tǒng)文件系統(tǒng)是操作系統(tǒng)中負(fù)責(zé)管理和存取文件的程序模塊。它是由管理文件所需的數(shù)據(jù)結(jié)構(gòu)和相應(yīng)的管理軟件以及訪(fǎng)問(wèn)文件的一組操作所組成。文件目錄為了對(duì)文件實(shí)施有效的管理,必須對(duì)它們加以妥善組織,這主要是通過(guò)文件目錄實(shí)現(xiàn)的。對(duì)目錄管理的要求如下:實(shí)現(xiàn)“按名存取”提高對(duì)目錄的檢索速度。實(shí)現(xiàn)文件共享允許文件重名1.文件控制塊文件控制塊(FileControlBlock,F(xiàn)CB)是操作系統(tǒng)為每個(gè)文件建立的唯一數(shù)據(jù)結(jié)構(gòu),其中包括了全部文件屬性,其目的是為了方便操作系統(tǒng)對(duì)文件的管理、控制和存取。于是一個(gè)文件有兩部分組成:FCB和文件體(文件信息)。有了FCB就可以方便的實(shí)現(xiàn)文件的按名存取。每當(dāng)創(chuàng)建一個(gè)文件時(shí),系統(tǒng)就要為其建立一個(gè)FCB,用來(lái)記錄文件的屬性信息;每當(dāng)存取文件時(shí),先找到其FCB,再找到文件信息盤(pán)塊號(hào)、首塊物理位置或索引表就能存取文件信息。2.一級(jí)目錄結(jié)構(gòu)目錄結(jié)構(gòu)的組織關(guān)系到文件系統(tǒng)的存取速度,也關(guān)系到文件的共享性和安全性。因此組織好文件的目錄,是設(shè)計(jì)好文件系統(tǒng)的重要環(huán)節(jié)。最簡(jiǎn)單的文件目錄是一級(jí)目錄結(jié)構(gòu),所有FCB排列在一張線(xiàn)性表中。一級(jí)目錄的優(yōu)點(diǎn)是簡(jiǎn)單,但它只能實(shí)現(xiàn)目錄管理中最基本的按名存取功能,文件重名和文件共享問(wèn)題難以解決。3.兩級(jí)目錄結(jié)構(gòu)兩級(jí)目錄結(jié)構(gòu)將文件目錄分成主文件目錄和用戶(hù)文件目錄兩級(jí)。系統(tǒng)為每個(gè)用戶(hù)建立一個(gè)用戶(hù)文件目錄(UFD),每個(gè)用戶(hù)的文件目錄登記了該用戶(hù)建立的所有文件名及其屬性信息。主目錄(MFD)則登記了進(jìn)入系統(tǒng)的各個(gè)用戶(hù)文件目錄的情況,每個(gè)用戶(hù)占一個(gè)表目,說(shuō)明該用戶(hù)目錄的屬性,包括用戶(hù)名、目錄大小、組織形式及其所在的位置等。兩級(jí)目錄結(jié)構(gòu)提高了目錄檢索的速度;允許不同的用戶(hù)目錄中使用相同的文件名;不同用戶(hù)也可以使用不同的文件名或相同的文件名來(lái)訪(fǎng)問(wèn)系統(tǒng)中的同一個(gè)共享文件。兩級(jí)目錄結(jié)構(gòu)雖然比較簡(jiǎn)單實(shí)用,但缺乏靈活性,特別是難以反映現(xiàn)實(shí)世界的多層次關(guān)系。4.多級(jí)樹(shù)形目錄結(jié)構(gòu)在現(xiàn)代操作系統(tǒng)中,所有文件系統(tǒng)都支持多級(jí)目錄結(jié)構(gòu),根目錄是唯一的,每一級(jí)目錄可以是下一級(jí)目錄的說(shuō)明,也可以是文件的說(shuō)明,從而形成樹(shù)狀目錄結(jié)構(gòu)。如圖8.1是Linux目錄層次結(jié)構(gòu),它是一棵倒置的有根樹(shù),樹(shù)根是根目錄,從根向下,每個(gè)樹(shù)枝是子目錄,而樹(shù)葉是文件。樹(shù)狀多級(jí)目錄結(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.1Linux目錄層次結(jié)構(gòu)文件結(jié)構(gòu)在系統(tǒng)中的所有文件都存在著以下兩種形式的文件結(jié)構(gòu):文件的邏輯結(jié)構(gòu)。這是從用戶(hù)觀(guān)點(diǎn)出發(fā)所觀(guān)察到的文件組織形式,即文件是由一系列的邏輯記錄組成的,是用戶(hù)可以直接處理的數(shù)據(jù)及其結(jié)構(gòu),它獨(dú)立于文件的物理特性。文件的物理結(jié)構(gòu)。這是指系統(tǒng)將文件存儲(chǔ)在外存上所形成的一種存儲(chǔ)組織形式,是用戶(hù)不能看見(jiàn)的。文件的物理結(jié)構(gòu)不僅與存儲(chǔ)介質(zhì)的存儲(chǔ)性能有關(guān),而且與所采用的外存分配方式有關(guān)。文件邏輯結(jié)構(gòu)文件的邏輯結(jié)構(gòu)分為兩種形式:流式文件和記錄式文件。(1)流式文件這是一種無(wú)結(jié)構(gòu)的文件,文件內(nèi)的數(shù)據(jù)不再組成紀(jì)錄,只是一串順序的信息集合,稱(chēng)為字節(jié)流文件。流式文件中的每個(gè)字節(jié)都有一個(gè)索引,第一個(gè)字節(jié)的索引為0,第二個(gè)字節(jié)的索引為1……打開(kāi)文件的進(jìn)程使用文件讀寫(xiě)指針來(lái)訪(fǎng)問(wèn)文件中的特定字節(jié)。當(dāng)文件打開(kāi)時(shí),文件讀寫(xiě)指針指向首字節(jié),每k個(gè)字節(jié)的讀或?qū)懖僮魍瓿?,則將文件讀寫(xiě)指針加k。事實(shí)上,有許多應(yīng)用不再要求文件內(nèi)再區(qū)分記錄,因而,為了簡(jiǎn)化系統(tǒng),大多數(shù)現(xiàn)代操作系統(tǒng)如Linux系統(tǒng)只提供流式文件。(2)記錄式文件這是一種有結(jié)構(gòu)的文件,它包含若干邏輯記錄,邏輯記錄是文件中按信息在邏輯上的獨(dú)立含義所劃分的信息單位,記錄在文件中的排列按其出現(xiàn)次序編號(hào),記錄0,記錄1……。記錄式文件中有兩種常用的記錄組織和使用方法:①記錄式順序文件:文件的記錄順序生成并被順序訪(fǎng)問(wèn)。②記錄式索引順序文件:這種文件使用索引表,表項(xiàng)包含記錄鍵和索引指針,記錄鍵有應(yīng)用程序確定,而索引指針便指向相應(yīng)記錄。這種文件可針對(duì)特定記錄進(jìn)行存取,它也保持著順序訪(fǎng)問(wèn)記錄的功能。2.文件物理結(jié)構(gòu)(1)順序文件 將文件中邏輯上連續(xù)的信息存放到存儲(chǔ)介質(zhì)的相鄰物理塊上形成順序結(jié)構(gòu),叫做順序文件,又稱(chēng)連續(xù)文件。這種文件結(jié)構(gòu)的優(yōu)點(diǎn)是管理簡(jiǎn)單,存取速度快。主要缺點(diǎn)是建立文件之前需預(yù)先確定文件長(zhǎng)度,以便分配存儲(chǔ)空間;修改、插入和添加文件記錄有一定的難度;對(duì)于變長(zhǎng)記錄的處理很困難;對(duì)磁盤(pán)做連續(xù)分配會(huì)造成空閑塊的浪費(fèi)。(2)連接文件。把邏輯文件中各個(gè)邏輯記錄存放到一些磁盤(pán)塊中,這些磁盤(pán)塊可以是不連續(xù)的,用指針把這些磁盤(pán)塊按邏輯記錄的順序連接起來(lái),形成了文件的連接結(jié)構(gòu)。文件信息存放在磁盤(pán)的若干物理塊中,第一塊文件信息的物理地址由FCB給出,而每塊的連接字出文件的下一個(gè)物理塊位置。通常,當(dāng)連接字的內(nèi)容為0時(shí),表示文件至本塊結(jié)束。連接文件結(jié)構(gòu)的優(yōu)點(diǎn)是易于文件擴(kuò)充,不要求占用連續(xù)的外存空間,存儲(chǔ)空間利用率高。由于連接文件只能按連接指針順序搜索,因此存取速度慢。(3)索引文件索引結(jié)構(gòu)是實(shí)現(xiàn)非連續(xù)存儲(chǔ)的另一種方法,適用于數(shù)據(jù)記錄保存在磁盤(pán)上的文件,系統(tǒng)為每個(gè)文件建立索引表(indextable),可以有不同的索引形式,一種是記錄組成文件的磁盤(pán)塊號(hào),這種索引表只是磁盤(pán)塊號(hào)的序列,適用于流式文件;另一種其索引表項(xiàng)包含記錄鍵及其磁盤(pán)塊號(hào),適用于記錄式文件。利用索引表來(lái)搜索記錄的文件稱(chēng)為索引文件,索引表可存放在FCB中,打開(kāi)文件時(shí)就可使用索引表訪(fǎng)問(wèn)文件信息,大文件的索引表很大。有些文件系統(tǒng)讓索引表置于單獨(dú)的物理塊中且可駐留在磁盤(pán)上,F(xiàn)CB中僅包含索引表的地址。索引文件結(jié)構(gòu)既可滿(mǎn)足文件動(dòng)態(tài)增、刪的要求,存儲(chǔ)空間的利用率也較高;索引結(jié)構(gòu)既適用于順序存取,也適用于隨機(jī)存取,可以方便、較迅速地實(shí)現(xiàn)文件的存取。缺點(diǎn)是由于使用索引表而增加了存儲(chǔ)空間的開(kāi)銷(xiāo)。文件系統(tǒng)的接口文件系統(tǒng)作為一個(gè)高效管理文件的程序,其運(yùn)行更多的是在系統(tǒng)內(nèi)部運(yùn)行,而用戶(hù)所需要關(guān)心只是它的接口。文件系統(tǒng)通常向用戶(hù)提供以下兩類(lèi)接口。第一類(lèi)是與文件有關(guān)的操作命令或者作業(yè)控制語(yǔ)言中與文件有關(guān)的語(yǔ)句,構(gòu)成文件系統(tǒng)命令接口;第二類(lèi)是提供給用戶(hù)程序使用的文件系統(tǒng)調(diào)用,構(gòu)成了用戶(hù)和文件系統(tǒng)的另一個(gè)接口,稱(chēng)為程序接口。文件系統(tǒng)提供給用戶(hù)程序的一組系統(tǒng)調(diào)用,包括建立、打開(kāi)、關(guān)閉、撤銷(xiāo)、讀、寫(xiě)和控制。通過(guò)這些系統(tǒng)調(diào)用,用戶(hù)可以獲得文件系統(tǒng)的各種服務(wù)?;疚募到y(tǒng)調(diào)用有建立文件、打開(kāi)文件、讀寫(xiě)文件、關(guān)閉文件等。文件系統(tǒng)模擬實(shí)現(xiàn)實(shí)驗(yàn)內(nèi)容編寫(xiě)程序模擬一個(gè)簡(jiǎn)單的文件系統(tǒng),具體實(shí)驗(yàn)內(nèi)容如下:(1)實(shí)現(xiàn)多級(jí)目錄結(jié)構(gòu),而非二級(jí)目錄結(jié)構(gòu)。(2)實(shí)現(xiàn)文件和目錄的創(chuàng)建、刪除、重命名和讀寫(xiě)權(quán)限控制功能。(3)實(shí)現(xiàn)顯示文件內(nèi)容和更改文件內(nèi)容的功能。(4)創(chuàng)建文件或目錄時(shí),采用動(dòng)態(tài)申請(qǐng)的方式請(qǐng)求存儲(chǔ)空間分配,在刪除文件或目錄時(shí),還需對(duì)申請(qǐng)的空間進(jìn)行釋放。(5)為觀(guān)察各種命令執(zhí)行情況,要求以樹(shù)形結(jié)構(gòu)直觀(guān)地顯示命令執(zhí)行后的目錄結(jié)構(gòu)。實(shí)驗(yàn)指導(dǎo)1.主要數(shù)據(jù)結(jié)構(gòu)說(shuō)明(1)文件控制塊(FCB)應(yīng)包含:文件名、文件內(nèi)容、父目錄地址、同級(jí)目錄文件地址、讀寫(xiě)權(quán)限等信息。其數(shù)據(jù)結(jié)構(gòu)及說(shuō)明如下:typedefstructFILE { charname[256]; //文件名 charcontent[1000]; //文件內(nèi)容 structFILE*frontFile; //同級(jí)目錄上一文件 structFILE*nextFile; //同級(jí)目錄下一文件 structFOLDER*parentFolder; //父目錄 intcanRead; //是否可讀 intcanWrite; //是否可寫(xiě)}FILE,*PFILE;(2)目錄結(jié)構(gòu)typedefstructFOLDER { charname[256]; //目錄名 structFOLDER*nextFolder; //同級(jí)下一目錄 structFOLDER*frontFolder; //同級(jí)上一目錄 structFOLDER*parentFolder; //父目錄 structFOLDER*firstChildFolder;//子目錄 structFILE*firstChildFile; //子文件 intcanRead; //是否可讀 intcanWrite; //是否可寫(xiě)}FOLDER,*PFOLDER;(3)在模擬程序中,應(yīng)先建立文件系統(tǒng)的根目錄,文件系統(tǒng)中的操作都在此目錄下完成,且不得直接對(duì)根目錄操作。PFOLDERroot; //根目錄(4)在指定目錄下新建立的文件和目錄,都通過(guò)該目錄中最后一個(gè)子文件或子目錄的nextFile或nextFolder指針建立連接;若該目錄之中無(wú)任何子文件和子目錄,則通過(guò)該目錄的firstChildFolder(或firstChildFile)指針建立連接。如圖8.2所示。圖8.2多級(jí)目錄結(jié)構(gòu)2.文件系統(tǒng)模擬程序執(zhí)行流程(1)程序運(yùn)行時(shí),系統(tǒng)首先根據(jù)目錄FOLDER結(jié)構(gòu)建立根目錄root,并為其分配空間,初始化其信息。(2)程序給出一個(gè)菜單,用戶(hù)根據(jù)菜單選項(xiàng)前的數(shù)字,選擇要執(zhí)行的操作命令。(3)若在根目錄下建立子目錄,則建立一個(gè)新FOLDER并為其分配空間后,利用根目錄中的子目錄節(jié)點(diǎn)指針與該子目錄建立連接。(4)若在根目錄下建立文件,則建立一個(gè)新FCB并為其分配空間后,利用根目錄中的子文件節(jié)點(diǎn)指針與該文件建立連接。(5)對(duì)指定文件或目錄進(jìn)行刪除、重命名、設(shè)置權(quán)限等操作時(shí),需要先在文件系統(tǒng)中找到目標(biāo)文件或目錄才可進(jìn)行下一步的操作,否則提示用戶(hù)目標(biāo)文件或目錄不存在。(6)若文件或目錄若不具有可讀權(quán)限,不會(huì)在文件系統(tǒng)中顯示,處于隱藏狀態(tài),但并不代表不存在;文件或目錄若不具有可寫(xiě)權(quán)限,則不能對(duì)在該目錄下執(zhí)行創(chuàng)建,刪除,不能重命名該目錄;不能更改文件內(nèi)容。(7)每次執(zhí)行操作命令后,為直觀(guān)地觀(guān)察執(zhí)行情況,會(huì)顯示輸出命令執(zhí)行后的目錄結(jié)構(gòu)。文件系統(tǒng)執(zhí)行流程如圖8.3所示。圖8.3文件系統(tǒng)執(zhí)行流程3.各種操作命令流程圖本實(shí)驗(yàn)?zāi)M實(shí)現(xiàn)多個(gè)目錄和文操作命令,這里給出其中部分操作命令的流程圖。創(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)容流程圖程序示例#include"stdio.h"#include"string.h"#include"stdlib.h"typedefstructFOLDER //目錄結(jié)構(gòu){ charname[256]; //目錄名 structFOLDER*nextFolder; //同級(jí)下一目錄 structFOLDER*frontFolder; //同級(jí)上一目錄 structFOLDER*parentFolder; //父目錄 structFOLDER*firstChildFolder;//子目錄 structFILE*firstChildFile; //子文件 intcanRead; //是否可讀 intcanWrite; //是否可寫(xiě)}FOLDER,*PFOLDER;typedefstructFILE //文件控制塊信息{ charname[256]; //文件名 charcontent[1000]; //文件內(nèi)容 structFILE*frontFile; //同級(jí)目錄上一文件 structFILE*nextFile; //同級(jí)目錄下一文件 structFOLDER*parentFolder; //父目錄 intcanRead; //是否可讀 intcanWrite; //是否可寫(xiě)}FILE,*PFILE;PFOLDERroot; //根目錄intcount=0; //控制輸出格式intflagD=0; //刪除標(biāo)記PFOLDERfindCurrentFolder(PFOLDERcurrentFolder,charname[]) //查找指定目錄{ PFOLDERfolder; if(currentFolder==NULL) returnNULL; //沒(méi)找到 if(strcmp(currentFolder->name,name)==0) returncurrentFolder; //查找目錄為當(dāng)前目錄 folder=findCurrentFolder(currentFolder->firstChildFolder,name); if(folder!=NULL) returnfolder; //查找目錄在子目錄中 folder=findCurrentFolder(currentFolder->nextFolder,name); if(folder!=NULL) returnfolder; //查找目錄在同級(jí)其它目錄中 returnNULL; //沒(méi)找到}PFILEfindCurrentFile(PFOLDERcurrentFolder,charname[])//查找指定文件{ PFILEtempFile; if(currentFolder==NULL) returnNULL; //沒(méi)找到 tempFile=currentFolder->firstChildFile; while(tempFile!=NULL) //遍歷當(dāng)前目錄子文件 { if(strcmp(tempFile->name,name)==0) returntempFile; //找到了 tempFile=tempFile->nextFile; } tempFile=findCurrentFile(currentFolder->firstChildFolder,name); if(tempFile!=NULL) returntempFile; //查找文件在子目錄中 tempFile=findCurrentFile(currentFolder->nextFolder,name); if(tempFile!=NULL) returntempFile; //查找文件在同級(jí)其它目錄中 returnNULL; //沒(méi)找到}PFOLDERprepareWorkBeforeCreate() { PFOLDERcurrentFolder=NULL; charname[256]; printf("輸入當(dāng)前目錄名稱(chēng):"); gets(name); fflush(stdin); currentFolder=findCurrentFolder(root,name); if(currentFolder==NULL) { puts("目錄不存在!"); returnNULL; } if(currentFolder->canWrite==0) { puts("權(quán)限不夠,不予創(chuàng)建!"); returnNULL; } returncurrentFolder;}voidcreateFolder() //當(dāng)前目錄中創(chuàng)建新目錄{ PFOLDERcurrentFolder=prepareWorkBeforeCreate(); if(currentFolder==NULL){ //目標(biāo)目錄不存在 return; } charname[256]; printf("輸入新目錄名稱(chēng):"); gets(name); fflush(stdin); PFOLDERnewFolder; newFolder=(PFOLDER)malloc(sizeof(FOLDER)); strcpy(newFolder->name,name); newFolder->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)前目錄下無(wú)子目錄 { currentFolder->firstChildFolder=newFolder; newFolder->parentFolder=currentFolder; } else //當(dāng)前目錄下有子目錄 { PFOLDERtempFolder=currentFolder->firstChildFolder; PFOLDERlastFolder; //保存當(dāng)前currentFolder下最后一個(gè)子folder while(tempFolder!=NULL) //同級(jí)目錄下不得有相同目錄 { lastFolder=tempFolder; if(strcmp(tempFolder->name,newFolder->name)==0) { printf("%s目錄下已有同名目錄!\n",currentFolder->name); free(newFolder); return; } tempFolder=tempFolder->nextFolder; } lastFolder->nextFolder=newFolder; //將新目錄與同級(jí)舊目錄建立連接 newFolder->frontFolder=lastFolder; } puts("創(chuàng)建成功!");}voidcreateFile() //當(dāng)前目錄中創(chuàng)建新文件{ PFOLDERcurrentFolder=prepareWorkBeforeCreate(); if(currentFolder==NULL){ //目標(biāo)目錄不存在 return; } charname[256]; printf("輸入新文件名稱(chēng):"); gets(name); fflush(stdin); PFILEnewFile; newFile=(PFILE)malloc(sizeof(FILE)); strcpy(newFile->name,name); printf("是否輸入文件內(nèi)容?"); charans=getchar(); fflush(stdin); if(ans=='y'||ans=='Y') { printf("輸入文件內(nèi)容:"); gets(newFile->content); } else { strcpy(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)前目錄下無(wú)子文件 { currentFolder->firstChildFile=newFile; newFile->parentFolder=currentFolder; } else //當(dāng)前目錄下有子文件 { PFILEtempFile=currentFolder->firstChildFile; PFILElastFile; //保存當(dāng)前currentFolder下最后一個(gè)子file while(tempFile!=NULL) //同級(jí)目錄下不得有相同文件 { lastFile=tempFile; if(strcmp(tempFile->name,newFile->name)==0) { printf("%s目錄下已有同名文件!\n",currentFolder->name); free(newFile); return; } tempFile=tempFile->nextFile; } lastFile->nextFile=newFile; //將新文件與同級(jí)文件建立連接 newFile->frontFile=lastFile; } puts("創(chuàng)建成功!");}voidinputName(charname[]){ printf("輸入名稱(chēng):"); gets(name); fflush(stdin);}voiddeleteAllChild(PFOLDERcurrentFolder) //刪除該目錄下所有內(nèi)容{ PFILEtempFile,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->nextFile; free(dFile); //(釋放空間) } free(currentFolder); //刪除該目錄(釋放空間)}voiddeleteFolder() //刪除目錄所有內(nèi)容{ charname[256]; inputName(name); if(strcmp(name,"root")==0) { puts("根目錄不準(zhǔn)刪除!"); return; } PFOLDERcurrentFolder=findCurrentFolder(root,name); if(currentFolder==NULL) { printf("目錄不存在!"); return; } if(currentFolder->canWrite==0) { puts("權(quán)限不夠,不予刪除!"); return; } if(currentFolder->frontFolder==NULL) { currentFolder->parentFolder->firstChildFolder=currentFolder->nextFolder; //斷開(kāi)連接 if(currentFolder->nextFolder!=NULL) //重設(shè)為頭 currentFolder->nextFolder->frontFolder=NULL; } else currentFolder->frontFolder->nextFolder=currentFolder->nextFolder; //斷開(kāi)連接 deleteAllChild(currentFolder); //(釋放空間) puts("刪除成功!");}voiddeleteFile() //刪除文件{ charname[256]; inputName(name); PFILEcurrentFile=findCurrentFile(root,name); if(currentFile==NULL) { printf("文件不存在!"); return; } if(currentFile->frontFile==NULL) { currentFile->parentFolder->firstChildFile=currentFile->nextFile; //斷開(kāi)連接 if(currentFile->nextFile!=NULL) currentFile->nextFile->frontFile=NULL; //重設(shè)為頭 } else currentFile->frontFile->nextFile=currentFile->nextFile; //斷開(kāi)連接 free(currentFile); //刪除文件 puts("刪除成功!");}voiddisplayFileSystemStructure(PFOLDERcurrentFolder) //輸出目錄結(jié)構(gòu){ PFILEtempFile; if(currentFolder!=NULL&¤tFolder->canRead) //是否可讀 { for(inti=0;i<count;i++) printf(""); printf("|-"); printf(currentFolder->name); intlength=15-count*2-strlen(currentFolder->name); for(i=0;i<length;i++) //權(quán)限 printf(""); if(count==0) printf("canReadcanWrite\n"); else printf("<dir>%d%d\n",currentFolder->canRead,currentFolder->canWrite); } elseif(currentFolder==NULL) { count--; return; } count++; tempFile=currentFolder->firstChildFile; while(tempFile!=NULL) //遍歷子文件 { if(tempFile->canRead==1) //是否可讀 { for(inti=0;i<count;i++) printf(""); printf("|-"); printf(tempFile->name); intlength=20-count*2-strlen(tempFile->name); for(i=0;i<length;i++) //權(quán)限 printf(""); if(count==0) printf("canReadcanWrite\n"); else printf("%d%d\n",tempFile->canRead,tempFile->canWrite); } tempFile=tempFile->nextFile; } displayFileSystemStructure(currentFolder->firstChildFolder); //遍歷子目錄 displayFileSystemStructure(currentFolder->nextFolder); //遍歷同級(jí)目錄}voidshowFileContent() //顯示文件內(nèi)容{ PFILEcurrentFile=NULL; charname[256]; printf("輸入文件名:"); gets(name); fflush(stdin); currentFile=findCurrentFile(root,name); if(currentFile==NULL) { puts("文件不存在!"); return; } if(!currentFile->canRead) { puts("權(quán)限不夠,無(wú)法讀??!"); return; } printf("文件內(nèi)容:%s\n",currentFile->content); printf("文件長(zhǎng)度:%d\n",strlen(currentFile->content));}voidchangeFileContent() //更改文件內(nèi)容{ PFILEcurrentFile=NULL; charname[256]; printf("輸入文件名:"); gets(name); fflush(stdin); currentFile=findCurrentFile(root,name); if(currentFile==NULL) { puts("文件不存在!"); return; } if(!currentFile->canWrite) { puts("權(quán)限不夠,不予修改!"); return; } printf("輸入文件內(nèi)容:"); gets(currentFile->content); fflush(stdin); puts("更改成功!");}voidchangeAllChildPermission(PFOLDERcurrentFolder,intcanRead,intcanWrite) //更改子目錄下所有目錄和文件權(quán)限{ PFILEtempFile; if(currentFolder!=NULL) { currentFolder->canRead=canRead; currentFolder->canWrite=canWrite; } elseif(currentFolder==NULL) return; tempFile=currentFolder->firstChildFile; while(tempFile!=NULL) //遍歷子文件 { tempFile->canRead=canRead; tempFile->canWrite=canWrite; tempFile=tempFile->nextFile; } changeAllChildPermission(currentFolder->firstChildFolder,canRead,canWrite); //遍歷子目錄 if(currentFolder->firstChildFolder!=NULL) changeAllChildPermission(currentFolder->firstChildFolder->nextFolder,canRead,canWrite);//遍歷同級(jí)目錄}voidchangeFolderPermission() //更改目錄權(quán)限{ charname[256]; inputName(name); if(strcmp(name,"root")==0) { puts("根目錄不準(zhǔn)更改權(quán)限!"); return; } PFOLDERcurrentFolder=NULL; currentFolder=findCurrentFolder(root,name); if(currentFolder==NULL) { puts("目錄不存在!"); return; } printf("輸入目錄權(quán)限(讀和寫(xiě)):"); scanf("%d%d",¤tFolder->canRead,¤tFolder->canWrite); fflush(stdin); changeAllChildPermission(currentFolder,currentFolder->canRead,currentFolder->canWrite); //更改當(dāng)前目錄權(quán)限時(shí),同時(shí)更改其目錄下所有文件和目錄權(quán)限 puts("權(quán)限更改成功!");}voidchangeFilePermission() //更改文件權(quán)限{ charname[256]; inputName(name); PFILEcurrentFile=NULL; currentFile=findCurrentFile(root,name); if(currentFile==NULL) { puts("文件不存在!"); return; } printf("輸入文件權(quán)限(讀和寫(xiě))"); scanf("%d%d",¤tFile->canRead,¤tFile->canWrite); fflush(stdin); puts("權(quán)限更改成功!");}intfileNameIsDuplication(PFILEcurrentFile,charname[]) //判斷新重命名的文件是否重名{ PFILEtempFile=currentFile->frontFile; while(tempFile!=NULL) //向前掃描 { if(strcmp(tempFile->name,name)==0) { printf("文件重名!\n"); return1; } tempFile=tempFile->frontFile; } tempFile=currentFile->nextFile; while(tempFile!=NULL) //向后掃描 { if(strcmp(tempFile->name,name)==0) { printf("文件重名!\n"); return1; } tempFile=tempFile->nextFile; } return0;}intfolderNameIsDuplication(PFOLDERcurrentFolder,charname[]) //判斷新重命名的目錄是否重名{ PFOLDERtempFolder=currentFolder->frontFolder; while(tempFolder!=NULL) //向前掃描 { if(strcmp(tempFolder->name,name)==0) { printf("目錄重名!\n"); return1; } tempFolder=tempFolder->frontFolder; } tempFolder=currentFolder->nextFolder; while(tempFolder!=NULL) //向后掃描 { if(strcmp(tempFolder->name,name)==0) { printf("目錄重名!\n"); return1; } tempFolder=tempFolder->nextFolder; } return0;}voidrenameFolder() //重命名目錄{ charname[256]; inputName(name); if(strcmp("root",name)==0) { puts("根目錄不準(zhǔn)更改!"); return; } PFOLDERcurrentFolder=findCurrentFolder(root,name); if(currentFolder==NULL) { puts("目錄不存在!"); return; } printf("輸入新名稱(chēng):"); gets(name); fflush(stdin); if(folderNameIsDuplication(currentFolder,name)) //重名 return; strcpy(currentFolder->name,name); puts("重命名成功!");}voidrenameFile() //重命名文件{ charname[256]; inputName(name); PFILEcurrentFile=findCurrentFile(root,name); if(currentFile==NULL) { puts("文件不存在!"); return; } printf("輸入新名稱(chēng):"); gets(name); fflush(stdin); if(fileNameIsDuplication(currentFile,name)) //重名 return; strcpy(currentFile->name,name); puts("重命名成功!");}voidmenu() //菜單{ intchoice; printf("\t************************\n"); printf("\t*1.創(chuàng)建目錄*\n"); printf("\t*2.刪除目錄*\n"); printf("\t*3.重命名目錄*\n"); printf("\t*4.更改目錄權(quán)限*\n"); printf("\t*5.創(chuàng)建文件*\n"); printf("\t*6.刪除文件*\n"); printf("\t*7.重命名文件*\n"); printf("\t*8.顯示文件內(nèi)容*\n"); printf("\t*9.更改文件內(nèi)容*\n"); printf("\t*10.更改文件權(quán)限*\n"); printf("\t*0.退出*\n"); printf("\t************************\n"); count=0; printf("\n目錄結(jié)構(gòu):\n"); displayFileSystemStructure(root); while(1) { printf("\n---------------------------------------------\n"); printf("請(qǐng)選擇操作命令:"); scanf("%d",&choice); fflush(stdin); switch(choice) { case1:createFolder(); //創(chuàng)建目錄 break; case2:deleteFolder(); //刪除目錄 break; case3: renameFolder(); //重命名目錄 break; case4: changeFolderPermission(); //更改目錄權(quán)限 break; case5:createFile(); //創(chuàng)建文件 break; case6:deleteFile(); //刪除文件 break; case7:renameFile(); //重命名文件 break; case8: showFileContent(); //顯示文件內(nèi)容 break; case9: changeFileContent(); //更改文件內(nèi)容 break; case10:changeFilePermission(); //更改文件權(quán)限 break; case0:exit(0); //退出 break; default:break; } count=0; printf("\n目錄結(jié)構(gòu):\n"); displayFileSystemStructure(root); }}voidinitRootFolder() //初始化根目錄信息{ root=(PFOLDER)malloc(sizeof(FOLDER)); root->frontFolder=NULL; root->nextFolder=NULL; root->parentFolder=NULL; root->firstChildFolder=NULL; root->firstChildFile=NULL; root->canRead=1; root->canWrite=1; strcpy(root->name,"root");}intmain(void){ initRootFolder(); menu(); return0;}運(yùn)行結(jié)果及分析程序經(jīng)編譯運(yùn)行后,文件模擬系統(tǒng)顯示一個(gè)菜單,并顯示樹(shù)形目錄,主界面如下所示:(1)主界面*************************1.創(chuàng)建目錄**2.刪除目錄**3.重命名目錄**4.更改目錄權(quán)限**5.創(chuàng)建文件**6.刪除文件**7.重命名文件**8.顯示文件內(nèi)容**9.更改文件內(nèi)容**10.更改文件權(quán)限**0.退出*************************目錄結(jié)構(gòu):|-rootcanReadcanWrite此時(shí),用戶(hù)可選擇相應(yīng)操作命令;在每一次完成操作后,會(huì)顯示目錄結(jié)構(gòu),便于用戶(hù)查看到文件系統(tǒng)內(nèi)容的更新,從而了解命令的執(zhí)行情況。(2)創(chuàng)建目錄和創(chuàng)建文件當(dāng)用戶(hù)選擇功能1后,首先需指定目標(biāo)目錄,若目標(biāo)目錄不存在或不具有可寫(xiě)權(quán)限時(shí),則會(huì)提示創(chuàng)建失敗,這時(shí)可更改目標(biāo)目錄的可寫(xiě)權(quán)限后繼續(xù)完成操作。目錄創(chuàng)建成功后,顯示新建立的目錄及其讀寫(xiě)權(quán)限,為區(qū)別文件和目錄,在目錄名后輸出“<dir>”,表明這是一個(gè)子目錄。例如在root根目錄下建立子目錄folder1時(shí),程序運(yùn)行情況如下所示:---------------------------------------------請(qǐng)選擇操作命令:1輸入當(dāng)前目錄名稱(chēng):root輸入新目錄名稱(chēng):folder1創(chuàng)建成功!目錄結(jié)構(gòu):|-rootcanReadcanWrite|-folder1<dir>11--------------------------------------------- 當(dāng)用戶(hù)選擇功能5后將執(zhí)行創(chuàng)建文件操作。在創(chuàng)建文件時(shí)會(huì)提示用戶(hù)是否立刻輸入文件內(nèi)容,若創(chuàng)建文件時(shí)并不想輸入內(nèi)容,則可通過(guò)更改文件內(nèi)容功能輸入文件內(nèi)容,文件創(chuàng)建成功后,在目錄結(jié)構(gòu)中顯示新文件及其讀寫(xiě)權(quán)限,默認(rèn)為可讀可寫(xiě),文件讀寫(xiě)權(quán)限可執(zhí)行更改文件權(quán)限命令修改。例如在root根目錄下創(chuàng)建文件file.txt時(shí),程序運(yùn)行情況如下所示:---------------------------------------------請(qǐng)選擇操作命令:5輸入當(dāng)前目錄名稱(chēng):root輸入新文件名稱(chēng):file.txt是否輸入文件內(nèi)容?n創(chuàng)建成功!目錄結(jié)構(gòu):|-rootcanReadcanWrite|-file.txt11|-folder1<dir>11-----------------
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 贛南醫(yī)學(xué)院《攝影與攝像》2023-2024學(xué)年第一學(xué)期期末試卷
- 贛南師范大學(xué)《能源化工專(zhuān)業(yè)英語(yǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 甘肅中醫(yī)藥大學(xué)《麻醉設(shè)備學(xué)基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2022年上半年盧姨筆試幼兒綜合教資押題(含答案)
- 三年級(jí)數(shù)學(xué)上冊(cè)第五單元倍的認(rèn)識(shí)第1課時(shí)倍的認(rèn)識(shí)教案新人教版
- 三年級(jí)科學(xué)下冊(cè)四植物和我們1植物和我們的生活教案新人教版
- 員工培訓(xùn)課件服從
- 禮儀常識(shí)培訓(xùn)課件
- 面部手法培訓(xùn)課件
- 《水環(huán)境公共政策》課件
- 氨堿法純堿生產(chǎn)工藝概述
- 基礎(chǔ)化工行業(yè)深度:電解液新型鋰鹽材料之雙氟磺酰亞胺鋰(LiFSI)市場(chǎng)潛力可觀(guān)新型鋰鹽LiFSI國(guó)產(chǎn)化進(jìn)程加速
- 年產(chǎn)10000噸一次性自然降解環(huán)保紙漿模塑餐具自動(dòng)化生產(chǎn)線(xiàn)技改項(xiàng)目環(huán)境影響報(bào)告表
- 實(shí)戰(zhàn)銷(xiāo)售培訓(xùn)講座(共98頁(yè)).ppt
- 測(cè)控電路第7章信號(hào)細(xì)分與辨向電路
- 哈爾濱工業(yè)大學(xué)信紙模版
- 氨的飽和蒸汽壓表
- 指揮中心大廳及機(jī)房裝修施工組織方案
- 餐飲店應(yīng)聘人員面試測(cè)評(píng)表
- APQP全套表格最新版(共98頁(yè))
- 六年級(jí)上冊(cè)數(shù)學(xué)試題-天津河西區(qū)2018-2019學(xué)年度期末考試人教新課標(biāo)含答案
評(píng)論
0/150
提交評(píng)論