操作系統(tǒng)課程設(shè)計(jì) 簡(jiǎn)單文件系統(tǒng)的實(shí)現(xiàn)_第1頁(yè)
操作系統(tǒng)課程設(shè)計(jì) 簡(jiǎn)單文件系統(tǒng)的實(shí)現(xiàn)_第2頁(yè)
操作系統(tǒng)課程設(shè)計(jì) 簡(jiǎn)單文件系統(tǒng)的實(shí)現(xiàn)_第3頁(yè)
操作系統(tǒng)課程設(shè)計(jì) 簡(jiǎn)單文件系統(tǒng)的實(shí)現(xiàn)_第4頁(yè)
操作系統(tǒng)課程設(shè)計(jì) 簡(jiǎn)單文件系統(tǒng)的實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、操作系統(tǒng)課程設(shè)計(jì)報(bào)告小組編號(hào): 小組成員:一、課程設(shè)計(jì)概述:1、題目:簡(jiǎn)單文件系統(tǒng)的實(shí)現(xiàn)2、實(shí)現(xiàn)內(nèi)容(1) 在內(nèi)存中開(kāi)辟一個(gè)虛擬磁盤空間作為文件存儲(chǔ)分區(qū),在其上實(shí)現(xiàn)一個(gè)簡(jiǎn)單的基于多級(jí)目錄的單用戶單任務(wù)系統(tǒng)中的文件系統(tǒng)。在退出該文件系統(tǒng)的使用時(shí),應(yīng)將該虛擬文件系統(tǒng)以一個(gè)Windows 文件的方式保存到磁盤上,以便下次可以再將它恢復(fù)到內(nèi)存的虛擬磁盤空間中。(2) 文件存儲(chǔ)空間的分配可采用顯式鏈接分配或其他的辦法。(3) 空閑磁盤空間的管理可選擇位示圖或其他的辦法。如果采用位示圖來(lái)管理文件存儲(chǔ)空間,并采用顯式鏈接分配方式,那么可以將位示圖合并到FAT中。(4) 文件目錄結(jié)構(gòu)采用多級(jí)目錄結(jié)構(gòu)。為了簡(jiǎn)單

2、起見(jiàn),可以不使用索引結(jié)點(diǎn),其中的每個(gè)目錄項(xiàng)應(yīng)包含文件名、物理地址、長(zhǎng)度等信息,還可以通過(guò)目錄項(xiàng)實(shí)現(xiàn)對(duì)文件的讀和寫的保護(hù)。(5) 要求提供以下操作命令:l my_format:對(duì)文件存儲(chǔ)器進(jìn)行格式化,即按照文件系統(tǒng)的結(jié)構(gòu)對(duì)虛擬磁盤空間進(jìn)行布局,并在其上創(chuàng)建根目錄以及用于管理文件存儲(chǔ)空間等的數(shù)據(jù)結(jié)構(gòu)。l my_mkdir:用于創(chuàng)建子目錄。l my_rmdir:用于刪除子目錄。l my_ls:用于顯示目錄中的內(nèi)容。l my_cd:用于更改當(dāng)前目錄。l my_create:用于創(chuàng)建文件。l my_open:用于打開(kāi)文件。l my_close:用于關(guān)閉文件。l my_write:用于寫文件。l my_r

3、ead:用于讀文件。l my_rm:用于刪除文件。l my_exitsys:用于退出文件系統(tǒng)。2、 設(shè)計(jì)思路(主要算法描述、程序流程圖等):1系統(tǒng)主函數(shù)main()(1)對(duì)應(yīng)命令:無(wú)(2)命令調(diào)用格式:無(wú)(3)函數(shù)設(shè)計(jì)格式:void main()(4)功能:系統(tǒng)主函數(shù)(5)輸入:無(wú)(6)輸出:無(wú)(7)函數(shù)需完成的工作: 對(duì)前面定義的全局變量進(jìn)行初始化; 調(diào)用startsys()進(jìn)入文件系統(tǒng); 列出文件系統(tǒng)提供的各項(xiàng)功能及命令調(diào)用格式; 顯示命令行提示符,等待用戶輸入命令; 將用戶輸入的命令保存到一個(gè)buf中; 對(duì)buf中的內(nèi)容進(jìn)行命令解析,并調(diào)用相應(yīng)的函數(shù)執(zhí)行用戶鍵入的命令; 如果命令不是“m

4、y_exitsys”,則命令執(zhí)行完畢后轉(zhuǎn)。2. 進(jìn)入文件系統(tǒng)函數(shù)startsys()(1)對(duì)應(yīng)命令:無(wú)(2)命令調(diào)用格式:無(wú)(3)函數(shù)設(shè)計(jì)格式:void startsys()(4)功能:由main()函數(shù)調(diào)用,進(jìn)入并初始化我們所建立的文件系統(tǒng),以供用戶使用。(5)輸入:無(wú) (6)輸出:無(wú)。(7)函數(shù)需完成的工作: 申請(qǐng)?zhí)摂M磁盤空間; 使用c語(yǔ)言的庫(kù)函數(shù)fopen()打開(kāi)myfsys文件:若文件存在,則轉(zhuǎn);若文件不存在,則創(chuàng)建之,轉(zhuǎn) 使用c語(yǔ)言的庫(kù)函數(shù)fread()讀入myfsys文件內(nèi)容到用戶空間中的一個(gè)緩沖區(qū)中,并判斷其開(kāi)始的8個(gè)字節(jié)內(nèi)容是否為“10101010”(文件系統(tǒng)魔數(shù)),如果是,則

