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

下載本文檔

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

文檔簡介

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

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

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

4、共閱2.進(jìn)入文件系統(tǒng)函數(shù)startsys()(1)對應(yīng)命令:無(2)命令調(diào)用格式:無(3)函數(shù)設(shè)計格式:voidstartsys()(4)功能:由main()函數(shù)調(diào)用,進(jìn)入并初始化我們所建立的文件系統(tǒng),以供用戶使用.(5)輸入:無(6)輸出:無.(7)函數(shù)需完成的工作:申請?zhí)摂M磁盤空間;使用c語言的庫函數(shù)fopen()JT開myfsys文件:假設(shè)文件存在,那么轉(zhuǎn);假設(shè)文件不存在,那么創(chuàng)立之,使用c語言的庫函數(shù)fread()讀入myfsys文件內(nèi)容到用戶空間中的一個緩沖區(qū)中,并判斷其開始的8個字節(jié)內(nèi)容是否為(文件系統(tǒng)魔數(shù)),如果是,那么轉(zhuǎn);否那么轉(zhuǎn);將上述緩沖區(qū)中的內(nèi)容復(fù)制到內(nèi)存中的虛擬磁盤空間

5、中;轉(zhuǎn)在屏幕上顯示“ myfsys文件系統(tǒng)不存在,現(xiàn)在開始創(chuàng)立文件系統(tǒng)信息,并調(diào)用 my_format() 對中申請到的虛擬磁盤空間進(jìn)行格式化操作.轉(zhuǎn);將虛擬磁盤中的內(nèi)容保存到 myfsys文件中;轉(zhuǎn)使用c語言的庫函數(shù)fclose(因15 myfsys文件;初始化用戶翻開文件表,將表項 0分配給根目錄文件使用,并填寫根目錄文件的相關(guān)信息,由于根目錄沒有上級目錄,所以表項中的 dirno和diroff分別置為5 (根目錄所在起始塊號)和 0; 并將ptrcurdir指針指向該用戶翻開文件表項.將當(dāng)前目錄設(shè)置為根目錄.3.磁盤格式化函數(shù)my_format()(1)對應(yīng)命令: my_format(2

6、)命令調(diào)用格式: my_format(3)函數(shù)設(shè)計格式:voidmy_format()(4)功能:對虛擬磁盤進(jìn)行格去化,布局虛擬磁盤,建立根目錄文件(或根目錄區(qū)).(5)輸入:無(6)輸出:無.(7)函數(shù)需完成的工作:將虛擬磁盤第一個塊作為引導(dǎo)塊,開始的 8個字節(jié)是文件系統(tǒng)的魔數(shù),記為“;在之后寫入文件系統(tǒng)的描述信息,如FAT表大小及位置、根目錄大小及位置、盤塊大小、盤塊數(shù)量、數(shù)據(jù)區(qū) 開始位置等信息;在引導(dǎo)塊后建立兩張完全一樣的 FAT表,用于記錄文件所占據(jù)的磁盤塊及治理虛擬磁盤塊的分配,每個FAT占據(jù)兩個磁盤塊;對于每個FAT中,前面5個塊設(shè)置為已分配,后面995個塊設(shè)置 為空閑;在第二張F(tuán)

7、AT后創(chuàng)立根目錄文件root,將數(shù)據(jù)區(qū)的第1塊(即虛擬磁盤的第6塊)分配給根目 錄文件,在該磁盤上創(chuàng)立兩個特殊的目錄項:.和“.,其內(nèi)容除了文件名不同之外,其他字 段完全相同.4.更改當(dāng)前目錄函數(shù) my_cd()(1)對應(yīng)命令:my_cd(2)命令調(diào)用格式: my_cddirname(3)函數(shù)設(shè)計格式:voidmy_cd(char*dirname)(4)功能:改變當(dāng)前目錄到指定的名為 dirname的目錄.(5)輸入:dirname:新的當(dāng)前目錄的目錄名;(6)輸出:無歡迎共閱(7)函數(shù)需完成的工作:調(diào)用my_open()fj開指定目錄名的父目錄文件,并調(diào)用 do_read()讀入該父目錄文件

8、內(nèi)容到內(nèi)存1在父目錄文件中檢查新的當(dāng)前目錄名是否存在,如果存在那么轉(zhuǎn),否那么返回,并顯示出錯信息;調(diào)用my_close(大閉中翻開的父目錄文件;調(diào)用my_close(大閉原當(dāng)前目錄文件;如果新的當(dāng)前目錄文件沒有翻開,那么翻開該目錄文件;并將ptrcurdir指向該翻開文件表項;設(shè)置當(dāng)前目錄為該目錄.5.創(chuàng)立子目錄函數(shù) my_mkdir()(1)對應(yīng)命令:my_mkdir(2)命令調(diào)用格式: my_mkdirdirname(3)函數(shù)設(shè)計格式:voidmy_mkdir(char*dirname)(4)功能:在當(dāng)前目錄下創(chuàng)逐名為 dirname的子目錄.(5)輸入:dirname: 新建目錄的目錄名

9、.(6)輸出:無.(7)函數(shù)需完成的工作:調(diào)用do_read()讀入當(dāng)前目錄文件內(nèi)容到內(nèi)存,檢查當(dāng)前目錄下新建目錄文件是否重名,假設(shè)重名 那么返回,并顯示錯誤信息;為新建子目錄文件分配一個空閑翻開文件表項,如果沒有空閑表項那么返回-1,并顯示錯誤信息;檢查FAT是否有空閑的盤塊,如有那么為新建目錄文件分配一個盤塊,否那么釋放中分配的翻開文件表項,返回,并顯示錯誤信息;在當(dāng)前目錄中為新建目錄文件尋找一個空閑的目錄項或為其追加一個新的目錄項;需修改當(dāng)前目錄文件的長度信息,并將當(dāng)前目錄文件的用戶翻開文件表項中的fcbstate置為1;準(zhǔn)備好新建目錄文件的FCB的內(nèi)容,文件的屬性為目錄文件,以覆蓋寫方

10、式調(diào)用do_write()將其填寫到對應(yīng)的空目錄項中;在新建目錄文件所分配到的磁盤塊中建立兩個特殊的目錄項“.和“,目錄項,方法是:首先在用戶空間中準(zhǔn)備好內(nèi)容,然后以截斷寫或者覆蓋寫方式調(diào)用 do_write()將其寫到中分配到的磁 盤塊中; 返回.6 .刪除子目錄函數(shù)rmdir()(1)對應(yīng)命令:my_rmdir(2) 命令調(diào)用格式: my_rmdirdirname(1) 函數(shù)設(shè)計格式:i voidmy_rmdir(char*dirname)(2)功能:在當(dāng)前目錄下刪除名為 dirname的子目錄.(3)輸入:dirname:欲刪除目錄的目錄名.(4)輸出:無.(5)函數(shù)需完成的工作:調(diào)用d

11、o_read()讀入當(dāng)前目錄文件內(nèi)容到內(nèi)存,檢查當(dāng)前目錄下欲刪除目錄文件是否存在,假設(shè)不 存在那么返回,并顯示錯誤信息;檢查欲刪除目錄文件是否為空(除了 “ .和“.外沒有其他子目錄和文件),可根據(jù)其目錄項 中記錄的文件長度來判斷,假設(shè)不為空那么返回,并顯示錯誤信息; 檢查該目錄文件是否已經(jīng)翻開,假設(shè)已翻開那么調(diào)用my_close(大閉掉;回收該目錄文件所占據(jù)的磁盤塊,修改 FAT;從當(dāng)前目錄文件中清空該目錄文件的目錄項,且free字段置為0:以覆蓋寫方式調(diào)用do_write()來實現(xiàn);歡迎共閱修改當(dāng)前目錄文件的用戶翻開表項中的長度信息,并將表項中的fcbstate置為1;返回.7 .顯示目錄

12、函數(shù) my_ls()(1)對應(yīng)命令:my_ls(2)命令調(diào)用格式:my_ls(3)函數(shù)設(shè)計格式:voidmy_ls(void)(4)功能:顯示當(dāng)前目錄的內(nèi)容(子目錄和文件信息).(5)輸入:無(6)輸出:無(7)函數(shù)需完成的工作:調(diào)用do_read()讀出當(dāng)前目錄文件內(nèi)容到內(nèi)存;將讀出的目錄文件的信息根據(jù)一定的格式顯示到屏幕上;返回.8 .創(chuàng)立文件函數(shù)my_create()(1) 對應(yīng)命令: my_create(2)命令調(diào)用格式: my_createfilename(3)函數(shù)設(shè)計格式:intmy_create(char*filename)(4)功能:創(chuàng)立名為filename的新文件.(5)輸入

13、:filename:新建文件的文件名,可能包含路徑.(6)輸出:假設(shè)創(chuàng)立成功,返回該文件的文件描述符(文件翻開表中的數(shù)組下標(biāo));否那么返回-1.(7)函數(shù)需完成的工作:為新文件分配一個空閑翻開文件表項,如果沒有空閑表項那么返回-1,并顯示錯誤信息;假設(shè)新文件的父目錄文件還沒有翻開, 那么調(diào)用my_open(翻開;假設(shè)翻開失敗,那么釋放中為新建文件分配的空閑文件翻開表項,返回-1,并顯示錯誤信息;調(diào)用do_read()讀出該父目錄文件內(nèi)容到內(nèi)存,檢查該目錄下新文件是否重名,假設(shè)重名那么釋放中分配的翻開文件表項,并調(diào)用 my_close(大閉中翻開的目錄文件;然后返回-1,并顯示錯誤信檢查FAT是

14、否有空閑的盤塊,如有那么為新文件分配一個盤塊,否那么釋放中分配的翻開文件表項,并調(diào)用my_close(大閉中翻開的目錄文件;返回-1,并顯示錯誤信息;在父目錄中為示文件尋找一個空閑的目錄項或為其追加一個新的目錄項;需修改該目錄文件的長度信息,并將該目錄文件的用戶翻開文件表項中的fcbstate置為1;準(zhǔn)備好新文件的FCB的內(nèi)容,文件的屬性為數(shù)據(jù)文件,長度為0,以覆蓋寫方式調(diào)用do_write() 將其填寫到中分配到的空目錄項中;1 為新文件填寫中分配到的空閑翻開文件表項,fcbstate字段值為0,讀寫指針值為0;調(diào)用my_close(大閉中翻開的父目錄文件;將新文件而翻開文件表項序號作為其文

15、件描述符返回.9 .刪除文件函數(shù)my_rm()(1)對應(yīng)命令:my_rm(2)命令調(diào)用格式: my_rmfilename(3)函數(shù)設(shè)計格式:voidmy_rm(char*filename)(4)功能:刪除名為filename的文件.(5)輸入:filename:欲刪除文件的文件名,可能還包含路徑.(6)輸出:無.(7)函數(shù)需完成的工作:歡迎共閱假設(shè)欲刪除文件的父目錄文件還沒有翻開,那么調(diào)用my_open(翻開;假設(shè)翻開失敗,那么返回,并顯示錯誤信息;調(diào)用do_read()讀出該父目錄文件內(nèi)容到內(nèi)存,檢查該目錄下欲刪除文件是否存在,假設(shè)不存在那么返回,并顯示錯誤信息;檢查該文件是否已經(jīng)翻開,假設(shè)

16、已翻開那么關(guān)閉掉;回收該文件所占據(jù)的磁盤塊,修改 FAT;從文件的父目錄文件中清空該文件的目錄項,且free字段置為0:以覆蓋寫方式調(diào)用do_write()來實現(xiàn);修改該父目錄文件的用戶翻開文件表項中的長度信息,并將該表項中的fcbstate置為1;返回.10 .翻開文件函數(shù) my_open()(1) 對應(yīng)命令: my_open(2)命令調(diào)用格式: my_openfilename(3)函數(shù)設(shè)計格式:intmy_open(char*filename)(4)功能:翻開當(dāng)前目錄下名為 filename的文件.(5)輸入:filename:欲翻開文件的文件名(6)輸出:假設(shè)翻開成功,返回該文件的描述符

17、(在用戶翻開文件表中表項序號);否那么返回-1.(7)函數(shù)需完成的工作:檢查該文件是否已經(jīng)翻開,假設(shè)已翻開那么返回-1,并顯示錯誤信息;調(diào)用do_read()讀出父目錄文件的內(nèi)容到內(nèi)存,檢查該目錄下欲翻開文件是否存在,假設(shè)不存在那么返回-1,扉顯示錯誤信息;檢查用戶翻開文件表中是否有空表項,假設(shè)有那么為欲翻開文件分配一個空表項,假設(shè)沒有那么返回 -1,并顯示錯誤信息;為該文件填寫空白用戶翻開文件表表項內(nèi)容,讀寫指針置為0;將該文件所分配到的空白用戶翻開文件表表項序號(數(shù)組下標(biāo))作為文件描述符fd返回.11 .關(guān)閉文件函數(shù)my_close()(1)對應(yīng)命令: my_close(2)命令調(diào)用格式:

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

19、作),并將topenfile字段置為0;返回.12 .寫文件函數(shù) my_write()(1)對應(yīng)命令:my_write(2)命令調(diào)用格式: my_writefd(3)函數(shù)設(shè)計格式:intmy_write(intfd)(4)功能:將用戶通過鍵盤輸入的內(nèi)容寫到fd所指定的文件中.磁盤文件的讀寫操作都必須以完 整的數(shù)據(jù)塊為單位進(jìn)行,在寫操作時,先將數(shù)據(jù)寫在緩沖區(qū)中,緩沖區(qū)的大小與磁盤塊的大小相歡迎共閱同,然后再將緩沖區(qū)中的數(shù)據(jù)一次性寫到磁盤塊中;讀出時先將一個磁盤塊中的內(nèi)容讀到緩沖區(qū) 中,然后再傳送到用戶區(qū).本實例為了簡便起見,沒有設(shè)置緩沖區(qū)治理,只是在讀寫文件時由用 戶使用malloc()申請一塊

20、空間作為緩沖區(qū),讀寫操作結(jié)束后使用 free()釋放掉.寫操作常有三種方式:截斷寫、覆蓋寫和追加寫.截斷寫是放棄原來文件的內(nèi)容,重新寫文件;覆蓋寫是修改文件在當(dāng)前讀寫指針?biāo)傅奈恢瞄_始的局部內(nèi)容;追加寫是在原文件的最后添加新 的內(nèi)容.在本實例中,輸入寫文件命令后,系統(tǒng)會出現(xiàn)提示讓用戶選擇其中的一種寫方式,并將 隨后鍵盤輸入的內(nèi)容根據(jù)所選的方式寫到文件中,鍵盤輸入內(nèi)容通過CTR+Z鍵(或其他設(shè)定的鍵)結(jié)束.(5)輸入:fd: open()函數(shù)的返回值,文件的描述符;(6)輸出:實際寫入的字節(jié)數(shù).(7)函數(shù)需完成的工作:檢查fd的有效性(fd不能超出用戶翻開文件表所在數(shù)組的最大下標(biāo)),如果無效那么

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

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

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

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

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

26、d的有效性(fd不能超出用戶翻開文件表所在數(shù)組的最大下標(biāo)),如果無效那么返回-1,并顯示出錯信息;調(diào)用do_read()將指定文件中的len字節(jié)內(nèi)容讀出到text口中;如果do_read()的返回值為負(fù),那么顯示出錯信息;否那么將 text口中的內(nèi)容顯示到屏幕上;返回.15 .實際讀文件函數(shù)do_read()(1)對應(yīng)命令:無(2)命令調(diào)用格式:無(3)函數(shù)設(shè)計格式:intdo_read(intfd,intlen,char*text)(4)功能:被my_read()調(diào)用,讀出指定文件中從讀寫指針開始的長度為len的內(nèi)容到用戶空間的text中.(5)輸入:fd: open()函數(shù)的返回值,文件的

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

28、口中;否那么,將從off開始的buf中的剩余內(nèi)容讀入 至 ij text口中;將讀寫指針增加中已讀字節(jié)數(shù),將應(yīng)讀寫的字節(jié)數(shù)len減去中已讀字節(jié)數(shù),假設(shè)len大于0,那么轉(zhuǎn);否那么轉(zhuǎn);歡迎共閱使用free()釋放中申請的buf返回實際讀出的字節(jié)數(shù).16 .退出文件系統(tǒng)函數(shù)my_exitsys()(1)對應(yīng)命令: my_exitsys(2)命令調(diào)用格式: my_exitsys(1)函數(shù)設(shè)計格式:voidmy_exitsys()(2)功能:退出文件系統(tǒng).一(3)輸入:無(4)輸出:無.(5)函數(shù)需完成的工作:使用C庫函數(shù)fopen()f丁開磁盤上的myfsys文件;將虛擬磁盤空間中的所有內(nèi)容保存到磁

29、盤上的myfsys文件中;使用c語言的庫函數(shù)fclose(內(nèi)5 myfsys文件;撤銷用戶翻開文件表,釋放其內(nèi)存空間釋放虛擬磁盤空間.流程圖程序啟動加載文件系統(tǒng)my exitsys是一/文件系X-否統(tǒng)是否 -等待用戶命令輸入創(chuàng)立文件系統(tǒng),并格式化my_ls my creat my_rm | myooen =三、程序?qū)崿F(xiàn)代碼: «入命令 )#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#defineBLOCKSIZE1024 磁盤塊大小#defin

30、eSIZE1024000虛擬磁盤空間大小#defineEND65535/FAT中的文件結(jié)束標(biāo)志# defineFREE0FA1中盤塊空閑標(biāo)志# defineROOTBLOCKNUM2根目錄區(qū)所占盤塊數(shù)# defineMAXOPENFILE10最多同時翻開文件個數(shù) t #defineMAXTEXT10000/*文件限制塊*/typedefstructFCBcharfilename8;/Dt 件名charexname3;/收件擴(kuò)展名unsignedcharattribute;/以件屬性字段,值為0時表示目錄文件,值為1時表示數(shù)據(jù)文件unsignedshorttime;欣件倉1J建時間unsigne

31、dshortdate濃件創(chuàng)立 日 期unsignedshortfirst;欣件起始盤塊號unsignedlonglength;放件長度charfree;表示目錄項是否為空,假設(shè)值為 0,表示空,值為1,表示已分配歡迎共閱fcb;/*文件分配表*/typedefstructFAT(unsignedshortid;假盤塊的狀態(tài)(空閑的,最后的,下一個)fat;/*用戶翻開文件表*/typedefstructUSEROPEN(charfilename8;/Dt 件名charexname3;/收件擴(kuò)展名unsignedcharattribute;/以件屬性字段,值為0時表示目錄文件,值為1時表示數(shù)據(jù)文

32、件unsignedshorttime;/件倉1J 建時間unsignedshortdate;/t 件創(chuàng)立 日 期unsignedshortfirst;欣件起始盤塊號unsignedlonglength;放件長度(對數(shù)據(jù)文件是字節(jié)數(shù),對目錄文件可以是目錄項個數(shù))charfree;/表示目錄項是否為空,假設(shè)值為 0,表示空,值為1,表示已分配unsignedshortdirno;/1應(yīng)翻開文件的目錄項在父目錄文件中的盤塊號intdiroff;/相應(yīng)翻開文件的目錄項在父目錄文件的dirno盤塊中的目錄項序號chardir80;/相應(yīng)翻開文件所在的路徑名,這樣方便快速檢查出指定文件是否已經(jīng)翻開intf

33、ather;/父目錄在翻開文件表項的位置intcount;/讀寫指針在文件中的位置,文件的總字符數(shù)charfcbstate;/是否修改了文件的FCB的內(nèi)容,如果修改了置為1,否那么為0chartopenfile;/俵示該用戶翻開表項是否為空,假設(shè)值為 0,表示為空,否那么表示已被某翻開文件占 據(jù)useropen;/*引導(dǎo)其*/typedefstructBLOCK0(charmagic10;/儀件系統(tǒng)魔數(shù)charinformation200;/存儲一些描述信息,如磁盤塊大小、磁盤塊數(shù)量、最多翻開文件數(shù)等unsignedshortroot潸艮目錄文件的起始盤塊號unsignedchar*start

34、block;/虛擬磁盤上數(shù)據(jù)區(qū)開始位置block0;unsignedchar*myvhard;/件旨向虛擬磁盤的起始地址useropenopenfilelistMAXOPENFILE;/ 用戶翻開文件表數(shù)組intcurdir;用戶翻開文件表中的當(dāng)前目錄所在翻開文件表項的位置charcurrentdir80;/記錄當(dāng)前目錄的目錄名(包括目錄的路徑)unsignedchar*startp;/妃錄虛擬磁盤上數(shù)據(jù)區(qū)開始位置charmyfilename口uUmyAlesys"/文件系統(tǒng)的文件名voidstartsys();/進(jìn)入文件系統(tǒng)voidmy_format();/ 磁盤格式化voidmy

35、_cd(char*dirname);/更改當(dāng)前 目 錄voidmy_mkdir(char*dirname);/ 倉建子 目 錄voidmy_rmdir(char*dirname);/ 刪除子 目錄voidmy_ls();/顯示目錄voidmy_create(char*filename);/創(chuàng)立文件歡迎共閱voidmy_rm(char*filename);刪除文件 intmy_open(char*filename);/打 開文件 intmy_close(intfd);/厭閉文件 intmy_write(intfd);/ 寫文件 intdo_write(intfd,char*text,intlen

36、,charwstyle);/實際寫文件 intmy_read(intfd,intlen);/ 讀文件 intdo_read(intfd,intlen,char*text);/實際讀文件 voidmy_exitsys();/退出文件系統(tǒng) unsignedshortfindblock();/&找空閑盤塊 intfindopenfile();/尋找空閑文件表項 voidstartsys()FILE*fp;unsignedcharbufSIZE;fcb*root; inti;myvhard=(unsignedchar*)malloc(SIZE);/ 申請?zhí)摂M磁盤空間 memset(myvhar

37、d,0,SIZE);/將 myvhard 中前 SIZE 個字節(jié)用 0 替換并返回 myvhard if(fp=fopen(myfilename,"r")!=NULL) fread(buf,SIZE,1,fp);/將二進(jìn)制文件讀取到緩沖區(qū)_ 二,fclose(fp); printf("myfilesysisnotexist,begintocreatthefile.n"); my_format(); else for(i=0;i<SIZE;i+) myvhardi=bufi; else printf("myfilesysisnotexist

38、,begintocreatthefile.n"); my_format(); 一 root=(fcb*)(myvhard+5*BLOCKSIZE); strcpy(openfilelist0.filename,root->filename); strcpy(openfilelist0.exname,root->exname); openfilelist0.attribute=root->attribute; openfilelist0.time=root->time; openfilelist0.date=root->date; openfilelist

39、0.first=root->first; 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<MAX

40、OPENFILE;i+)openfilelisti.topenfile=0;curdir=0;strcpy(currentdir,"root");startp=(block0*)myvhard)->startblock;voidmy_format()FILE*fp;fat*fat1,*fat2;block0*blk0;time_tnow;structtm*nowtime;fcb*root;inti;blk0=(block0*)myvhard;fat1=(fat*)(myvhard+BLOCKSIZE);fat2=(fat*)(myvhard+3*BLOCKSIZE);

41、root=(fcb*)(myvhard+5*BLOCKSIZE);strcpy(blk0->information,"MyFileSystemVer1.0nBlocksize=1KBWholesize=1000KBBlocknum=10 00RootBlocknum=2n");blk0->root=5;blk0->startblock=(unsignedchar*)root;for(i=0;i<5;i+)fat1->id=END;fat2->id=END;一.ifat1+;fat2+;fat1->id=6;fat2->id=6

42、;fat1+;fat2+;fat1->id=END;fat2->id=END;fat1+;fat2+;for(i=7;i<SIZE/BLOCKSIZE;i+)fat1->id=FREE;歡迎共閱fat2->id=FREE;fat1+;fat2+;now=time(NULL);nowtime=localtime(&now);strcpy(root->filename,".");strcpy(root->exname,"");root->attribute=0x28;root->time=nowt

43、ime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;root->date=(nowtime->tm_year-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday;root->first=5;root->length=2*sizeof(fcb);root->free=1; I zroot+;now=time(NULL);nowtime=localtime(&now);strcpy(root->filename,"

44、.");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+nowtime->tm_mday;root->first=5;root->length=2*sizeof(fcb);root->fre

45、e=1;fp=fopen(myfilename,"w");fwrite(myvhard,SIZE,1,fp);fclose(fp);voidmy_cd(char*dirname)char*dir;intfd;dir=strtok(dirname,"");/分解字符串為一組字符串.dirname為要分解的字符串,""為分隔符字符串if(strcmp(dir,".")=0)return;elseif(strcmp(dir,".")=0)if(curdir)curdir=my_close(curdir

46、);return;elseif(strcmp(dir,"root")=0)while(curdir)curdir=my_close(curdir);歡迎共閱dir=strtok(NULL,"");while(dir)(fd=my_open(dir);if(fd!=-1)curdir=fd;elsereturn;dir=strtok(NULL,"");voidmy_mkdir(char*dirname)(fcb*fcbptr;fat*fat1,*fat2;time_tnow;structtm*nowtime;chartextMAXTEX

47、T;unsignedshortblkno;intrbn,fd,i;fat1=(fat*)(myvhard+BLOCKSIZE);fat2=(fat*)(myvhard+3*BLOCKSIZE);openfilelistcurdir.count=0;rbn=do_read(curdir,openfilelistcurdir.length,text);fcbptr=(fcb*)text;for(i=0;i<rbn/sizeof(fcb);i+)在當(dāng)前目錄下找,是否有重名目錄if(strcmp(fcbptr->filename,dirname)=0&&strcmp(fcb

48、ptr->exname,"")=0)(printf("Error,thedirnameisalreadyexist!n");return;fcbptr+;fcbptr=(fcb*)text;for(i=0;i<rbn/sizeof(fcb);i+)(if(fcbptr->free=0)break;fcbptr+;blkno=findblock();/尋找空閑盤塊if(blkno=-1)return;(fat1+blkno)->id=END;(fat2+blkno)->id=END;歡迎共閱now=time(NULL);now

49、time=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

50、;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 開始寫一個 fcb 大小的內(nèi)容到當(dāng)前目錄fd=my_open(dirname);返回新建立的目錄文件在用戶翻開文件數(shù)組的下標(biāo)if(fd=-1)return;fcbptr=(fcb*)malloc(sizeof(fcb);魁

51、立新目錄的'.','.'目錄now=time(NULL);nowtime=localtime(&now);strcpy(fcbptr->filename,".");strcpy(fcbptr->exname,"");fcbptr->attribute=0x28;fcbptr->time=nowtime->tm_hour*2048+nowtime->tm_min*32+nowtime->tm_sec/2;fcbptr->date=(nowtime->tm_year

52、-80)*512+(nowtime->tm_mon+1)*32+nowtime->tm_mday;fcbptr->first=blkno;fcbptr->length=2*sizeof(fcb);fcbptr->free=1;do_write(fd,(char*)fcbptr,sizeof(fcb),2);now=time(NULL);nowtime=localtime(&now);strcpy(fcbptr->filename,".");strcpy(fcbptr->exname,"");fcbptr-

53、>attribute=0x28;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;do_write(fd,(char*)fcbptr,sizeof(

54、fcb),2);free(fcbptr);my_close(fd);fcbptr=(fcb*)text;fcbptr->length=openfilelistcurdir.length;openfilelistcurdir.count=0;do_write(curdir,(char*)fcbptr,sizeof(fcb),2);更新當(dāng)前目錄文件的內(nèi)容openfilelistcurdir.fcbstate=1;歡迎共閱voidmy_rmdir(char*dirname)( 一fcb*fcbptr,*fcbptr2;fat*fat1,*fat2,*fatptr1,*fatptr2;chart

55、extMAXTEXT,text2MAXTEXT;unsignedshortblkno;intrbn,rbn2,fd,i,j;fat1=(fat*)(myvhard+BLOCKSIZE);fat2=(fat*)(myvhard+3*BLOCKSIZE);if(strcmp(dirname,".")=0|strcmp(dirname,".")=0)(printf("Error,can'tremovethisdirectory.n");return; I Xopenfilelistcurdir.count=0;rbn=do_read

56、(curdir,openfilelistcurdir.length,text);fcbptr=(fcb*)text;for(i=0;i<rbn/sizeof(fcb);i+)/查找要刪除的目錄(if(strcmp(fcbptr->filename,dirname)=0&&strcmp(fcbptr->exname,"")=0)break;fcbptr+;if(i=rbn/sizeof(fcb)(printf("Error,thedirectoryisnotexist.n");return;fd=my_open(dirna

57、me);目錄在當(dāng)前翻開文件數(shù)組中的下標(biāo)rbn2=do_read(fd,openfilelistfd.length,text2);做取要刪除的目錄的內(nèi)容fcbptr2=(fcb*)text2;for(j=0;j<rbn2/sizeof(fcb);j+)/判斷要刪除目錄是否為空(if(strcmp(fcbptr2->filename,".")&&strcmp(fcbptr2->filename,".")&&strcmp(fcbptr2->filename,")(my_close(fd);printf("Error,thedirectoryisnotempty.n");return;fcbptr2+;blkno=openfilelistfd.first;while(blkno!=END)修改要刪除目錄在fat中所占用的目錄項的屬性(fatptr1=fat1+blkno;fatptr2=fa

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論