版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、標(biāo)準(zhǔn)文檔操作系統(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)行格式化,即按照文件系統(tǒng)的結(jié)構(gòu)對虛擬磁盤空間進(jìn)行布局,并在其上創(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è)計格式:void main()(4)功能:系統(tǒng)主函數(shù)(5)輸入:無(6)輸出:無(7)函數(shù)需完成的工作:對前面定義的全局變量進(jìn)行初始化;調(diào)用startsys(優(yōu)入文件系統(tǒng);實用文案標(biāo)準(zhǔn)文檔列出文件系統(tǒng)提供的各項功能及命令調(diào)用格式; 顯示命令行提示符,等待用戶輸入命令;將用戶輸入的命令保存到一個buf中; 對buf中的內(nèi)容進(jìn)行命令解析,并調(diào)用相應(yīng)的函數(shù)執(zhí)行用戶鍵入的命令; 如果命令不是“ my_exitsys",
4、則命令執(zhí)行完畢后轉(zhuǎn)。2.進(jìn)入文件系統(tǒng)函數(shù) startsys()(1)對應(yīng)命令:無(2)命令調(diào)用格式:無3 3)函數(shù)設(shè)計格式:void startsys()(4)功能:由main()函數(shù)調(diào)用,進(jìn)入并初始化我們所建立的文件系統(tǒng),以供用戶使用。(5)輸入:無(6)輸出:無。(7)函數(shù)需完成的工作:申請?zhí)摂M磁盤空間; 使用c語言的庫函數(shù)fopen()打開myfsys文件:若文件存在,則轉(zhuǎn);若文件不存在, 則創(chuàng)建之,轉(zhuǎn)使用c語言的庫函數(shù)fread()讀入myfsys文件內(nèi)容到用戶空間中的一個緩沖區(qū)中,并判 斷其開始的8個字節(jié)內(nèi)容是否為“ 10101010”(文件系統(tǒng)魔數(shù)),如果是,則轉(zhuǎn);否則轉(zhuǎn) ; 將上
5、述緩沖區(qū)中的內(nèi)容復(fù)制到內(nèi)存中的虛擬磁盤空間中;轉(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(肉3! myfsys文件; 初始化用戶打開文件表,將表項0分配給根目錄文件使用,并填寫根目錄文件的相關(guān)信息,由于根目錄沒有上級目錄,所以表項中的dirno和diroff分別置為5 (根目錄所在起始塊號)和0;并將ptrcurdir指針指向該用戶打開文件表項。將當(dāng)前目錄設(shè)置為根目錄。3.磁盤格式化函數(shù) my_format(
6、)(1)對應(yīng)命令: my_format(2)命令調(diào)用格式:my_format3 3)函數(shù)設(shè)計格式:void my_format()(4)功能:對虛擬磁盤進(jìn)行格式化,布局虛擬磁盤,建立根目錄文件(或根目錄區(qū))(5)輸入:無(6)輸出:無。 將虛擬磁盤第一個塊作為引導(dǎo)塊, 在之后寫入文件系統(tǒng)的描述信息,如 盤塊數(shù)量、數(shù)據(jù)區(qū)開始位置等信息; 在引導(dǎo)塊后建立兩張完全一樣的(7)函數(shù)需完成的工作:開始的8個字節(jié)是文件系統(tǒng)的魔數(shù),記為“10101010”;FAT表大小及位置、根目錄大小及位置、盤塊大小、FAT表,用于記錄文件所占據(jù)的磁盤塊及管理虛擬磁盤塊的分配,每個 FAT占據(jù)兩個磁盤塊;對于每個FAT中
7、,前面5個塊設(shè)置為已分配,后面995個塊設(shè)置為空閑; 在第二張F(tuán)AT后創(chuàng)建根目錄文件 root,將數(shù)據(jù)區(qū)的第1塊(即虛擬磁盤的第 6塊)分配給根目錄文件,在該磁盤上創(chuàng)建兩個特殊的目錄項:".”和“.”,其內(nèi)容除了文件名不同之實用文案標(biāo)準(zhǔn)文檔外,其他字段完全相同。4.更改當(dāng)前目錄函數(shù) my_cd()(1)對應(yīng)命令: my_cd(2)命令調(diào)用格式:my_cd dirname(3)函數(shù)設(shè)計格式:void my_cd(char *dirname)(4)功能:改變當(dāng)前目錄到指定的名為dirname的目錄。(5)輸入:dirname :新的當(dāng)前目錄的目錄名;(6)輸出:無(7)函數(shù)需完成的工作:
8、 調(diào)用my_open()打開指定目錄名的父目錄文件,并調(diào)用do_read()讀入該父目錄文件內(nèi)容到內(nèi)存中; 在父目錄文件中檢查新的當(dāng)前目錄名是否存在,如果存在則轉(zhuǎn),否則返回,并顯示出錯信息;調(diào)用my_close()關(guān)閉中打開的父目錄文件;調(diào)用my_close()關(guān)閉原當(dāng)前目錄文件; 如果新的當(dāng)前目錄文件沒有打開,則打開該目錄文件;并將 ptrcurdir指向該打開文件 表項;設(shè)置當(dāng)前目錄為該目錄。5 .創(chuàng)建子目錄函數(shù) my_mkdir()(1)對應(yīng)命令: my_mkdir(2)命令調(diào)用格式:my_ mkdir dirname(3)函數(shù)設(shè)計格式:void my_mkdir(char *dirna
9、me)(4)功能:在當(dāng)前目錄下創(chuàng)建名為dirname的子目錄。(5)輸入:dirname : 新建目錄的目錄名。(6)輸出:無。(7)函數(shù)需完成的工作: 調(diào)用do_read()讀入當(dāng)前目錄文件內(nèi)容到內(nèi)存,檢查當(dāng)前目錄下新建目錄文件是否重名, 若重名則返回,并顯示錯誤信息; 為新建子目錄文件分配一個空閑打開文件表項,如果沒有空閑表項則返回-1,并顯示錯誤信息; 檢查FAT是否有空閑的盤塊,如有則為新建目錄文件分配一個盤塊,否則釋放中分配的打開文件表項,返回,并顯示錯誤信息; 在當(dāng)前目錄中為新建目錄文件尋找一個空閑的目錄項或為其追加一個新的目錄項;需修改當(dāng)前目錄文件的長度信息,并將當(dāng)前目錄文件的用
10、戶打開文件表項中的fcbstate置為1; 準(zhǔn)備好新建目錄文件的 FCB的內(nèi)容,文件的屬性為目錄文件,以覆蓋寫方式調(diào)用 do_write()將其填寫至U對應(yīng)的空目錄項中; 在新建目錄文件所分配到的磁盤塊中建立兩個特殊的目錄項".”和“.”目錄項,方法是:首先在用戶空間中準(zhǔn)備好內(nèi)容, 然后以截斷寫或者覆蓋寫方式調(diào)用do_write()將其寫到中分配到的磁盤塊中;返回。6 .刪除子目錄函數(shù) rmdir()(1)對應(yīng)命令: my_ rmdir實用文案標(biāo)準(zhǔn)文檔(2)命令調(diào)用格式:my_ rmdir dirname(1)函數(shù)設(shè)計格式:void my_rmdir(char *dirname)(2
11、)功能:在當(dāng)前目錄下刪除名為dirname的子目錄。(3)輸入:dirname :欲刪除目錄的目錄名。(4)輸出:無。(5)函數(shù)需完成的工作: 調(diào)用do_read()讀入當(dāng)前目錄文件內(nèi)容到內(nèi)存,檢查當(dāng)前目錄下欲刪除目錄文件是否存 在,若不存在則返回,并顯示錯誤信息; 檢查欲刪除目錄文件是否為空(除了 “.”和“.”外沒有其他子目錄和文件),可根據(jù)其目錄項中記錄的文件長度來判斷,若不為空則返回,并顯示錯誤信息; 檢查該目錄文件是否已經(jīng)打開,若已打開則調(diào)用my_close()關(guān)閉掉; 回收該目錄文件所占據(jù)的磁盤塊,修改FAT;從當(dāng)前目錄文件中清空該目錄文件的目錄項,且 free字段置為0:以覆蓋寫
12、方式調(diào)用 do_write()來實現(xiàn); 修改當(dāng)前目錄文件的用戶打開表項中的長度信息,并將表項中的 fcbstate置為1;返回。7 .顯示目錄函數(shù) my_ls()(1)對應(yīng)命令: my_ls(2)命令調(diào)用格式:my_ls(3)函數(shù)設(shè)計格式:void my_ls(void)(4)功能:顯示當(dāng)前目錄的內(nèi)容(子目錄和文件信息)。(5)輸入:無(6)輸出:無(7)函數(shù)需完成的工作: 調(diào)用do_read()讀出當(dāng)前目錄文件內(nèi)容到內(nèi)存; 將讀出的目錄文件的信息按照一定的格式顯示到屏幕上;返回。8 .創(chuàng)建文件函數(shù) my_create()(1)對應(yīng)命令: my_create(2)命令調(diào)用格式:my_creat
13、e filename(3)函數(shù)設(shè)計格式:int my_create (char *filename)(4)功能:創(chuàng)建名為 filename的新文件。(5)輸入:filename:新建文件的文件名,可能包含路徑。(6)輸出:若創(chuàng)建成功,返回該文件的文件描述符(文件打開表中的數(shù)組下標(biāo));否則返回-1。(7)函數(shù)需完成的工作:為新文件分配一個空閑打開文件表項,如果沒有空閑表項則返回-1,并顯示錯誤信息; 若新文件的父目錄文件還沒有打開,則調(diào)用 my_open()打開;若打開失敗,則釋放中 為新建文件分配的空閑文件打開表項,返回 -1,并顯示錯誤信息; 調(diào)用do_read()讀出該父目錄文件內(nèi)容到內(nèi)存
14、, 檢查該目錄下新文件是否重名, 若重名則 釋放中分配的打開文件表項,并調(diào)用my_close(慶閉中打開的目錄文件;然后返回 -1,并顯示錯誤信息;實用文案標(biāo)準(zhǔn)文檔檢查FAT是否有空閑的盤塊,如有則為新文件分配一個盤塊,否則釋放中分配的打開文件表項,并調(diào)用 my_close()關(guān)閉中打開的目錄文件;返回 -1,并顯示錯誤信息; 在父目錄中為新文件尋找一個空閑的目錄項或為其追加一個新的目錄項;需修改該目錄文件的長度信息,并將該目錄文件的用戶打開文件表項中的fcbstate置為1; 準(zhǔn)備好新文件的FCB的內(nèi)容,文件的屬性為數(shù)據(jù)文件,長度為 0,以覆蓋寫方式調(diào)用do_write()將其填寫至ij中分
15、配至ij的空目錄項中; 為新文件填寫中分配到的空閑打開文件表項,fcbstate字段值為0,讀寫指針值為0;調(diào)用my_close()關(guān)閉中打開的父目錄文件;將新文件的打開文件表項序號作為其文件描述符返回。9 .刪除文件函數(shù) my_rm()(1)對應(yīng)命令: my_rm(2)命令調(diào)用格式:my_rm filename(3)函數(shù)設(shè)計格式: void my_rm(char *filename)(4)功能:刪除名為 filename的文件。(5)輸入:filename:欲刪除文件的文件名,可能還包含路徑。(6)輸出:無。(7)函數(shù)需完成的工作: 若欲刪除文件的父目錄文件還沒有打開,則調(diào)用my_open(
16、)打開;若打開失敗,則返回,并顯示錯誤信息; 調(diào)用do_read()讀出該父目錄文件內(nèi)容到內(nèi)存,檢查該目錄下欲刪除文件是否存在,若不存在則返回,并顯示錯誤信息; 檢查該文件是否已經(jīng)打開,若已打開則關(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_open filename(3)函數(shù)設(shè)計格式:int m
17、y_open(char *filename)(4)功能:打開當(dāng)前目錄下名為filename的文件。(5)輸入:filename:欲打開文件的文件名(6)輸出:若打開成功,返回該文件的描述符(在用戶打開文件表中表項序號);否則返回-1。(7)函數(shù)需完成的工作: 檢查該文件是否已經(jīng)打開,若已打開則返回-1,并顯示錯誤信息; 調(diào)用do_read()讀出父目錄文件的內(nèi)容到內(nèi)存,檢查該目錄下欲打開文件是否存在,若不存在則返回-1,并顯示錯誤信息;檢查用戶打開文件表中是否有空表項,若有則為欲打開文件分配一個空表項,若沒有則返回-1,并顯示錯誤信息; 為該文件填寫空白用戶打開文件表表項內(nèi)容,讀寫指針置為0;
18、實用文案標(biāo)準(zhǔn)文檔將該文件所分配到的空白用戶打開文件表表項序號(數(shù)組下標(biāo))作為文件描述符fd返回。11.關(guān)閉文件函數(shù) my_close()(1)對應(yīng)命令:my_close(2)命令調(diào)用格式:my_close fd3 3)函數(shù)設(shè)計格式: void my_close(int fd)(4)功能:關(guān)閉前面由 my_open()打開的文件描述符為 fd的文件。(5)輸入:fd:文件描述符。(6)輸出:無。(7)函數(shù)需完成的工作:檢查fd的有效性(fd不能超出用戶打開文件表所在數(shù)組的最大下標(biāo)),如果無效則返回-1 ; 檢查用戶打開文彳表表項中的fcbstate字段的值,如果為1則需要將該文件的 FCB的內(nèi)容
19、保存到虛擬磁盤上該文件的目錄項中,方法是:打開該文件的父目錄文件,以覆蓋寫方 式調(diào)用do_write()將欲關(guān)閉文件的 FCB寫入父目錄文件的相應(yīng)盤塊中;回收該文件占據(jù)的用戶打開文件表表項(進(jìn)行清空操作),并將topenfile字段置為0;返回。12.寫文件函數(shù) my_write()(1)對應(yīng)命令:my_write(2)命令調(diào)用格式:my_write fd3 3)函數(shù)設(shè)計格式:int my_write(int fd)(4)功能:將用戶通過鍵盤輸入的內(nèi)容寫到fd所指定的文件中。 磁盤文件的讀寫操作都必須以完整的數(shù)據(jù)塊為單位進(jìn)行,在寫操作時,先將數(shù)據(jù)寫在緩沖區(qū)中,緩沖區(qū)的大小與磁 盤塊的大小相同,
20、然后再將緩沖區(qū)中的數(shù)據(jù)一次性寫到磁盤塊中;讀出時先將一個磁盤塊 中的內(nèi)容讀到緩沖區(qū)中,然后再傳送到用戶區(qū)。本實例為了簡便起見,沒有設(shè)置緩沖區(qū)管理,只是在讀寫文件時由用戶使用malloc()申請一塊空間作為緩沖區(qū),讀寫操作結(jié)束后使用free()釋放掉。寫操作常有三種方式:截斷寫、覆蓋寫和追加寫。截斷寫是放棄原來文件的內(nèi)容,重新寫 文件;覆蓋寫是修改文件在當(dāng)前讀寫指針?biāo)傅奈恢瞄_始的部分內(nèi)容;追加寫是在原文件 的最后添加新的內(nèi)容。在本實例中,輸入寫文件命令后,系統(tǒng)會出現(xiàn)提示讓用戶選擇其中 的一種寫方式,并將隨后鍵盤輸入的內(nèi)容按照所選的方式寫到文件中,鍵盤輸入內(nèi)容通過 CTR+Z鍵(或其他設(shè)定的鍵)
21、結(jié)束。(5)輸入:fd : open()函數(shù)的返回值,文件的描述符;(6)輸出:實際寫入的字節(jié)數(shù)。(7)函數(shù)需完成的工作:檢查fd的有效性(fd不能超出用戶打開文件表所在數(shù)組的最大下標(biāo)),如果無效則返回-1,并顯示出錯信息; 提示并等待用戶輸入寫方式:(1:截斷寫;2:覆蓋寫;3:追加寫)如果用戶要求的寫方式是截斷寫,則釋放文件除第一塊外的其他磁盤空間內(nèi)容(查找并修改FAT表),將內(nèi)存用戶打開文件表項中文件長度修改為0,將讀寫指針置為 0并轉(zhuǎn);如果用戶要求的寫方式是追加寫,則修改文件的當(dāng)前讀寫指針位置到文件的末尾,并轉(zhuǎn); 如果寫方式是覆蓋寫,則直接轉(zhuǎn); 提示用戶:整個輸入內(nèi)容通過CTR+Z鍵(
22、或其他設(shè)定的鍵)結(jié)束;用戶可分多次輸入實用文案標(biāo)準(zhǔn)文檔寫入內(nèi)容,每次用回車結(jié)束; 等待用戶從鍵盤輸入文件內(nèi)容,并將用戶的本次輸入內(nèi)容保存到一臨時變量text口中,要求每次輸入以回車結(jié)束,全部結(jié)束用 CTR+Z鍵(或其他設(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)前讀寫指針位置大于用戶打開文件表項中的文件長度,則修改打開文件表項中的文件長度信息,并將 fc
23、bstate置1;返回實際寫入的字節(jié)數(shù)。13.實際寫文件函數(shù) do_write()(1)對應(yīng)命令:無(2)命令調(diào)用格式:無(3)函數(shù)設(shè)計格式:int my_write(int fd , char *text , int len, char wstyle)(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)存空間作為讀寫磁盤的緩沖
24、區(qū)buf,申請失敗則返回-1,并顯示出錯信息; 將讀寫指針轉(zhuǎn)化為邏輯塊塊號和塊內(nèi)偏移off,并利用打開文件表表項中的首塊號及 FAT表的相關(guān)內(nèi)容將邏輯塊塊號轉(zhuǎn)換成對應(yīng)的磁盤塊塊號blkno;如果找不到對應(yīng)的磁盤塊, 則需要檢索FAT為該邏輯塊分配一新的磁盤塊, 并將對應(yīng)的磁盤塊塊號 blkno登記到FAT中, 若分配失敗,則返回-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é)開始的位置
25、,直到緩沖區(qū)滿,或者接收到結(jié)束字符 CTR+Z為止;將本次寫入字節(jié)數(shù)記錄到tmplen中; 將buf中1024B的內(nèi)容寫入到塊號為blkno的虛擬磁盤塊中;將當(dāng)前讀寫指針修改為原來的值加上tmplen ;并將本次實際寫入的字節(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_read fd len(3)函數(shù)設(shè)計格式:int myread (int fd, int len)(4)功能:讀出指定文件中從讀寫指針開始的長度為len的內(nèi)容到用戶空間中。(5)輸
26、入:fd:open()函數(shù)的返回值,文件的描述符;len:要從文件中讀出的字節(jié)數(shù)。實用文案標(biāo)準(zhǔn)文檔(6)輸出:實際讀出的字節(jié)數(shù)。(7)函數(shù)需完成的工作:定義一個字符型數(shù)組 textlen,用來接收用戶從文件中讀出的文件內(nèi)容;檢查fd的有效性(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 3)函數(shù)設(shè)計格式:i
27、nt do_read (int fd, int len,char *text)(4)功能:被 my_read()調(diào)用,讀出指定文件中從讀寫指針開始的長度為len的內(nèi)容到用戶空間的text中。(5)輸入:fd:open()函數(shù)的返回值,文件的描述符;len:要求從文件中讀出的字節(jié)數(shù)。text:指向存放讀出數(shù)據(jù)的用戶區(qū)地址(6)輸出:實際讀出的字節(jié)數(shù)。(7)函數(shù)需完成的工作: 使用malloc()申請1024B空間作為緩沖區(qū) buf,申請失敗則返回-1,并顯示出錯信息; 將讀寫指針轉(zhuǎn)化為邏輯塊塊號及塊內(nèi)偏移量off,利用打開文件表表項中的首塊號查找FAT表,找到該邏輯塊所在的磁盤塊塊號;將該磁盤塊
28、塊號轉(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口中;否則,將從 off開始的buf中的 剩余內(nèi)容讀入到 text口中; 將讀寫指針增加中已讀字節(jié)數(shù),將應(yīng)讀寫的字節(jié)數(shù)len減去中已讀字節(jié)數(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_ exits
29、ys(1)函數(shù)設(shè)計格式: void my_exitsys()(2)功能:退出文件系統(tǒng)。(3)輸入:無(4)輸出:無。(5)函數(shù)需完成的工作: 使用C庫函數(shù)fopen()打開磁盤上的 myfsys文件;將虛擬磁盤空間中的所有內(nèi)容保存到磁盤上的myfsys文件中; 使用c語言的庫函數(shù)fclose(肉3! myfsys文件; 撤銷用戶打開文件表,釋放其內(nèi)存空間釋放虛擬磁盤空間。實用文案標(biāo)準(zhǔn)文檔流程圖程序啟動用戶輸入 命令my lsmy createmy_rmmy_openmy_exitsys三、程序?qū)崿F(xiàn)代碼:#include <stdio.h>#include <stdlib.h&
30、gt;#include <string.h>#include <time.h>實用文案標(biāo)準(zhǔn)文檔#define BLOCKSIZE 1024/ 磁盤塊大小#define SIZE 1024000/虛擬磁盤空間大小#define END 65535 / FAT中的文件結(jié)束標(biāo)志#define FREE 0/ FAT中盤塊空閑標(biāo)志#define ROOTBLOCKNUM 2/根目錄區(qū)所占盤塊數(shù)#define MAXOPENFILE 10/最多同時打開文件個數(shù) t#define MAXTEXT 10000/*文件控制塊*/typedef struct FCBchar filena
31、me8; / 文件名char exname3; / 文件擴(kuò)展名unsigned char attribute; /文件屬性字段,值為0時表示目錄文件,值為1時表示數(shù)據(jù)文件unsigned short time; / 文件創(chuàng)建時間unsigned short date; / 文件創(chuàng)建日期unsigned short first; /文件起始盤塊號unsigned long length; / 文件長度char free; /表示目錄項是否為空,若值為 0,表示空,值為1,表示已分配fcb;/*文件分配表*/typedef struct FATunsigned short id; /磁盤塊的狀態(tài)(
32、空閑的,最后的,下一個)fat;/*用戶打開文件表*/typedef struct USEROPENchar filename8; / 文件名char exname3; / 文件擴(kuò)展名unsigned char attribute;文件屬性字段,值為0時表示目錄文件, 值為1時表示數(shù)據(jù)文 件unsigned short time; / 文件創(chuàng)建時間unsigned short date; / 文件創(chuàng)建日期unsigned short first; /文件起始盤塊號unsigned long length;/戊件長度(對數(shù)據(jù)文件是字節(jié)數(shù),對目錄文件可以是目錄項個數(shù))char free; /表示目
33、錄項是否為空,若值為 0,表示空,值為1,表示已分配unsigned short dirno; /相應(yīng)打開文件的目錄項在父目錄文件中的盤塊號int diroff;相應(yīng)打開文件的目錄項在父目錄文件的dirno盤塊中的目錄項序號char dir80;/相應(yīng)打開文件所在的路徑名,這樣方便快速檢查出指定文件是否已經(jīng)實用文案標(biāo)準(zhǔn)文檔打開int father;父目錄在打開文件表項的位置int count; /讀寫指針在文件中的位置,文件的總字符數(shù)char fcbstate; /是否修改了文件的FCB的內(nèi)容,如果修改了置為 1,否則為0char topenfile; /表示該用戶打開表項是否為空,若值為 0
34、,表示為空,否則表示已 被某打開文件占據(jù)useropen;/*引導(dǎo)塊*/typedef struct BLOCK0char magic10; /文件系統(tǒng)魔數(shù)char information。;/存儲一些描述信息,如磁盤塊大小、磁盤塊數(shù)量、最多打開文 件數(shù)等unsigned short root; /根目錄文件的起始盤塊號unsigned char *startblock; /虛擬磁盤上數(shù)據(jù)區(qū)開始位置block0;unsigned char *myvhard; /指向虛擬磁盤的起始地址useropen openfilelistMAXOPENFILE; / 用戶打開文件表數(shù)組int curdir;
35、 /用戶打開文件表中的當(dāng)前目錄所在打開文件表項的位置char currentdir80; /記錄當(dāng)前目錄的目錄名(包括目錄的路徑)unsigned char* startp; /記錄虛擬磁盤上數(shù)據(jù)區(qū)開始位置char myfilename口 = "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
36、);/ 刪除子目錄void my_ls(); / 顯示目錄void my_create (char *filename); /創(chuàng)建文件void my_rm(char *filename);/ 刪除文件int my_open(char *filename);/ 打開文件int my_close(int fd); / 關(guān)閉文件int my_write(int fd); / 寫文件int do_write(int fd, char *text, int len, char wstyle); / 實際寫文件int my_read (int fd, int len); / 讀文件int do_read
37、(int fd, int len,char *text); / 實際讀文件void my_exitsys(); / 退出文件系統(tǒng)unsigned short findblock(); / 尋找空閑盤塊int findopenfile(); /尋找空閑文件表項void startsys()FILE *fp;實用文案標(biāo)準(zhǔn)文檔unsigned char bufSIZE;fcb *root;int i;myvhard = (unsigned char *)malloc(SIZE);/ 申請?zhí)摂M磁盤空間memset(myvhard, 0, SIZE);/ 將 myvhard 中前 SIZE 個字節(jié)用 0
38、 替換并返回 myvhard if(fp = fopen(myfilename, "r") != NULL)fread(buf, SIZE, 1, fp);/將二進(jìn)制文件讀取到緩沖區(qū)fclose(fp);if(strcmp(block0 *)buf)->magic, ”10101010") printf("myfilesys is not exist,begin to creat the file.n");my_format(); else for(i = 0; i < SIZE; i+) myvhardi = bufi;elsep
39、rintf("myfilesys is not exist,begin to creat the file.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;open
40、filelist0.date = root->date;openfilelist0.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.fc
41、bstate = 0;openfilelist0.topenfile = 1;for(i = 1; i < MAXOPENFILE; i+)openfilelisti.topenfile = 0;curdir = 0;實用文案標(biāo)準(zhǔn)文檔strcpy(currentdir, "root");startp = (block。*)myvhard)->startblock;void my_format() FILE *fp;fat *fat1, *fat2;block。*blk0;time_t now;struct tm *nowtime;fcb *root;int i;
42、blk0 = (block。*)myvhard;fatl = (fat *)(myvhard + BLOCKSIZE);fat2 = (fat *)(myvhard + 3 * BLOCKSIZE);root = (fcb *)(myvhard + 5 * BLOCKSIZE);strcpy(blk0->magic, ”10101010");Wholestrcpy(blk0->information, "My FileSystem Ver 1.0 n Blocksize=1KB size=1000KB Blocknum=1000 RootBlocknum=2n&
43、quot;);blk0->root = 5;blk0->startblock = (unsigned char *)root;for(i = 0; i < 5; i+)fat1->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 < SIZE / BLOCKSIZE; i+)fat1->id = FREE;fat2->
44、id = FREE;fat1+;fat2+;now = time(NULL);實用文案標(biāo)準(zhǔn)文檔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
45、->tm_year - 80) * 512 + (nowtime->tm_mon + 1) * 32 + nowtime->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
46、 = 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->free = 1;fp = fopen(myfilename, &
47、quot;w");fwrite(myvhard, SIZE, 1, fp);fclose(fp);void my_cd(char *dirname)char *dir;int fd;dir = strtok(dirname, "");/分解字符串為一組字符串。dirname為要分解的字符串,""為分隔符字符串if(strcmp(dir, ".") = 0)return;else if(strcmp(dir, ".") = 0)if(curdir)curdir = my_close(curdir);retu
48、rn;else if(strcmp(dir, "root") = 0)實用文案標(biāo)準(zhǔn)文檔while(curdir)curdir = my_close(curdir);dir = strtok(NULL, "");while(dir)fd = my_open(dir);if(fd != -1)curdir = fd;elsereturn;dir = strtok(NULL, "");void my_mkdir(char *dirname)fcb *fcbptr;fat *fat1, *fat2;time_t now;struct tm *
49、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);fcbptr = (fcb *)text;for(i = 0; i < rbn / sizeof(fcb); i+)/在當(dāng)前目錄下找,是否有重名目錄if
50、(strcmp(fcbptr->filename, dirname) = 0 && strcmp(fcbptr->exname, "") = 0) printf("Error,the dirname is already exist!n");return;fcbptr+;fcbptr = (fcb *)text;for(i = 0; i < rbn / sizeof(fcb); i+)if(fcbptr->free = 0)break;fcbptr+;實用文案標(biāo)準(zhǔn)文檔blkno = findblock();/ 尋找
51、空閑盤塊if(blkno = -1)return;(fatl + blkno)->id = END;(fat2 + blkno)->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 *
52、 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
53、*)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);/ 建立新目錄的'.','.目錄now = time(NULL);nowtime = localtime(&now);strcpy(fcbptr->filename, ".");strcpy(fcbptr->ex
54、name, "");fcbptr->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 * siz
55、eof(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->attribute = 0x28;fcbptr->time = nowtime->tm_hour * 2048 + nowtime->tm_min *
56、32 + nowtime->tm_sec實用文案標(biāo)準(zhǔn)文檔/ 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(fcb), 2);free(fcbptr);my_close(fd);fcbptr = (fcb *)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 吊車卸鋼材合同范例
- 奶茶股合同范例
- 定金購車合同范例
- 圍欄刷漆合同模板
- 開籃球館合同范例
- 快遞員勞工合同范例
- 公司授權(quán)個人借款合同范例
- 小區(qū)房出售合同模板
- 工程續(xù)保合同范例
- 快遞客棧轉(zhuǎn)讓合同范例
- 冬季預(yù)防訓(xùn)練傷的
- 2023自動扶梯與自動人行道扶手帶技術(shù)要求
- 證據(jù)法司考真題
- 項目管理培訓(xùn)之溝通管理課件
- 過敏性鼻炎與過敏性哮喘的治療
- 九省高三適應(yīng)性聯(lián)考詩歌鑒賞《臨江仙+正月二十四日晚至湖上》譯文賞析及試題含答案解析詳解講評課件
- 美甲店創(chuàng)業(yè)商業(yè)計劃書
- 反洗錢考試題庫及答案
- 仿制藥一致性與BE試驗
- 絕交協(xié)議書模板
- 管理經(jīng)濟(jì)學(xué)課后答案
評論
0/150
提交評論