5、轉(zhuǎn);否則轉(zhuǎn); 將上述緩沖區(qū)中的內(nèi)容復(fù)制到內(nèi)存中的虛擬磁盤空間中;轉(zhuǎn) 在屏幕上顯示“myfsys文件系統(tǒng)不存在,現(xiàn)在開(kāi)始創(chuàng)建文件系統(tǒng)”信息,并調(diào)用my_format()對(duì)中申請(qǐng)到的虛擬磁盤空間進(jìn)行格式化操作。轉(zhuǎn); 將虛擬磁盤中的內(nèi)容保存到myfsys文件中;轉(zhuǎn) 使用c語(yǔ)言的庫(kù)函數(shù)fclose()關(guān)閉myfsys文件; 初始化用戶打開(kāi)文件表,將表項(xiàng)0分配給根目錄文件使用,并填寫根目錄文件的相關(guān)信息,由于根目錄沒(méi)有上級(jí)目錄,所以表項(xiàng)中的dirno和diroff分別置為5(根目錄所在起始?jí)K號(hào))和0;并將ptrcurdir指針指向該用戶打開(kāi)文件表項(xiàng)。 將當(dāng)前目錄設(shè)置為根目錄。3磁盤格式化函數(shù)my_for

6、mat()(1)對(duì)應(yīng)命令:my_format(2)命令調(diào)用格式:my_format(3)函數(shù)設(shè)計(jì)格式:void my_format()(4)功能:對(duì)虛擬磁盤進(jìn)行格式化,布局虛擬磁盤,建立根目錄文件(或根目錄區(qū))。(5)輸入:無(wú) (6)輸出:無(wú)。(7)函數(shù)需完成的工作: 將虛擬磁盤第一個(gè)塊作為引導(dǎo)塊,開(kāi)始的8個(gè)字節(jié)是文件系統(tǒng)的魔數(shù),記為“10101010”;在之后寫入文件系統(tǒng)的描述信息,如FAT表大小及位置、根目錄大小及位置、盤塊大小、盤塊數(shù)量、數(shù)據(jù)區(qū)開(kāi)始位置等信息; 在引導(dǎo)塊后建立兩張完全一樣的FAT表,用于記錄文件所占據(jù)的磁盤塊及管理虛擬磁盤塊的分配,每個(gè)FAT占據(jù)兩個(gè)磁盤塊;對(duì)于每個(gè)FAT

7、中,前面5個(gè)塊設(shè)置為已分配,后面995個(gè)塊設(shè)置為空閑; 在第二張F(tuán)AT后創(chuàng)建根目錄文件root,將數(shù)據(jù)區(qū)的第1塊(即虛擬磁盤的第6塊)分配給根目錄文件,在該磁盤上創(chuàng)建兩個(gè)特殊的目錄項(xiàng):“.”和“.”,其內(nèi)容除了文件名不同之外,其他字段完全相同。 4更改當(dāng)前目錄函數(shù)my_cd()(1)對(duì)應(yīng)命令:my_cd (2)命令調(diào)用格式:my_cd dirname(3)函數(shù)設(shè)計(jì)格式:void my_cd(char *dirname)(4)功能:改變當(dāng)前目錄到指定的名為dirname的目錄。(5)輸入:dirname:新的當(dāng)前目錄的目錄名; (6)輸出:無(wú)(7)函數(shù)需完成的工作: 調(diào)用my_open()打開(kāi)指

8、定目錄名的父目錄文件,并調(diào)用do_read()讀入該父目錄文件內(nèi)容到內(nèi)存中; 在父目錄文件中檢查新的當(dāng)前目錄名是否存在,如果存在則轉(zhuǎn),否則返回,并顯示出錯(cuò)信息; 調(diào)用my_close()關(guān)閉中打開(kāi)的父目錄文件; 調(diào)用my_close()關(guān)閉原當(dāng)前目錄文件; 如果新的當(dāng)前目錄文件沒(méi)有打開(kāi),則打開(kāi)該目錄文件;并將ptrcurdir指向該打開(kāi)文件表項(xiàng); 設(shè)置當(dāng)前目錄為該目錄。5創(chuàng)建子目錄函數(shù)my_mkdir()(1)對(duì)應(yīng)命令:my_mkdir(2)命令調(diào)用格式:my_ mkdir dirname(3)函數(shù)設(shè)計(jì)格式:void my_mkdir(char *dirname)(4)功能:在當(dāng)前目錄下創(chuàng)建名

9、為dirname的子目錄。(5)輸入:dirname:新建目錄的目錄名。 (6)輸出:無(wú)。(7)函數(shù)需完成的工作: 調(diào)用do_read()讀入當(dāng)前目錄文件內(nèi)容到內(nèi)存,檢查當(dāng)前目錄下新建目錄文件是否重名,若重名則返回,并顯示錯(cuò)誤信息; 為新建子目錄文件分配一個(gè)空閑打開(kāi)文件表項(xiàng),如果沒(méi)有空閑表項(xiàng)則返回-1,并顯示錯(cuò)誤信息; 檢查FAT是否有空閑的盤塊,如有則為新建目錄文件分配一個(gè)盤塊,否則釋放中分配的打開(kāi)文件表項(xiàng),返回,并顯示錯(cuò)誤信息; 在當(dāng)前目錄中為新建目錄文件尋找一個(gè)空閑的目錄項(xiàng)或?yàn)槠渥芳右粋€(gè)新的目錄項(xiàng);需修改當(dāng)前目錄文件的長(zhǎng)度信息,并將當(dāng)前目錄文件的用戶打開(kāi)文件表項(xiàng)中的fcbstate置為1

