模擬文件系統(tǒng)的設計與實現(xiàn).doc
《模擬文件系統(tǒng)的設計與實現(xiàn).doc》由會員分享,可在線閱讀,更多相關《模擬文件系統(tǒng)的設計與實現(xiàn).doc(21頁珍藏版)》請在裝配圖網上搜索。
1、 中北大學 操作系統(tǒng)課程設計 說 明 書 學 院、系: 軟件學院 專 業(yè): 軟件工程 學 生 姓 名: xxx 學 號: xxx 設 計 題 目: 模擬文件系統(tǒng)的設計與實現(xiàn) 起 迄 日 期: 2015年12月28日- 2016年1月8日 指 導 教 師: xxx 2016 年1月8日 1 需求分析 通過模擬文件系統(tǒng)的實現(xiàn),深入理解操作系統(tǒng)中文件系統(tǒng)的理論知識, 加深對教材中的重要算法的理解。同時通過編程實現(xiàn)這些算法,更好地掌握操作系統(tǒng)的原理及實現(xiàn)方法,提高綜合運用各專業(yè)課知識的能力;掌握操作
2、系統(tǒng)結構、實現(xiàn)機理和各種典型算法,系統(tǒng)地了解操作系統(tǒng)的設計和實現(xiàn)思路,并了解操作系統(tǒng)的發(fā)展動向和趨勢。 模擬二級文件管理系統(tǒng)的課程設計目的是通過研究Linux的文件系統(tǒng)結構,模擬設計一個簡單的二級文件系統(tǒng),第一級為主目錄文件,第二級為用戶文件。 2 總體設計 結合數(shù)據(jù)結構、程序設計、計算機原理等課程的知識,設計一個二級文件系統(tǒng),進一步理解操作系統(tǒng)。 文件的創(chuàng)建: create 文件關閉:close 文件的打開:open 文件的讀:read 文件的寫:write 文件關閉:close 刪除文件:dele
3、te 創(chuàng)建子目錄:mkdir 刪除子目錄:rmdir 列出文件目錄:dir 退出:exit 開 始 系統(tǒng)執(zhí)行流程圖 選擇操作 創(chuàng)建文件 刪除文件 讀文件 寫文件 創(chuàng)建文件夾 刪除文件夾 刪除子目錄 顯示當前子目錄 創(chuàng)建子目錄 更改目錄 退出 退出 3. 詳細設計 主要數(shù)據(jù)結構: #define MEM_D_SIZE 1024*1024 //總磁盤空間為1M #define DISKSIZE 1024 //磁盤
4、塊的大小1K #define DISK_NUM 1024 //磁盤塊數(shù)目1K #define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目錄起始盤塊號 #define ROOT_DISK_SIZE sizeof(struct direct) //根目錄大小 #define DIR_MAXSIZE 1024 //路徑最大長度為1KB #define MSD 5 //最大子目錄數(shù)5 #define MOFN 5
5、 //最大文件深度為5 #define MAX_WRITE 1024*128 //最大寫入文字長度128KB struct fatitem /* size 8*/ { int item; /*存放文件下一個磁盤的指針*/ char em_disk; /*磁盤塊是否空閑標志位 0 空閑*/ }; struct direct { /*-----文件控制快信息-----*/ struct FCB { char name[9]; /*文件/目錄名 8位*/ char property; /*屬性 1位目錄
6、0位普通文件*/ int size; /*文件/目錄字節(jié)數(shù)、盤塊數(shù))*/ int firstdisk; /*文件/目錄 起始盤塊號*/ int next; /*子目錄起始盤塊號*/ int sign; /*1是根目錄 0不是根目錄*/ }directitem[MSD+2]; }; struct opentable { struct openttableitem { char name[9]; /*文件名*/ int firstdisk; /*起始盤塊號*/ int siz
7、e; /*文件的大小*/
}openitem[MOFN];
int cur_size; /*當前打文件的數(shù)目*/
};
管理文件的主要代碼:
int create(char *name)
{
int i,j;
if(strlen(name)>8) /*文件名大于 8位*/
return(-1);
for(j=2;j
8、 break;
}
if(j
9、(-3);
for(j=ROOT_DISK_NO+1;j
10、 cur_dir->directitem[i].firstdisk = j; cur_dir->directitem[i].size = 0; cur_dir->directitem[i].next = j; cur_dir->directitem[i].property = 0; /*---------------------------------*/ fd = open(name); return 0; } int open(char *name) { int i, j;
11、
for(i=2;i
12、----------*/
for(j=0;j
13、
for(j=0;j
14、table.openitem[j].size = cur_dir->directitem[i].size;
u_opentable.cur_size++;
/*----------返回用戶打開表表項的序號--------------------------*/
return(j);
}
int close(char *name)
{
int i;
for(i=0;i 15、break;
}
if(i>=MOFN)
return(-1);
/*-----------清空該文件的用戶打開表項的內容---------------------*/
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstdisk = -1;
u_opentable.openitem[i].size = 0;
u_opentable.cur_size--;
return 0; 16、
}
int write(int fd, char *buf, int len)
{
char *first;
int item, i, j, k;
int ilen1, ilen2, modlen, temp;
/*----------用 $ 字符作為空格 # 字符作為換行符-----------------------*/
char Space = 32;
char Endter= \n;
for(i=0;i 17、else if(buf[i] == #)
buf[i] = Endter;
}
/*----------讀取用戶打開表對應表項第一個盤塊號-----------------------*/
item = u_opentable.openitem[fd].firstdisk;
/*-------------找到當前目錄所對應表項的序號-------------------------*/
for(i=2;i 18、 break;
}
temp = i; /*-存放當前目錄項的下標-*/
/*------找到的item 是該文件的最后一塊磁盤塊-------------------*/
while(fat[item].item!=-1)
{
item =fat[item].item; /*-查找該文件的下一盤塊--*/
}
/*-----計算出該文件的最末地址-------*/
first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;
/*-----如 19、果最后磁盤塊剩余的大小大于要寫入的文件的大小-------*/
if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len)
{
strcpy(first,buf);
u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;
cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;
}
else
{
for(i=0;i<(DISK 20、SIZE-u_opentable.openitem[fd].size%DISKSIZE);i++)
{/*寫一部分內容到最后一塊磁盤塊的剩余空間(字節(jié))*/
first[i] = buf [i];
}
/*-----計算分配完最后一塊磁盤的剩余空間(字節(jié)) 還剩下多少字節(jié)未存儲-------*/
ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);
ilen2 = ilen1/DISKSIZE;
modlen = ilen1%DISKSIZE;
if( 21、modlen>0)
ilen2 = ilen2+1; /*--還需要多少塊磁盤塊-*/
for(j=0;j 22、址-*/
if(j==ilen2-1) /*--如果是最后要分配的一塊-*/
{
for(k=0;k 23、*--找到一塊后將它的序號存放在上一塊的指針中-*/
fat[i].em_disk = 1; /*--置找到的磁盤快的空閑標志位為已分配-*/
fat[i].item = -1; /*--它的指針為 -1 (即沒有下一塊)-*/
}
/*--修改長度-*/
u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;
cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;
}
24、return 0;
}
int read(int fd, char *buf)
{
int len = u_opentable.openitem[fd].size;
char *first;
int i, j, item;
int ilen1, modlen;
item = u_opentable.openitem[fd].firstdisk;
ilen1 = len/DISKSIZE;
modlen = len%DISKSIZE;
if(modlen!=0)
ilen1 = ilen1+1; /*--計 25、算文件所占磁盤的塊數(shù)-*/
first = fdisk+item*DISKSIZE; /*--計算文件的起始位置-*/
for(i=0;i 26、KSIZE+j] = first[j];
item = fat[item].item; /*-查找下一盤塊-*/
first = fdisk+item*DISKSIZE;
}
}
return 0;
}
int del(char *name)
{
int i,cur_item,item,temp;
for(i=2;i 27、
}
cur_item = i; /*--用來保存目錄項的序號,供釋放目錄中-*/
if(i>=MSD+2) /*--如果不在當前目錄中-*/
return(-1);
if(cur_dir->directitem[cur_item].property!=0) /*--如果刪除的(不)是目錄-*/
return(-3);
for(i=0;i 28、turn(-2);
}
item = cur_dir->directitem[cur_item].firstdisk;/*--該文件的起始盤塊號-*/
while(item!=-1) /*--釋放空間,將FAT表對應項進行修改-*/
{
temp = fat[item].item;
fat[item].item = -1;
fat[item].em_disk = 0;
item = temp;
}
/*-----------------釋放目錄項-----------------------*/
cur_dir->dir 29、ectitem[cur_item].sign = 0;
cur_dir->directitem[cur_item].firstdisk = -1;
strcpy(u_opentable.openitem[cur_item].name,"");
cur_dir->directitem[cur_item].next = -1;
cur_dir->directitem[cur_item].property = 0;
cur_dir->directitem[cur_item].size = 0;
return 0;
}
主函數(shù):
int 30、main()
{
FILE *fp;
char ch;
char a[100];
char code[11][10];
char name[10];
int i,flag,r_size;
char *contect;
contect = (char *)malloc(MAX_WRITE*sizeof(char));
if((fp=fopen("disk.dat","rb"))==NULL)
{
printf("You have not format,Do you want format?(y/n)");
31、scanf("%c",&ch);
if(ch==y)
{
initfile();
printf("Successfully format! \n");
}
else
{
return 0;
}
}
enter();
print();
show();
strcpy(code[0],"exit");
strcpy(code[1],"create");
strcpy(code[2],"open");
strcpy(code[3],"close");
32、strcpy(code[4],"write");
strcpy(code[5],"read");
strcpy(code[6],"del");
strcpy(code[7],"mkdir");
strcpy(code[8],"rmdir");
strcpy(code[9],"dir");
strcpy(code[10],"cd");
while(1)
{
scanf("%s",a);
for(i=0;i<11;i++)
{
if(!strcmp(code[i],a))
break;
} 33、
switch(i)
{
case 0: //退出文件系統(tǒng)
free(contect);
halt();
return 0;
case 1: //創(chuàng)建文件
scanf("%s",name);
flag = create(name);
if(flag==-1)
{
printf("Error: \n The length is too long !\n");
}
else if(flag==-2)
{
printf("Error: \n T 34、he direct item is already full !\n");
}
else if(flag==-3)
{
printf("Error: \n The number of openfile is too much !\n");
}
else if(flag==-4)
{
printf("Error: \n The name is already in the direct !\n");
}
else if(flag==-5)
{
printf("Error: 35、 \n The disk space is full!\n");
}
else
{
printf("Successfully create a file! \n");
}
show();
break;
case 2://打開文件
scanf("%s",name);
fd = open(name);
if(fd == -1)
{
printf("Error: \n The open file not exit! \n");
}
36、else if(fd == -2)
{
printf("Error: \n The file have already opened! \n");
}
else if(fd == -3)
{
printf("Error: \n The number of open file is too much! \n");
}
else if(fd == -4)
{
printf("Error: \n It is a direct,can not open for read or write! \n" 37、);
}
else
{
printf("Successfully opened! \n");
}
show();
break;
case 3://關閉文件
scanf("%s",name);
flag = close(name);
if(flag == -1)
{
printf("Error:\n The file is not opened ! \n");
}
else
{
printf("Successfu 38、lly closed! \n");
}
show();
break;
case 4://寫文件
if(fd ==-1)
{
printf("Error:\n The file is not opened ! \n");
}
else
{
printf("Please input the file contect:");
scanf("%s",contect);
flag=write(fd,contect,strlen(contect));
39、if(flag == 0)
{
printf("Successfully write! \n");
}
else
{
printf("Error:\n The disk size is not enough! \n");
}
}
show();
break;
case 5://讀文件
if(fd ==-1)
{
printf("Error:\n The file is not opened ! \n");
}
40、else
{
flag = read(fd,contect);
if(flag == 0)
{
for(i=0;i 41、ame);
if(flag == -1)
{
printf("Error:\n The file not exit! \n");
}
else if(flag == -2)
{
printf("Error:\n The file is opened,please first close it ! \n");
}
else if(flag == -3)
{
printf("Error:\n The delete is not file ! \n");
}
els 42、e
{
printf("Successfully delete! \n");
}
show();
break;
}
}
}
程序運行截圖:
4. 心得體會
在設計的過程中,我查詢了不少相關資料,不斷地發(fā)現(xiàn)問題、提出問題、解決問題。用C做程序開發(fā)語言,讓我重新認識了C的基礎,在新語言不斷出現(xiàn)并發(fā)展迅速的今天,重新體會到C的基礎性、重要性,以及面對過程,面對函數(shù)式的編程方式。
在對自己所編寫的源程序段的糾錯的過程中,使我更好的理解了操作系統(tǒng)中文件系統(tǒng)的理論知識,同時在編程時用到了模塊化的設計思想,這種編程方法可以使我們的編程更簡單,可以使我們的查錯與糾錯變得更加方便。
總的來說通過這次的設計學習使我學到了很多在平時的學習中學不到的很多東西,對操作系統(tǒng)有了更深一層的了解,同時也提高了C語言的能力,由于時間以及個人知識的問題,因此有很多的地方還需要改進。在以后的學習中還要更加努力。
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運動會安全工作預案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個人工作總結(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動總結+在機關“弘揚憲法精神推動發(fā)改工作高質量發(fā)展”專題宣講報告會上的講話
- 2024年XX村合作社年報總結
- 2024-2025年秋季第一學期初中歷史上冊教研組工作總結
- 2024年小學高級教師年終工作總結匯報
- 2024-2025年秋季第一學期初中物理上冊教研組工作總結
- 2024年xx鎮(zhèn)交通年度總結
- 2024-2025年秋季第一學期小學語文教師工作總結
- 2024年XX村陳規(guī)陋習整治報告
- 2025年學校元旦迎新盛典活動策劃方案
- 2024年學校周邊安全隱患自查報告
- 2024年XX鎮(zhèn)農村規(guī)劃管控述職報告