簡單文件系統(tǒng)的實現(xiàn)試驗報告_第1頁
簡單文件系統(tǒng)的實現(xiàn)試驗報告_第2頁
簡單文件系統(tǒng)的實現(xiàn)試驗報告_第3頁
簡單文件系統(tǒng)的實現(xiàn)試驗報告_第4頁
簡單文件系統(tǒng)的實現(xiàn)試驗報告_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、操作系統(tǒng)課程設(shè)計報告簡單文件系統(tǒng)的實現(xiàn)專業(yè):班級:姓名:學(xué)號:老師:一、課程設(shè)計的目的1. 通過具體的文件存儲空間的管理、文件的物理結(jié)構(gòu)、目錄結(jié)構(gòu)和文件操作的實現(xiàn),加深對 文件系統(tǒng)內(nèi)部數(shù)據(jù)結(jié)構(gòu)、功能以及實現(xiàn)過程的理解。二、課程設(shè)計要求1. 在內(nèi)存中開辟一個虛擬磁盤空間作為文件存儲分區(qū), 在其上實現(xiàn)一個簡單的基于多級目錄 的單用戶單任務(wù)系統(tǒng)中的文件系統(tǒng)。在退出該文件系統(tǒng)的使用時,應(yīng)將該虛擬文件系統(tǒng)以一 個 Windows 文件的方式保存到磁盤上,以便下次可以再將它恢復(fù)到內(nèi)存的虛擬磁盤空間中。2 文件存儲空間的分配可采用顯式鏈接分配或其他的辦法。3 空閑磁盤空間的管理可選擇位示圖或其他的辦法。如果

2、采用位示圖來管理文件存儲空間, 并采用顯式鏈接分配方式,那么可以將位示圖合并到FAT 中。文件目錄結(jié)構(gòu)采用多級目錄結(jié)構(gòu)。為了簡單起見,可以不使用索引結(jié)點,其中的每個目錄項 應(yīng)包含文件名、物理地址、長度等信息,還可以通過目錄項實現(xiàn)對文件的讀和寫的保護。要求提供以下有關(guān)的操作命令:my_format :對文件存儲器進行格式化, 即按照文件系統(tǒng)的結(jié)構(gòu)對虛擬磁盤空間進行布局, 并 在其上創(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)建文件

3、。my_open:用于打開文件。my_close:用于關(guān)閉文件。my_write :用于寫文件。my_read:用于讀文件。my_rm :用于刪除文件。my_exitsys :用于退出文件系統(tǒng)。三、程序的設(shè)計細(xì)想和框圖1打開文件函數(shù) fopen()( 1)格式: FILE *fopen(const char * char *mode)( 2)功能:按照指定打開方式打開指定文件。( 3)輸入?yún)?shù)說明:待打開的文件名,如果不存在就創(chuàng)建該文件。mode: 文件打開方式,常用的有:r :為讀而打開文本文件(不存在則出錯) 。w :為寫而打開文本文件(若不存在則創(chuàng)建該文件;反之,則從文件起始位置寫,原內(nèi)

4、容將被覆蓋)。a :為在文件末尾添加數(shù)據(jù)而打開文本文件。 (若不存在則創(chuàng)建該文件;反之 ,在原文件末尾 追加)。r+ :為讀和寫而打開文本文件。 (讀時,從頭開始;在寫數(shù)據(jù)時 , 新數(shù)據(jù)只覆蓋所占的空間, 其后不變 ) 。w+ :首先建立一個新文件,進行寫操作,隨后可以從頭開始讀。(若文件存在,原內(nèi)容將全部消失 ) 。a+ :功能與 a相同;只是在文件末尾添加新的數(shù)據(jù)后,可以從頭開始讀。 另外,上述模式字符串中都可以加一個“b”字符,如 rb、wb、 ab、rb+、wb+、 ab+等組合, 字符“ b”表示 fopen() 函數(shù)打開的文件為二進制文件,而非純文字文件。( 4)輸出:一個指向 F