10、; 準(zhǔn)備好新建目錄文件的FCB的內(nèi)容,文件的屬性為目錄文件,以覆蓋寫方式調(diào)用do_write()將其填寫到對(duì)應(yīng)的空目錄項(xiàng)中; 在新建目錄文件所分配到的磁盤塊中建立兩個(gè)特殊的目錄項(xiàng)“.”和“.”目錄項(xiàng),方法是:首先在用戶空間中準(zhǔn)備好內(nèi)容,然后以截?cái)鄬懟蛘吒采w寫方式調(diào)用do_write()將其寫到中分配到的磁盤塊中; 返回。6刪除子目錄函數(shù)rmdir()(1)對(duì)應(yīng)命令:my_ rmdir(2)命令調(diào)用格式:my_ rmdir dirname(1)函數(shù)設(shè)計(jì)格式:void my_rmdir(char *dirname)(2)功能:在當(dāng)前目錄下刪除名為dirname的子目錄。(3)輸入:dirname:

11、欲刪除目錄的目錄名。 (4)輸出:無(wú)。(5)函數(shù)需完成的工作: 調(diào)用do_read()讀入當(dāng)前目錄文件內(nèi)容到內(nèi)存,檢查當(dāng)前目錄下欲刪除目錄文件是否存在,若不存在則返回,并顯示錯(cuò)誤信息; 檢查欲刪除目錄文件是否為空(除了“.”和“.”外沒(méi)有其他子目錄和文件),可根據(jù)其目錄項(xiàng)中記錄的文件長(zhǎng)度來(lái)判斷,若不為空則返回,并顯示錯(cuò)誤信息; 檢查該目錄文件是否已經(jīng)打開(kāi),若已打開(kāi)則調(diào)用my_close()關(guān)閉掉; 回收該目錄文件所占據(jù)的磁盤塊,修改FAT; 從當(dāng)前目錄文件中清空該目錄文件的目錄項(xiàng),且free字段置為0:以覆蓋寫方式調(diào)用do_write()來(lái)實(shí)現(xiàn); 修改當(dāng)前目錄文件的用戶打開(kāi)表項(xiàng)中的長(zhǎng)度信息,并

12、將表項(xiàng)中的fcbstate置為1; 返回。7顯示目錄函數(shù)my_ls()(1)對(duì)應(yīng)命令:my_ls(2)命令調(diào)用格式:my_ls(3)函數(shù)設(shè)計(jì)格式:void my_ls(void)(4)功能:顯示當(dāng)前目錄的內(nèi)容(子目錄和文件信息)。(5)輸入:無(wú) (6)輸出:無(wú)(7)函數(shù)需完成的工作: 調(diào)用do_read()讀出當(dāng)前目錄文件內(nèi)容到內(nèi)存; 將讀出的目錄文件的信息按照一定的格式顯示到屏幕上; 返回。 8創(chuàng)建文件函數(shù)my_create() (1)對(duì)應(yīng)命令:my_create(2)命令調(diào)用格式:my_create filename(3)函數(shù)設(shè)計(jì)格式:int my_create (char *filena

13、me)(4)功能:創(chuàng)建名為filename的新文件。(5)輸入:filename:新建文件的文件名,可能包含路徑。 (6)輸出:若創(chuàng)建成功,返回該文件的文件描述符(文件打開(kāi)表中的數(shù)組下標(biāo));否則返回-1。(7)函數(shù)需完成的工作: 為新文件分配一個(gè)空閑打開(kāi)文件表項(xiàng),如果沒(méi)有空閑表項(xiàng)則返回-1,并顯示錯(cuò)誤信息; 若新文件的父目錄文件還沒(méi)有打開(kāi),則調(diào)用my_open()打開(kāi);若打開(kāi)失敗,則釋放中為新建文件分配的空閑文件打開(kāi)表項(xiàng),返回-1,并顯示錯(cuò)誤信息; 調(diào)用do_read()讀出該父目錄文件內(nèi)容到內(nèi)存,檢查該目錄下新文件是否重名,若重名則釋放中分配的打開(kāi)文件表項(xiàng),并調(diào)用my_close()關(guān)閉中打

14、開(kāi)的目錄文件;然后返回-1,并顯示錯(cuò)誤信息; 檢查FAT是否有空閑的盤塊,如有則為新文件分配一個(gè)盤塊,否則釋放中分配的打開(kāi)文件表項(xiàng),并調(diào)用my_close()關(guān)閉中打開(kāi)的目錄文件;返回-1,并顯示錯(cuò)誤信息; 在父目錄中為新文件尋找一個(gè)空閑的目錄項(xiàng)或?yàn)槠渥芳右粋€(gè)新的目錄項(xiàng);需修改該目錄文件的長(zhǎng)度信息,并將該目錄文件的用戶打開(kāi)文件表項(xiàng)中的fcbstate置為1; 準(zhǔn)備好新文件的FCB的內(nèi)容,文件的屬性為數(shù)據(jù)文件,長(zhǎng)度為0,以覆蓋寫方式調(diào)用do_write()將其填寫到中分配到的空目錄項(xiàng)中; 為新文件填寫中分配到的空閑打開(kāi)文件表項(xiàng),fcbstate字段值為0,讀寫指針值為0; 調(diào)用my_close(

15、)關(guān)閉中打開(kāi)的父目錄文件; 將新文件的打開(kāi)文件表項(xiàng)序號(hào)作為其文件描述符返回。9刪除文件函數(shù)my_rm()(1)對(duì)應(yīng)命令:my_rm(2)命令調(diào)用格式:my_rm filename(3)函數(shù)設(shè)計(jì)格式:void my_rm(char *filename)(4)功能:刪除名為filename的文件。(5)輸入:filename:欲刪除文件的文件名,可能還包含路徑。 (6)輸出:無(wú)。(7)函數(shù)需完成的工作: 若欲刪除文件的父目錄文件還沒(méi)有打開(kāi),則調(diào)用my_open()打開(kāi);若打開(kāi)失敗,則返回,并顯示錯(cuò)誤信息; 調(diào)用do_read()讀出該父目錄文件內(nèi)容到內(nèi)存,檢查該目錄下欲刪除文件是否存在,若不存在則

16、返回,并顯示錯(cuò)誤信息; 檢查該文件是否已經(jīng)打開(kāi),若已打開(kāi)則關(guān)閉掉; 回收該文件所占據(jù)的磁盤塊,修改FAT; 從文件的父目錄文件中清空該文件的目錄項(xiàng),且free字段置為0:以覆蓋寫方式調(diào)用do_write()來(lái)實(shí)現(xiàn); 修改該父目錄文件的用戶打開(kāi)文件表項(xiàng)中的長(zhǎng)度信息,并將該表項(xiàng)中的fcbstate置為1; 返回。10打開(kāi)文件函數(shù)my_open()(1)對(duì)應(yīng)命令:my_open(2)命令調(diào)用格式:my_open filename(3)函數(shù)設(shè)計(jì)格式:int my_open(char *filename)(4)功能:打開(kāi)當(dāng)前目錄下名為filename的文件。(5)輸入:filename:欲打開(kāi)文件的文件

17、名 (6)輸出:若打開(kāi)成功,返回該文件的描述符(在用戶打開(kāi)文件表中表項(xiàng)序號(hào));否則返回-1。(7)函數(shù)需完成的工作: 檢查該文件是否已經(jīng)打開(kāi),若已打開(kāi)則返回-1,并顯示錯(cuò)誤信息; 調(diào)用do_read()讀出父目錄文件的內(nèi)容到內(nèi)存,檢查該目錄下欲打開(kāi)文件是否存在,若不存在則返回-1,并顯示錯(cuò)誤信息; 檢查用戶打開(kāi)文件表中是否有空表項(xiàng),若有則為欲打開(kāi)文件分配一個(gè)空表項(xiàng),若沒(méi)有則返回-1,并顯示錯(cuò)誤信息; 為該文件填寫空白用戶打開(kāi)文件表表項(xiàng)內(nèi)容,讀寫指針置為0; 將該文件所分配到的空白用戶打開(kāi)文件表表項(xiàng)序號(hào)(數(shù)組下標(biāo))作為文件描述符fd返回。11關(guān)閉文件函數(shù)my_close()(1)對(duì)應(yīng)命令:my_

18、close(2)命令調(diào)用格式:my_close fd(3)函數(shù)設(shè)計(jì)格式:void my_close(int fd)(4)功能:關(guān)閉前面由my_open()打開(kāi)的文件描述符為fd的文件。(5)輸入:fd:文件描述符。 (6)輸出:無(wú)。(7)函數(shù)需完成的工作: 檢查fd的有效性(fd不能超出用戶打開(kāi)文件表所在數(shù)組的最大下標(biāo)),如果無(wú)效則返回-1; 檢查用戶打開(kāi)文件表表項(xiàng)中的fcbstate字段的值,如果為1則需要將該文件的FCB的內(nèi)容保存到虛擬磁盤上該文件的目錄項(xiàng)中,方法是:打開(kāi)該文件的父目錄文件,以覆蓋寫方式調(diào)用do_write()將欲關(guān)閉文件的FCB寫入父目錄文件的相應(yīng)盤塊中; 回收該文件占據(jù)

19、的用戶打開(kāi)文件表表項(xiàng)(進(jìn)行清空操作),并將topenfile字段置為0; 返回。12寫文件函數(shù)my_write() (1)對(duì)應(yīng)命令:my_write(2)命令調(diào)用格式:my_write fd(3)函數(shù)設(shè)計(jì)格式:int my_write(int fd)(4)功能:將用戶通過(guò)鍵盤輸入的內(nèi)容寫到fd所指定的文件中。磁盤文件的讀寫操作都必須以完整的數(shù)據(jù)塊為單位進(jìn)行,在寫操作時(shí),先將數(shù)據(jù)寫在緩沖區(qū)中,緩沖區(qū)的大小與磁盤塊的大小相同,然后再將緩沖區(qū)中的數(shù)據(jù)一次性寫到磁盤塊中;讀出時(shí)先將一個(gè)磁盤塊中的內(nèi)容讀到緩沖區(qū)中,然后再傳送到用戶區(qū)。本實(shí)例為了簡(jiǎn)便起見(jiàn),沒(méi)有設(shè)置緩沖區(qū)管理,只是在讀寫文件時(shí)由用戶使用ma