5、ILE 類型的指針。 2關(guān)閉文件函數(shù) fclose()( 1)格式: int fclose(FILE * stream);(2)功能:用來關(guān)閉先前 fopen() 打開的一個文件。此動作會讓緩沖區(qū)內(nèi)的數(shù)據(jù)寫入文件中, 并釋放系統(tǒng)所提供的文件資源。( 3)輸入?yún)?shù)說明:stream:指向要關(guān)閉文件的指針,它是先前執(zhí)行fopen() 函數(shù)的返回值。( 4)輸出:若關(guān)閉文件成功則返回0;有錯誤發(fā)生時則返回 EOF 并把錯誤代碼存到 errno 。3讀文件函數(shù) fread()( 1)格式: size_t fread( void *buffer, size_t size, size_t count, F

6、ILE *stream ) ; (2)功能:讀二進制文件到內(nèi)存。( 3)輸入?yún)?shù)說明:buffer:用于存放輸入數(shù)據(jù)的緩沖區(qū)的首地址;stream:使用 fopen() 打開的文件的指針,用于指示要讀取的文件;size: 每個數(shù)據(jù)塊的字節(jié)數(shù);count: 要讀入的數(shù)據(jù)塊的個數(shù); size*count :表示要求讀取的字節(jié)數(shù)。(4)輸出:實際讀取的數(shù)據(jù)塊的個數(shù)。4寫文件函數(shù) fwrite()( 1)格式: size_t fwite(const void *buffer,size_t size,size_t count,FILE *stream) ; (2)功能:將數(shù)據(jù)寫到二進制文件中。( 3)輸

7、入?yún)?shù)說明:buffer :用于存放輸出數(shù)據(jù)的緩沖區(qū)的首地址;stream:使用 fopen() 打開的文件的指針,用于指示要寫出的文件; size: 每個數(shù)據(jù)塊的字節(jié)數(shù); count : 要寫出的數(shù)據(jù)塊的個數(shù);size*count :表示要求寫出的字符數(shù)。 (4)輸出:實際寫出的數(shù)據(jù)塊的個數(shù)。 5判斷文件結(jié)束函數(shù) feof ()( 1)格式: int feof(FILE * stream) (2)功能:用來判斷是否已讀取到文件末尾。( 3)輸入?yún)?shù)說明:stream:使用 fopen() 打開的文件的指針,用于指示要判斷的文件。( 4)輸出:如果已讀到文件尾則返回非零值,其他情況返回0。6