20、lloc()申請(qǐng)一塊空間作為緩沖區(qū),讀寫操作結(jié)束后使用free()釋放掉。寫操作常有三種方式:截?cái)鄬憽⒏采w寫和追加寫。截?cái)鄬懯欠艞壴瓉?lái)文件的內(nèi)容,重新寫文件;覆蓋寫是修改文件在當(dāng)前讀寫指針?biāo)傅奈恢瞄_(kāi)始的部分內(nèi)容;追加寫是在原文件的最后添加新的內(nèi)容。在本實(shí)例中,輸入寫文件命令后,系統(tǒng)會(huì)出現(xiàn)提示讓用戶選擇其中的一種寫方式,并將隨后鍵盤輸入的內(nèi)容按照所選的方式寫到文件中,鍵盤輸入內(nèi)容通過(guò)CTR+Z鍵(或其他設(shè)定的鍵)結(jié)束。(5)輸入:fd: open()函數(shù)的返回值,文件的描述符; (6)輸出:實(shí)際寫入的字節(jié)數(shù)。(7)函數(shù)需完成的工作: 檢查fd的有效性(fd不能超出用戶打開(kāi)文件表所在數(shù)組的最大下

21、標(biāo)),如果無(wú)效則返回-1,并顯示出錯(cuò)信息; 提示并等待用戶輸入寫方式:(1:截?cái)鄬懀?:覆蓋寫;3:追加寫) 如果用戶要求的寫方式是截?cái)鄬?,則釋放文件除第一塊外的其他磁盤空間內(nèi)容(查找并修改FAT表),將內(nèi)存用戶打開(kāi)文件表項(xiàng)中文件長(zhǎng)度修改為0,將讀寫指針置為0并轉(zhuǎn);如果用戶要求的寫方式是追加寫,則修改文件的當(dāng)前讀寫指針位置到文件的末尾,并轉(zhuǎn);如果寫方式是覆蓋寫,則直接轉(zhuǎn); 提示用戶:整個(gè)輸入內(nèi)容通過(guò)CTR+Z鍵(或其他設(shè)定的鍵)結(jié)束;用戶可分多次輸入寫入內(nèi)容,每次用回車結(jié)束; 等待用戶從鍵盤輸入文件內(nèi)容,并將用戶的本次輸入內(nèi)容保存到一臨時(shí)變量text中,要求每次輸入以回車結(jié)束,全部結(jié)束用CTR

22、+Z鍵(或其他設(shè)定的鍵); 調(diào)用do_write()函數(shù)將通過(guò)鍵盤鍵入的內(nèi)容寫到文件中。 如果do_write()函數(shù)的返回值為非負(fù)值,則將實(shí)際寫入字節(jié)數(shù)增加do_write()函數(shù)返回值,否則顯示出錯(cuò)信息,并轉(zhuǎn); 如果text中最后一個(gè)字符不是結(jié)束字符CTR+Z,則轉(zhuǎn)繼續(xù)進(jìn)行寫操作;否則轉(zhuǎn); 如果當(dāng)前讀寫指針位置大于用戶打開(kāi)文件表項(xiàng)中的文件長(zhǎng)度,則修改打開(kāi)文件表項(xiàng)中的文件長(zhǎng)度信息,并將fcbstate置1; 返回實(shí)際寫入的字節(jié)數(shù)。13實(shí)際寫文件函數(shù)do_write() (1)對(duì)應(yīng)命令:無(wú)(2)命令調(diào)用格式:無(wú)(3)函數(shù)設(shè)計(jì)格式:int my_write(int fd,char *text,i

23、nt len,char wstyle)(4)功能:被寫文件函數(shù)my_write()調(diào)用,用來(lái)將鍵盤輸入的內(nèi)容寫到相應(yīng)的文件中去。(5)輸入:fd: open()函數(shù)的返回值,文件的描述符; text:指向要寫入的內(nèi)容的指針;len:本次要求寫入字節(jié)數(shù) wstyle:寫方式(6)輸出:實(shí)際寫入的字節(jié)數(shù)。(7)函數(shù)需完成的工作: 用malloc()申請(qǐng)1024B的內(nèi)存空間作為讀寫磁盤的緩沖區(qū)buf,申請(qǐng)失敗則返回-1,并顯示出錯(cuò)信息; 將讀寫指針轉(zhuǎn)化為邏輯塊塊號(hào)和塊內(nèi)偏移off,并利用打開(kāi)文件表表項(xiàng)中的首塊號(hào)及FAT表的相關(guān)內(nèi)容將邏輯塊塊號(hào)轉(zhuǎn)換成對(duì)應(yīng)的磁盤塊塊號(hào)blkno;如果找不到對(duì)應(yīng)的磁盤塊,

24、則需要檢索FAT為該邏輯塊分配一新的磁盤塊,并將對(duì)應(yīng)的磁盤塊塊號(hào)blkno登記到FAT中,若分配失敗,則返回-1,并顯示出錯(cuò)信息; 如果是覆蓋寫,或者如果當(dāng)前讀寫指針?biāo)鶎?duì)應(yīng)的塊內(nèi)偏移off不等于0,則將塊號(hào)為blkno的虛擬磁盤塊全部1024B的內(nèi)容讀到緩沖區(qū)buf中;否則便用ASCII碼0清空buf; 將text中未寫入的內(nèi)容暫存到緩沖區(qū)buff的第off字節(jié)開(kāi)始的位置,直到緩沖區(qū)滿,或者接收到結(jié)束字符CTR+Z為止;將本次寫入字節(jié)數(shù)記錄到tmplen中; 將buf中1024B的內(nèi)容寫入到塊號(hào)為blkno的虛擬磁盤塊中;將當(dāng)前讀寫指針修改為原來(lái)的值加上tmplen;并將本次實(shí)際寫入的字節(jié)數(shù)增

25、加tmplen; 如果tmplen小于len,則轉(zhuǎn)繼續(xù)寫入;否則轉(zhuǎn); 返回本次實(shí)際寫入的字節(jié)數(shù)。14讀文件函數(shù)my_read() (1)對(duì)應(yīng)命令:my_read(2)命令調(diào)用格式:my_read fd len(3)函數(shù)設(shè)計(jì)格式:int myread (int fd, int len)(4)功能:讀出指定文件中從讀寫指針開(kāi)始的長(zhǎng)度為len的內(nèi)容到用戶空間中。(5)輸入:fd: open()函數(shù)的返回值,文件的描述符;len: 要從文件中讀出的字節(jié)數(shù)。 (6)輸出:實(shí)際讀出的字節(jié)數(shù)。(7)函數(shù)需完成的工作: 定義一個(gè)字符型數(shù)組textlen,用來(lái)接收用戶從文件中讀出的文件內(nèi)容; 檢查fd的有效性(

26、fd不能超出用戶打開(kāi)文件表所在數(shù)組的最大下標(biāo)),如果無(wú)效則返回-1,并顯示出錯(cuò)信息; 調(diào)用do_read()將指定文件中的len字節(jié)內(nèi)容讀出到text中; 如果do_read()的返回值為負(fù),則顯示出錯(cuò)信息;否則將text中的內(nèi)容顯示到屏幕上; 返回。15實(shí)際讀文件函數(shù)do_read() (1)對(duì)應(yīng)命令:無(wú)(2)命令調(diào)用格式:無(wú)(3)函數(shù)設(shè)計(jì)格式:int do_read (int fd, int len,char *text)(4)功能:被my_read()調(diào)用,讀出指定文件中從讀寫指針開(kāi)始的長(zhǎng)度為len的內(nèi)容到用戶空間的text中。(5)輸入:fd: open()函數(shù)的返回值,文件的描述符;

27、len: 要求從文件中讀出的字節(jié)數(shù)。 text:指向存放讀出數(shù)據(jù)的用戶區(qū)地址(6)輸出:實(shí)際讀出的字節(jié)數(shù)。(7)函數(shù)需完成的工作: 使用malloc()申請(qǐng)1024B空間作為緩沖區(qū)buf,申請(qǐng)失敗則返回-1,并顯示出錯(cuò)信息; 將讀寫指針轉(zhuǎn)化為邏輯塊塊號(hào)及塊內(nèi)偏移量off,利用打開(kāi)文件表表項(xiàng)中的首塊號(hào)查找FAT表,找到該邏輯塊所在的磁盤塊塊號(hào);將該磁盤塊塊號(hào)轉(zhuǎn)化為虛擬磁盤上的內(nèi)存位置; 將該內(nèi)存位置開(kāi)始的1024B(一個(gè)磁盤塊)內(nèi)容讀入buf中; 比較buf中從偏移量off開(kāi)始的剩余字節(jié)數(shù)是否大于等于應(yīng)讀寫的字節(jié)數(shù)len,如果是,則將從off開(kāi)始的buf中的len長(zhǎng)度的內(nèi)容讀入到text中;否則

28、,將從off開(kāi)始的buf中的剩余內(nèi)容讀入到text中; 將讀寫指針增加中已讀字節(jié)數(shù),將應(yīng)讀寫的字節(jié)數(shù)len減去中已讀字節(jié)數(shù),若len大于0,則轉(zhuǎn);否則轉(zhuǎn); 使用free()釋放中申請(qǐng)的buf。 返回實(shí)際讀出的字節(jié)數(shù)。16. 退出文件系統(tǒng)函數(shù)my_exitsys() (1)對(duì)應(yīng)命令:my_exitsys(2)命令調(diào)用格式:my_ exitsys(1)函數(shù)設(shè)計(jì)格式:void my_exitsys()(2)功能:退出文件系統(tǒng)。(3)輸入:無(wú) (4)輸出:無(wú)。(5)函數(shù)需完成的工作: 使用C庫(kù)函數(shù)fopen()打開(kāi)磁盤上的myfsys文件; 將虛擬磁盤空間中的所有內(nèi)容保存到磁盤上的myfsys文件中;

29、 使用c語(yǔ)言的庫(kù)函數(shù)fclose()關(guān)閉myfsys文件; 撤銷用戶打開(kāi)文件表,釋放其內(nèi)存空間 釋放虛擬磁盤空間。程序啟動(dòng)流程圖文件系統(tǒng)是否存在加載文件系統(tǒng) 是 否創(chuàng)建文件系統(tǒng),并格式化 等待用戶命令輸入用戶輸入命令my_exitsysmy_openmy_rmmy_createmy_ls 3、 程序?qū)崿F(xiàn)代碼:#include #include #include #include #define BLOCKSIZE 1024 / 磁盤塊大小#define SIZE 1024000 / 虛擬磁盤空間大小#define END 65535 / FAT中的文件結(jié)束標(biāo)志#define FREE 0 /