8、主要函數(shù)功能實現(xiàn) :int format(); / 格式化磁盤int mkdir(char *sonfname); / 創(chuàng)建子目錄int rmdir(char *sonfname); / 刪除子目錄int create(char *name); / 創(chuàng)建文件int listshow();/ 顯示子文件信息int del *name); / 刪除文件int changePath(char *sonfname);/ 更改當(dāng)前路徑int write(char *name); / 寫入文件int exit();/ 退出系統(tǒng)int open(char * 打開文件int close(char * 關(guān)閉文

9、件int read(char * 讀取文件7 主要的框架四、程序?qū)崿F(xiàn)和程序調(diào)試遇到的問題的分析1 對于 DOS 的文件操作使用不熟悉,經(jīng)常輸入錯誤命令2 調(diào)試的時候跟蹤變量的時候,難以鎖定實際的變量是什么3 對于文件的存儲結(jié)構(gòu)不熟悉,在構(gòu)造 FAT 的時候不知如何解決,查閱了大量的資料和跟老 師交流才慢慢開始理解4 由于買的實驗冊對于文件的介紹過于簡單,導(dǎo)致理解上出現(xiàn)很大的困難。五、結(jié)果分析和總結(jié)1 基本上實現(xiàn)了 DOS 下簡單文件系統(tǒng)的實現(xiàn),通過學(xué)習(xí)基本掌握了文件系統(tǒng)的存儲結(jié)構(gòu)2 當(dāng)遇到困難的時候通過認(rèn)真思考很查閱資料很大問題都是可以自己解決的。通過這次實驗 鍛煉了自己的動手的能力和分析問題

10、的能力3 在構(gòu)造函數(shù)的時候可以開闊思維同時加深自己對文件系統(tǒng)實現(xiàn)的理解4 通過這樣的實驗開始對 DOS 的環(huán)境文件命令輸入有了初步的理解5 通過跟老師的討論解決自己心中的疑惑六、程序#include #include #include #include using namespace std;#define GENERAL 1/1 代表普通文件 2代表目錄文件 0 表示空文件#define DIRECTORY 2#define Zero 0 struct FCBchar fname16; / 文件名char type; int size;/ 0 空文件 1 目錄文件 2 空文件 /文件大小in

11、t fatherBlockNum;/當(dāng)前的父目錄盤塊號int currentBlockNum;/當(dāng)前的盤塊void initialize() strcpy(fname,0); type = Zero; size =0;fatherBlockNum = currentBlockNum = 0;const char* = C:myfiles;/* 常量設(shè)置 */const int BlockSize = 512;/ 盤塊大小const int OPEN_MAX = 5;/ 能打開最多的文件數(shù)const int BlockCount = 128;/盤塊數(shù)const int DiskSize = Bl

12、ockSize * BlockCount;/磁盤大小const int BlockFcbCount = BlockSize/sizeof(FCB);/ 目錄文件的最多 FCB 數(shù) int Open = 0; / 統(tǒng)計當(dāng)前打開文件數(shù)目struct OPENLIST/用戶文件打開表int files; /當(dāng)前打開文件數(shù)FCB fOPEN_MAX; /FCB 拷貝OPENLIST()for(int i=0;iOPEN_MAX;i+) fi.fatherBlockNum = -1;/ 為分配打開 fi.type=GENERAL;struct dirFile/* 目錄文件結(jié)構(gòu) */struct FCB

13、fcbBlockFcbCount;void init(int _FatherBlockNum,int _CurrentBlockNum,char *name)/父塊號,當(dāng)前塊號,目錄名 strcpy(fcb0.fname,name); / 本身的 FCB fcb0.fatherBlockNum=_FatherBlockNum; fcb0.currentBlockNum=_CurrentBlockNum; fcb0.type=DIRECTORY;/標(biāo)記目錄文件for(int i=1;iformat();/ 打開文件列表初始化 delete openlist;openlist=new OPENLI

14、ST;/* 保存到磁盤上 my*/fp = fopen(,w+); fwrite(BaseAddr,sizeof(char),DiskSize,fp);fclose(fp);printf( 格式化成功! ! n);return 1;int mkdir(char *sonfname)/* 創(chuàng)建子目錄 */ 判斷是否有重名尋找空白子目錄項尋找空白盤塊號當(dāng)前目錄下增加該子目錄項分配子目 錄盤塊,并且初始化修改 fat 表int i,temp,iFAT;struct dirFile *dir;/當(dāng)前目錄的指針if(current = 2) / 根目錄 dir=&(osPoint-root);else

15、dir=(struct dirFile *)(osPoint-data current-3);/* 為了避免該目錄下同名文件夾 */for(i = 1;ifcbi.type=DIRECTORY & strcmp(dir-fcbi.fname,sonfname)=0 ) printf( 該文件夾下已經(jīng)有同名的文件夾存在了 !n); return 0;for(i = 1;i fcbi.type=Zero)break;if(i = BlockFcbCount)printf( 該目錄已滿 !請選擇新的目錄下創(chuàng)建 !n); return 0;temp = i;for(i = 3;i FAT1i = 0)

16、 break;if(i = BlockCount) printf( 磁盤已滿 !n); return 0;iFAT=i;/*接下來進行分配*/osPoint-FAT1iFAT=osPoint-FAT2iFAT = 2;/2 表示分配給下級目錄文件/填寫該分派新的盤塊的參數(shù) strcpy(dir-fcbtemp.fname,sonfname);dir-fcbtemp.type=DIRECTORY; dir-fcbtemp.fatherBlockNum=current; dir-fcbtemp.currentBlockNum=iFAT;/初始化子目錄文件盤塊dir=(struct dirFile*

17、)(osPoint-data iFAT-3);/定位到子目錄盤塊號dir-init (current,iFAT,sonfname);/iFAT 是要分配的塊號,這里的 current 用來指要分配的 塊的父塊號printf( 創(chuàng)建子目錄成功! n);return 1;int rmdir(char *sonfname)/* 刪除當(dāng)前目錄下的文件夾 */int i,temp,j;/ 確保當(dāng)前目錄下有該文件 ,并記錄下該 FCB 下標(biāo) struct dirFile *dir;/當(dāng)前目錄的指針if(current=2)dir=&(osPoint-root);elsedir=(struct dirFil

18、e *)(osPoint-data current-3);for(i=1;ifcbi.type=DIRECTORY & strcmp(dir-fcbi.fname,sonfname)=0) break; temp=i;if(i=BlockFcbCount)printf( 當(dāng)前目錄下不存在該子目錄 !n);return 0;j = dir-fcbtemp.currentBlockNum;struct dirFile *sonDir;/ 當(dāng)前子目錄的指針sonDir=(struct dirFile *)(osPoint-data j - 3);for(i=1;ifcbi.type!=Zero)pr

19、intf( 該文件夾為非空文件夾 ,為確保安全,請清空后再刪除 !n); return 0;/* 開始刪除子目錄操作 */ osPoint-FAT1j = osPoint-FAT2j=0;/fat 清空char *p=osPoint-dataj-3;/格式化子目錄memset(p,0,BlockSize);dir-fcbtemp.initialize();/回收子目錄占據(jù)目錄項printf( 刪除當(dāng)前目錄下的文件夾成功 n);return 1;/* 在當(dāng)前目錄下創(chuàng)建文本文件 */int create(char *name)int i,iFAT;/temp,int emptyNum = 0,is

20、Found = 0;/ 空閑目錄項個數(shù)struct dirFile *dir;/當(dāng)前目錄的指針if(current=2)dir=&(osPoint-root);elsedir=(struct dirFile *)(osPoint-data current-3); for(i=1;ifcbi.type = Zero & isFound = 0)emptyNum = i;isFound = 1;else if(dir-fcbi.type=GENERAL & strcmp(dir-fcbi.fname,name)=0 ) printf( 無法在同一目錄下創(chuàng)建同名文件 !n);return 0;if(

21、emptyNum = 0)printf( 已經(jīng)達(dá)到目錄項容納上限,無法創(chuàng)建新目錄 !n); return 0;for(i = 3;iFAT1i=0) break;if(i=BlockCount)printf( 磁盤已滿 !n);return 0;iFAT=i;/* 進入分配階段 */ 分配磁盤塊osPoint-FAT1iFAT = osPoint-FAT2iFAT = 1;/* 接下來進行分配 */ 填寫該分派新的盤塊的參數(shù)strcpy(dir-fcbemptyNum.fname,name); dir-fcbemptyNum.type=GENERAL; dir-fcbemptyNum.fath

22、erBlockNum=current; dir-fcbemptyNum.currentBlockNum=iFAT; dir-fcbemptyNum.size =0;char* p = osPoint-dataiFAT -3; memset(p,4,BlockSize);printf( 在當(dāng)前目錄下創(chuàng)建文本文件成功! n); return 1;/* 查詢子目錄 */int listshow()int i,DirCount=0,;/搜索當(dāng)前目錄struct dirFile *dir;/當(dāng)前目錄的指針if(current=2)dir=&(osPoint-root);elsedir=(struct d

23、irFile *)(osPoint-data current-3);for(i=1;ifcbi.type=GENERAL)/ 查找普通文件printf(%s 文本文件 .n,dir-fcbi.fname); if(dir-fcbi.type=DIRECTORY)/ 查找目錄文件DirCount+;printf(%s 文件夾 .n,dir-fcbi.fname);printf(n 該目錄下共有 %d 個文本文件 , %d 個文件夾 nn,);return 1;/* 在當(dāng)前目錄下刪除文件 */int del *name)int i,temp,j;/ 確保當(dāng)前目錄下有該文件 ,并且記錄下它的 FCB

24、 下標(biāo)struct dirFile *dir;/當(dāng)前目錄的指針if(current = 2)dir=&(osPoint-root);elsedir=(struct dirFile *)(osPoint-data current-3);for(i=1;i fcbi.type=GENERAL & strcmp(dir-fcbi.fname,name)=0) break;if(i = BlockFcbCount)printf( 當(dāng)前目錄下不存在該文件 !n);return 0;int k;for(k=0;kf k.type = GENERAL)&(strcmp(openlist-f k.fname,

25、name)=0) if(openlist-fk.fatherBlockNum = current) break;elseprintf( 該文件未在當(dāng)前目錄下 !n);return 0;if(k!=OPEN_MAX)close(name);/從打開列表中刪除 /* 開始刪除文件操作 */temp=i;j = dir-fcb temp.currentBlockNum ;/ 查找盤塊號 josPoint-FAT1j=osPoint-FAT2j=0; /fat1,fat2 表標(biāo)記為空白 char *p=osPoint-dataj - 3;memset(p,0,BlockSize); / 清除原文本文件

26、的內(nèi)容 dir-fcbtemp.initialize(); /type=0;/標(biāo)記該目錄項為空文件printf( 在當(dāng)前目錄下刪除文件成功! n);return 1;/* 進入當(dāng)前目錄下的子目錄 */int changePath(char *sonfname)struct dirFile *dir;/當(dāng)前目錄的指針if(current=2)dir=&(osPoint-root);elsedir=(struct dirFile *)(osPoint-data current-3);/* 回到父目錄 */ if(strcmp(sonfname,.)=0)if(current=2)printf( 你

27、現(xiàn)已經(jīng)在根目錄下 !n);return 0;current = dir-fcb0.fatherBlockNum ;currentPath = currentPath.substr(0,currentPath.size() - strlen(dir-fcb0.fname )-1); return 1;/* 進入子目錄 */確保當(dāng)前目錄下有該目錄 ,并且記錄下它的 FCB 下標(biāo) int i,temp;for(i = 1; i fcbi.type=DIRECTORY&strcmp(dir-fcbi.fname,sonfname)=0) temp=i;break;if(i=BlockFcbCount)

28、printf( 不存在該目錄 !n); return 0;/修改當(dāng)前文件信息current=dir-fcb temp.currentBlockNum ; currentPath = currentPath+dir-fcb temp.fname +; printf( 進入當(dāng)前目錄下的子目錄成功! n); return 1;int exit()/ 保存到磁盤上 C:myfiles/ 將所有文件都關(guān)閉 /*System exit*/fp=fopen(,w+);fwrite(BaseAddr,sizeof(char),DiskSize,fp);fclose(fp);/釋放內(nèi)存上的虛擬磁盤free(os

29、Point);/釋放用戶打開文件表delete openlist;printf( 退出文件系統(tǒng)成功! nn);return 1;int write(char *name)/* 在指定的文件里記錄信息 */int i;char *startPoint,*endPoint;/在打開文件列表中查找 file( 還需要考慮同名不同目錄文件的情況 !) for(i=0;if i.fname,name)=0 ) if(openlist-fi.fatherBlockNum =current) break;else!n);printf( 該文件處于打開列表中,本系統(tǒng)只能改寫當(dāng)前目錄下文件 return 0;i

30、f(i=OPEN_MAX)printf( 該文件尚未打開 ,請先打開后寫入信息 !n);return 0;int active=i;int = openlist-factive.currentBlockNum - 3 ;startPoint = osPoint-data; endPoint = osPoint-data + 1; printf( 請輸入文本以 Ctrl D 號結(jié)束 :t); char input;while(input=getchar()!=4) if(startPoint endPoint-1) *startPoint+ = input;elseprintf( 達(dá)到單體文件最

31、大容量! ); *startPoint+ = 4;break;return 1;int read(char *file)/* 選擇一個打開的文件讀取信息 */int i,;char *startPoint,*endPoint;/struct dirFile *dir;/在打開文件列表中查找 file( 還需要考慮同名不同目錄文件的情況 !) for(i=0;if i.fname, ) if(openlist-fi.fatherBlockNum =current) break;else!n);printf( 該文件處于打開列表中,本系統(tǒng)只能閱讀當(dāng)前目錄下文件 return 0;if(i=OPEN

32、_MAX)printf( 該文件尚未打開 ,請先打開后讀取信息 !n); return 0;int active=i;/ 計算文件物理地址= openlist-factive.currentBlockNum - 3 ; startPoint = osPoint-data; endPoint = osPoint-data + 1; printf( 該文件的內(nèi)容為 : );while(*startPoint)!=4& (startPoint endPoint) putchar(*startPoint+);printf(n);return 1;int open(char * 打開文件 /* 當(dāng)前目錄

33、下添加一個打開文件 */int i,FcbIndex;/ 確保沒有打開過該文件 = 相同名字 + 相同目錄 for(i=0;ifi.type =GENERAL & strcmp(openlist-f i.fname, &openlist-fi.fatherBlockNum = current)printf( 該文件已經(jīng)被打開 !n);return 0;/確保有空的打開文件項 if(openlist-files = OPEN_MAX) printf( 打開文件數(shù)目達(dá)到上限 ! 無法再打開新文件 .n); return 0;/ 確保當(dāng)前目錄下有該文件 ,并且記錄下它的 FCB 下標(biāo)struct d

34、irFile *dir;/當(dāng)前目錄的指針if(current=2)dir=&(osPoint-root);elsedir=(struct dirFile *)(osPoint-data current-3);for(i = 1;ifcbi.type=GENERAL & strcmp(dir-fcbi.fname, ) FcbIndex=i; break;if(i=BlockFcbCount)printf( 當(dāng)前目錄下不存在該文件 !n);return 0;/ 裝載新文件進入打開文件列表 ,(FCB 信息,文件數(shù) +) ?難道名字過不來?openlist-fOpen = dir-fcbFcbIn

35、dex; /FCB 拷貝openlist-files +;printf( 文件打開成功 !n);Open;return 1;int close(char *file)/ 釋放該文件所占內(nèi)存 / 釋放用戶打開文件列表表項int i;/在打開文件列表中查找 file( 還需要考慮同名不同目錄文件的情況 !) for(i=0;if i.type = GENERAL)& (strcmp(openlist-f i.fname,) if(openlist-fi.fatherBlockNum = current) break;elseprintf( 該文件已打開,但未在當(dāng)前目錄下,無法關(guān)閉 !n); ret

36、urn 0;if(i=OPEN_MAX)printf( 該文件未在打開列表中 !n);return 0;int active=i;openlist-files -;openlist-factive.initialize();Open;printf( 該文件已關(guān)閉 !n);return 1;int main()printf( Welcome To My Operate System Of )n);printf(n 以下是使用說明書: n);/ 使用說明書 printf( n);printf( format : 對磁盤格式化 . n);printf( exit:安全退出該文件系統(tǒng) ,保存信息 . n);print

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論