30、FAT中盤塊空閑標(biāo)志#define ROOTBLOCKNUM 2 / 根目錄區(qū)所占盤塊數(shù)#define MAXOPENFILE 10 / 最多同時(shí)打開(kāi)文件個(gè)數(shù)t#define MAXTEXT 10000/* 文件控制塊 */typedef struct FCB char filename8; / 文件名 char exname3; / 文件擴(kuò)展名 unsigned char attribute; / 文件屬性字段,值為0時(shí)表示目錄文件,值為1時(shí)表示數(shù)據(jù)文件 unsigned short time; / 文件創(chuàng)建時(shí)間 unsigned short date; / 文件創(chuàng)建日期 unsigned

31、short first; / 文件起始盤塊號(hào) unsigned long length; / 文件長(zhǎng)度 char free; / 表示目錄項(xiàng)是否為空,若值為0,表示空,值為1,表示已分配fcb;/* 文件分配表 */typedef struct FAT unsigned short id; / 磁盤塊的狀態(tài)(空閑的,最后的,下一個(gè))fat;/* 用戶打開(kāi)文件表 */typedef struct USEROPEN char filename8; / 文件名 char exname3; / 文件擴(kuò)展名 unsigned char attribute;/文件屬性字段,值為0時(shí)表示目錄文件,值為1時(shí)表

32、示數(shù)據(jù)文件 unsigned short time; / 文件創(chuàng)建時(shí)間 unsigned short date; / 文件創(chuàng)建日期 unsigned short first; / 文件起始盤塊號(hào) unsigned long length;/文件長(zhǎng)度(對(duì)數(shù)據(jù)文件是字節(jié)數(shù),對(duì)目錄文件可以是目錄項(xiàng)個(gè)數(shù)) char free; / 表示目錄項(xiàng)是否為空,若值為0,表示空,值為1,表示已分配 unsigned short dirno; / 相應(yīng)打開(kāi)文件的目錄項(xiàng)在父目錄文件中的盤塊號(hào) int diroff; / 相應(yīng)打開(kāi)文件的目錄項(xiàng)在父目錄文件的dirno盤塊中的目錄項(xiàng)序號(hào) char dir80; / 相應(yīng)

33、打開(kāi)文件所在的路徑名,這樣方便快速檢查出指定文件是否已經(jīng)打開(kāi) int father; / 父目錄在打開(kāi)文件表項(xiàng)的位置 int count; / 讀寫指針在文件中的位置,文件的總字符數(shù) char fcbstate; / 是否修改了文件的FCB的內(nèi)容,如果修改了置為1,否則為0 char topenfile; / 表示該用戶打開(kāi)表項(xiàng)是否為空,若值為0,表示為空,否則表示已被某打開(kāi)文件占據(jù)useropen;/* 引導(dǎo)塊 */typedef struct BLOCK0 char magic10; / 文件系統(tǒng)魔數(shù) char information200;/存儲(chǔ)一些描述信息,如磁盤塊大小、磁盤塊數(shù)量、最

34、多打開(kāi)文件數(shù)等 unsigned short root; / 根目錄文件的起始盤塊號(hào) unsigned char *startblock; / 虛擬磁盤上數(shù)據(jù)區(qū)開(kāi)始位置block0;unsigned char *myvhard; / 指向虛擬磁盤的起始地址useropen openfilelistMAXOPENFILE; / 用戶打開(kāi)文件表數(shù)組int curdir; / 用戶打開(kāi)文件表中的當(dāng)前目錄所在打開(kāi)文件表項(xiàng)的位置char currentdir80; / 記錄當(dāng)前目錄的目錄名(包括目錄的路徑)unsigned char* startp; / 記錄虛擬磁盤上數(shù)據(jù)區(qū)開(kāi)始位置char myfil

35、ename = myfilesys;/文件系統(tǒng)的文件名void startsys(); / 進(jìn)入文件系統(tǒng)void my_format(); / 磁盤格式化void my_cd(char *dirname); / 更改當(dāng)前目錄void my_mkdir(char *dirname); / 創(chuàng)建子目錄void my_rmdir(char *dirname); / 刪除子目錄void my_ls(); / 顯示目錄void my_create (char *filename); / 創(chuàng)建文件void my_rm(char *filename); / 刪除文件int my_open(char *fil

36、ename); / 打開(kāi)文件int my_close(int fd); / 關(guān)閉文件int my_write(int fd); / 寫文件int do_write(int fd, char *text, int len, char wstyle); / 實(shí)際寫文件int my_read (int fd, int len); / 讀文件int do_read (int fd, int len,char *text); / 實(shí)際讀文件void my_exitsys(); / 退出文件系統(tǒng)unsigned short findblock(); / 尋找空閑盤塊int findopenfile();

37、/ 尋找空閑文件表項(xiàng)void startsys() FILE *fp; unsigned char bufSIZE; fcb *root; int i; myvhard = (unsigned char *)malloc(SIZE);/申請(qǐng)?zhí)摂M磁盤空間 memset(myvhard, 0, SIZE);/將myvhard中前SIZE個(gè)字節(jié)用 0 替換并返回 myvhard if(fp = fopen(myfilename, r) != NULL) fread(buf, SIZE, 1, fp);/將二進(jìn)制文件讀取到緩沖區(qū) fclose(fp); if(strcmp(block0 *)buf)-

38、magic, 10101010) printf(myfilesys is not exist,begin to creat the file.n); my_format(); else for(i = 0; i filename); strcpy(openfilelist0.exname, root-exname); openfilelist0.attribute = root-attribute; openfilelist0.time = root-time; openfilelist0.date = root-date; openfilelist0.first = root-first;

39、openfilelist0.length = root-length; openfilelist0.free = root-free; openfilelist0.dirno = 5; openfilelist0.diroff = 0; strcpy(openfilelist0.dir, root); openfilelist0.father = 0; openfilelist0.count = 0; openfilelist0.fcbstate = 0; openfilelist0.topenfile = 1; for(i = 1; i startblock;void my_format()

40、 FILE *fp; fat *fat1, *fat2; block0 *blk0; time_t now; struct tm *nowtime; fcb *root; int i; blk0 = (block0 *)myvhard; fat1 = (fat *)(myvhard + BLOCKSIZE); fat2 = (fat *)(myvhard + 3 * BLOCKSIZE); root = (fcb *)(myvhard + 5 * BLOCKSIZE); strcpy(blk0-magic, 10101010); strcpy(blk0-information, My File

41、System Ver 1.0 n Blocksize=1KB Whole size=1000KB Blocknum=1000 RootBlocknum=2n); blk0-root = 5; blk0-startblock = (unsigned char *)root; for(i = 0; i id = END; fat2-id = END; fat1+; fat2+; fat1-id = 6; fat2-id = 6; fat1+; fat2+; fat1-id = END; fat2-id = END; fat1+; fat2+; for(i = 7; i id = FREE; fat

42、2-id = FREE; fat1+; fat2+; now = time(NULL); nowtime = localtime(&now); strcpy(root-filename, .); strcpy(root-exname, ); root-attribute = 0x28; root-time = nowtime-tm_hour * 2048 + nowtime-tm_min * 32 + nowtime-tm_sec / 2; root-date = (nowtime-tm_year - 80) * 512 + (nowtime-tm_mon + 1) * 32 + nowtim

43、e-tm_mday; root-first = 5; root-length = 2 * sizeof(fcb); root-free = 1; root+; now = time(NULL); nowtime = localtime(&now); strcpy(root-filename, .); strcpy(root-exname, ); root-attribute = 0x28; root-time = nowtime-tm_hour * 2048 + nowtime-tm_min * 32 + nowtime-tm_sec / 2; root-date = (nowtime-tm_

44、year - 80) * 512 + (nowtime-tm_mon + 1) * 32 + nowtime-tm_mday; root-first = 5; root-length = 2 * sizeof(fcb); root-free = 1; fp = fopen(myfilename, w); fwrite(myvhard, SIZE, 1, fp); fclose(fp);void my_cd(char *dirname) char *dir; int fd; dir = strtok(dirname, );/分解字符串為一組字符串。dirname為要分解的字符串,為分隔符字符串

45、if(strcmp(dir, .) = 0) return; else if(strcmp(dir, .) = 0) if(curdir) curdir = my_close(curdir); return; else if(strcmp(dir, root) = 0) while(curdir) curdir = my_close(curdir); dir = strtok(NULL, ); while(dir) fd = my_open(dir); if(fd != -1) curdir = fd; else return; dir = strtok(NULL, ); void my_mk

46、dir(char *dirname) fcb *fcbptr; fat *fat1, *fat2; time_t now; struct tm *nowtime; char textMAXTEXT; unsigned short blkno; int rbn, fd, i; fat1 = (fat *)(myvhard + BLOCKSIZE); fat2 = (fat *)(myvhard + 3 * BLOCKSIZE); openfilelistcurdir.count = 0; rbn = do_read(curdir, openfilelistcurdir.length, text)

47、; fcbptr = (fcb *)text; for(i = 0; i filename, dirname) = 0 & strcmp(fcbptr-exname, ) = 0) printf(Error,the dirname is already exist!n); return; fcbptr+; fcbptr = (fcb *)text; for(i = 0; i free = 0) break; fcbptr+; blkno = findblock();/尋找空閑盤塊 if(blkno = -1) return; (fat1 + blkno)-id = END; (fat2 + b

48、lkno)-id = END; now = time(NULL); nowtime = localtime(&now); strcpy(fcbptr-filename, dirname); strcpy(fcbptr-exname, ); fcbptr-attribute = 0x30; fcbptr-time = nowtime-tm_hour * 2048 + nowtime-tm_min * 32 + nowtime-tm_sec / 2; fcbptr-date = (nowtime-tm_year - 80) * 512 + (nowtime-tm_mon + 1) * 32 + nowtime-tm_mday; fcbptr-first = blkno; fcbptr-length = 2 * sizeof(fcb); fcbptr-free = 1; openfilelistcurdir.count = i * sizeof(fcb);/把當(dāng)前目錄的文件讀寫指針定位到文件末尾 do_write(curdir, (char *)fcbptr, sizeof(fcb), 2);/從指針fcbptr開(kāi)始

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論