二級文件管理課程設(shè)計

上傳人:燈火****19 文檔編號:20559445 上傳時間:2021-03-29 格式:DOC 頁數(shù):17 大?。?0KB
收藏 版權(quán)申訴 舉報 下載
二級文件管理課程設(shè)計_第1頁
第1頁 / 共17頁
二級文件管理課程設(shè)計_第2頁
第2頁 / 共17頁
二級文件管理課程設(shè)計_第3頁
第3頁 / 共17頁

下載文檔到電腦,查找使用更方便

15 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《二級文件管理課程設(shè)計》由會員分享,可在線閱讀,更多相關(guān)《二級文件管理課程設(shè)計(17頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、 操作系統(tǒng)二級文件管理課程設(shè)計 課程設(shè)計名稱: 二級文件管理系統(tǒng) 專 業(yè)班 級 : 學 生姓 名 : 學 號 指 導 老 師 : 一、 設(shè)計目的 通過一個簡單多用戶文件系統(tǒng)的設(shè)計,加深理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實現(xiàn)。 二、設(shè)計內(nèi)容 為linux系統(tǒng)設(shè)計一個簡單的二級文件系統(tǒng)。要求做到以下幾點: (1)可以實現(xiàn)下列幾條命令(至少4條); l

2、ogin 用戶登陸 dir 列文件目錄 create 創(chuàng)建文件 delete 刪除文件 open 打開文件 close 關(guān)閉文件 read 讀文件 write 寫文件 rename 重命名 (2)列目錄時要列出文件名、物理地址、保護碼和文件長度; (3)源文件可以進行讀寫保護。 三、程序設(shè)計 1、在內(nèi)存中開辟一個虛擬磁盤空間作為文件存儲器,在其上實現(xiàn)一個多用戶多目錄的文件系統(tǒng)。 2、文件物理結(jié)構(gòu)可采用顯式鏈接或其他方法。 3、磁盤空閑空間的管理可選擇位示

3、圖或其他方法。如果采用位示圖來管理文件存儲空間,并采用顯式鏈接分配方式,則可以將位示圖合并到FAT中。 4、文件目錄結(jié)構(gòu)采用多用戶多級目錄結(jié)構(gòu),每個目錄項包含文件名、物理地址、長度等信息,還可以通過目錄項實現(xiàn)對文件的讀和寫的保護。 5、設(shè)計一個較實用的用戶界面,方便用戶使用。要求提供以下相關(guān)文件操作:用戶登錄、創(chuàng)建目錄、刪除目錄、創(chuàng)建文件、刪除文件、讀文件、寫文件、 重命名、退出。 四、源代碼 1、FileSystem.h #define DIR_LENGTH 1024 //路徑最長可達100字節(jié) #define MAX

4、_WRITE 1024*128 //寫入文字可達128k字節(jié) #define MEM_D_SIZE 1024*1024 //1M磁盤空間 #define DISKSIZE 1024 //磁盤塊的大小 1K #define MSD 5 //最大子目錄數(shù) 5 #define DISK_NUM MEM_D_SIZE/DISKSIZE

5、//磁盤塊數(shù)目 1024=1M/1K #define FATSIZE DISK_NUM*sizeof(struct FatItem) //FAT表大小1024*8=8K #define MOFN 5 //最大文件打開數(shù) 5 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目錄起始盤塊號 9 #define ROOT_DISK_SIZE sizeof(struct Direct) //根目錄大小 196 #define LOGI

6、N 15 #define NAME_LONG 1 #define NOT_EXSIT -1 #define NOT_OPEN -1 #define DIR_FULL -2 #define OPEN_FULL -3 #define ALREADY -4 #define NOT_R_W -4 #define DISK_FULL -5 #define NOT_EXIT -1 struct FatItem // size 8 { int item;

7、 //存放文件下一個磁盤的指針 char em_disk; //磁盤塊是否空閑標志位, 0 空閑 }; struct Direct { struct FCB { char name[8]; //文件/目錄名 8位 char property; //屬性 1位目錄 0位普通文件 int size;

8、//文件/目錄字節(jié)數(shù)、盤塊數(shù)) int firstDisk; //文件/目錄 起始盤塊號 int next; //子目錄起始盤塊號 int sign; //1是根目錄 0不是根目錄 }directItem[MSD+2]; //最大子目錄 5 }; struct OpenTable {

9、 struct OpenTableItem { char name[9]; //文件名 int firstdisk; //起始盤塊號 int size; //文件的大小 char open_flag; //文件打開標志:1:打開。0:未打開 }openitem[MOFN];

10、 //最大文件打開數(shù) 5 int cur_size; //當前打文件的數(shù)目 }; struct FatItem *fat; //FAT表 struct Direct *root; //根目錄 struct Direct *cur_dir; //當前目錄 struct OpenTable user_op

11、enTable; //文件打開表 int fd=-1; //文件打開表的序號 char *bufferdir; //記錄當前路徑的名稱 char *fdisk; //虛擬磁盤起始地址 int cur_user; int find_N = 0; void init(); void format(); voi

12、d enter(); void assign(); int create(char *name); int open(char *name); int close(char *name); int rename(); int write(int fd,char *buf,int len,char *name); int read(int fd,char *buf,char *name); int del(char *name); void dir(); int login(); void helpMenu(); void currentPath(); 2、FileSy

13、stem.cpp #include #include #include"conio.h" #include "FileSystem.h" #include int statue=0; char user[20]="li"; char password[20]="123"; int main() { FILE *fp; char ch; char cmd[13]; char name[10]; int i,flag; char *contect; helpMenu(); whil

14、e((flag=login())!=LOGIN) { printf("密碼不正確!\n"); printf("請輸入正確的用戶名和密碼!\n"); } contect = (char *)malloc(MAX_WRITE*sizeof(char)); if((fp=fopen("disk.bat","rb"))==NULL) //創(chuàng)建一個文件 { printf(" Will you initialize the disk? (y or n

15、)"); scanf("%s",&ch); if(ch==y) { init(); printf(" Initialize Succeed! \n");} else {return 0;} } enter(); //分析命令 while(1) { printf("%s/>",bufferdir); scanf("%s",cmd); if(strcmp(cmd,"help") == 0 || strcmp(cmd,"?") == 0) { helpMenu();} else if

16、(strcmp(cmd,"model") == 0) { printf("需要修改密碼么(y/n)"); scanf("%s",&ch); if (ch==y) { printf("請輸入密碼\b"); scanf("%s",&password); printf("修改成功");} else {printf("退出修改密碼\n"); } } else if(strcmp(cmd,"login") == 0) { while (login()!=LOGIN) { printf(

17、"請輸入正確的用戶名或密碼\n");} } else if(strcmp(cmd,"quit") == 0) { free(contect); exit(1); return 0; } else if(strcmp(cmd,"create") == 0) { scanf("%s",name); flag = create(name); //關(guān)于創(chuàng)建文件共實現(xiàn)四個判斷 if(flag==NAME_LONG) {//文件名太長 printf("Error: \n 文件的名稱

18、太長 !\n");} else if(flag==DIR_FULL) {//目錄下文件數(shù)超 printf("Error: \n 該目錄下的文件和目錄數(shù)已滿 !\n");} else if(flag==ALREADY) {//重名 printf("Error: \n 該目錄下已存在該文件 !\n");} else if(flag==DISK_FULL) {//磁盤空間滿 printf("Error: \n 磁盤空間已滿!\n");} else { printf(" 成功創(chuàng)建文件! \n"); }

19、 } else if(strcmp(cmd,"open") ==0) { statue=1; scanf("%s",name); fd = open(name); if(fd == NOT_EXSIT) { printf("Error: \n 所要打開的文件不存在! \n");} else {printf("打開成功! \n");} } else if(strcmp(cmd,"write") == 0) { statue=2; scanf("%s",name); i

20、f(fd == NOT_OPEN) { printf("Error:\n 該文件沒有打開,請打開后再寫入 \n"); } else { printf("請輸入文件的內(nèi)容: "); scanf("%s",contect); //connect為一個長度為128字節(jié)的變量值 flag=write(fd,contect,strlen(contect),name); if(flag == 0) //每個盤塊可寫入最多128字節(jié) { pri

21、ntf("已成功寫入! \n"); } else { printf("Error:\n 硬盤空間不足,無法寫入! \n"); } } } else if(strcmp(cmd,"read") == 0) { statue=3; scanf("%s",name); fd = open(name); if(fd == NOT_EXSIT) { printf("Error:\n 不存在該文件,不能讀! \n"); } else if (fd == NO

22、T_OPEN) { printf(" 該文件已經(jīng)打開! \n"); } else { flag = read(fd,contect,name); if(flag == 0) { for(i=0;i

23、 // if(gets(a)==NULL); } } } else if(strcmp(cmd,"delete") == 0) { scanf("%s",name); flag = del(name); if(flag == NOT_EXIT) { printf("Error:\n 該文件沒有退出,不能刪除! \n"); } else if(flag == -NOT_OPEN) { printf("Error:\n 該文件是打開的,請先關(guān)閉它,然后再刪除! \n");

24、 } else { printf("已成功刪除文件! \n"); } } else if(strcmp(cmd,"dir") ==0) { dir(); } else if(strcmp(cmd,"format") == 0) { format(); puts("format success!"); } else if(strcmp(cmd,"close") == 0) { statue=0; i

25、nt i; for(i=0;i=MOFN) printf("Error:\n 該文件沒有打開,無需關(guān)閉!\n"); else { //清空該文件的用戶打開表項 strcpy(user_openTable.openitem[i].name,""); user_

26、openTable.openitem[i].firstdisk = -1; user_openTable.openitem[i].size = 0; user_openTable.openitem[i].open_flag = 0; user_openTable.cur_size--; printf("%s","close success!\n"); continue; } } else if (strcmp(cmd,"rename") == 0) { if (statue>=1) {

27、 printf("打開文件不能重命名"); } else{ printf("%d",statue); flag=rename(); if (flag==NOT_EXIT) { printf("文件不存在\n"); } } } else{ printf("\n 指令錯誤! \n"); } } } int login() { char inuser[20]; char inpassword[20]; char ch; int

28、j=0; printf("請輸入用戶名\n"); scanf("%s",inuser); while((strcmp(inuser,user)!=0)) { printf("該用戶不存在!\n"); printf("***************\n"); printf("請輸入正確的用戶名:\n"); scanf("%s",inuser); } printf("請輸入密碼\n"); while((ch=getch())!=13) //將輸入的密碼轉(zhuǎn)換成字符**** { putchar(*); inpa

29、ssword[j]=ch; j++; } inpassword[j]=\0; //字符數(shù)組的最后一位為\0,故要加該語句 //printf("您輸入的密碼是:%s",inpassword); printf("\n"); getchar(); if ((strcmp(inuser,user)==0)&&(strcmp(inpassword,password)==0)) { bufferdir="wang"; return LOGIN; } else { return 0; }

30、} void init() { fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); //分配空間 format(); } void format() { int i; FILE *fp; fat = (struct FatItem *)(fdisk+DISKSIZE); //FAT 1M

31、 /*-----初始化FAT表 fat[1]---fat[7]------------*/ for(i=1;i

32、 for(i=ROOT_DISK_NO;i

33、即表示還沒有使用 fat[i].em_disk = 0; } root = (struct Direct *)(fdisk+DISKSIZE+FATSIZE); //根目錄的地址 1k+8k root->directItem[0].sign = 1; //根目錄 root->directItem[0].firstDisk = ROOT_DISK_NO ; // = 9; //第9個盤塊開始 strcpy(root->directItem[0].name,".");

34、 //定義其文件名為 . root->directItem[0].next = root->directItem[0].firstDisk; //子目錄的起始盤塊是根目錄所在第一個盤塊,即未出 //第一塊 root->directItem[0].property = 1; //1根目錄 root->directItem[0].size = ROOT_DISK_SIZE; //即一個根目錄項的空間

35、大小 196字節(jié) /*指向上一級目錄的目錄項-----回指指針*/ root->directItem[1].sign = 1; root->directItem[1].firstDisk = ROOT_DISK_NO; strcpy(root->directItem[1].name,".."); root->directItem[1].next = root->directItem[0].firstDisk; root->directItem[1].property = 1; root->directItem[1].size = ROOT_DISK_SIZE;

36、 for(i=2;idirectItem[i].sign = 0; root->directItem[i].firstDisk = -1; strcpy(root->directItem[i].name,""); root->directItem[i].next = -1; root->directI

37、tem[i].property = 0; root->directItem[i].size = 0; } if((fp = fopen("disk.bat","wb"))==NULL) { printf("Error:\n Cant Open The File \n"); return; } //虛擬到物理 if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) { printf("Error

38、:\n 文件寫入錯誤! \n"); } fclose(fp); } void enter() { FILE *fp; int i; //重新回到初始空間---虛擬中操作 fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); //申請 1M空間 //判斷disk文件是否存在 if((fp=fopen("disk.bat","rb"))==NULL) { printf("Error:\n 打開文件出錯!\n"); return

39、; } if(!fread(fdisk,MEM_D_SIZE,1,fp)){ //把磁盤文件disk.dat 讀入虛擬磁盤空間(內(nèi)存) //回到新申請的fdisk中 printf("Error:\n 不能讀文件!\n"); exit(0); } fat = (struct FatItem *)(fdisk+DISKSIZE); roo

40、t = (struct Direct *)(fdisk+DISKSIZE+FATSIZE); fclose(fp); //最多能打開5個文件 for(i=0;i

41、size = 0; } user_openTable.cur_size = 0; cur_dir = root; bufferdir = (char *)malloc(DIR_LENGTH*sizeof(char)); strcpy(bufferdir,"Root:"); } int create(char *name) { int i,j; //文件名超過8字符 if(st

42、rlen(name)>8) //文件名大于 8位 return(NAME_LONG); //重名check for(j=2;jdirectItem[j].name,name) && cur_dir->directItem[j].property==0) break;

43、 } //如果沒循環(huán)完,則是因為文件已存在 if(jdirectItem[i].firstDisk==-1) //找到?jīng)]有用到的 break; } if(i

44、>=MSD+2) //無空目錄項 return(-2); for(j=ROOT_DISK_NO+1;j

45、 //確實如此 if(j>=DISK_NUM) return(DISK_FULL); fat[j].em_disk = 1; //將空閑塊置為已經(jīng)分配 //填寫目錄項 strcpy(cur_dir->directItem[i].name,name); cur_dir->directItem[i].firstDisk = j; cur_dir->directItem[i].size = 0;

46、 cur_dir->directItem[i].next = j; cur_dir->directItem[i].property = 0; return 0; } int open(char *name) { int i, j; for(i=2;idirectItem[i].name,name)) break; }

47、if(i>=MSD+2) return(NOT_EXSIT); //查找一個空閑用戶打開表項 for(j=0;j

48、->directItem[i].firstDisk; //cur_dir 最多5個 strcpy(user_openTable.openitem[j].name,name); user_openTable.openitem[j].size = cur_dir->directItem[i].size; user_openTable.openitem[j].open_flag = 1; user_openTable.cur_size++; //返回用戶打開表表項的序號 return(j); } int close(char *name) {

49、 int i; for(i=0;i=MOFN) return(6); //清空該文件的用戶打開表項 strcpy(user_openTable.openitem[i].name,""); user_openTable.openitem[i].firstdisk = -1; user

50、_openTable.openitem[i].size = 0; user_openTable.openitem[i].open_flag = 0; user_openTable.cur_size--; return 0; } int write(int fd, char *buf, int len,char *name) { char *first; int remain; int item, i, j, k; int ilen1, ilen2, modlen, temp; //讀取用戶打開表對應(yīng)表項第一個盤塊號 item

51、 = user_openTable.openitem[fd].firstdisk; //找到當前目錄所對應(yīng)表項的序號 for(i=2;idirectItem[i].firstDisk==item) break; } temp = i; //存放當前目錄項的下標 while(fat[item].item!=-1) { item = fat[item].item; /*-查找該文件的下一盤塊--*/ } //計算文件地址 first = fdisk+item*DIS

52、KSIZE+user_openTable.openitem[fd].size%DISKSIZE; remain = DISKSIZE-user_openTable.openitem[fd].size%DISKSIZE; //如果最后磁盤塊剩余的大小大于要寫入的文件的大小 if(remain > len) { strcpy(first,buf); user_openTable.openitem[fd].size = user_openTable.openitem[fd].size+len; cur_dir->directItem[temp].size =

53、 cur_dir->directItem[temp].size+len; } else { for(i=0; i0) ilen2 = i

54、len2+1; /*--還需要多少塊磁盤塊-*/ for(j=0;j=DISK_NUM) //如果磁盤塊已經(jīng)分配完了 return(DISK_FULL); first = fdisk+i*DISKSIZE; /*--找到的那塊空閑磁盤塊的起始地址-*/ if(j==ilen2-1) /*--如果是

55、最后要分配的一塊-*/ { for(k=0;k

56、的磁盤的空閑標志位為已分配-*/ fat[i].item = -1; //它的指針為 -1 (即沒有下一塊)-*/ } //修改長度 user_openTable.openitem[fd].size = user_openTable.openitem[fd].size+len; cur_dir->directItem[temp].size = cur_dir->directItem[temp].size+len; printf("%d\n",cur_dir->directItem[temp].size ); } retur

57、n 0; } int read(int fd, char *buf,char *name) { int len = user_openTable.openitem[fd].size; char *first; int i, j, item; int ilen1, modlen; item = user_openTable.openitem[fd].firstdisk; ilen1 = len/DISKSIZE; modlen = len%DISKSIZE; if(modlen!=0) ilen1 = ilen1+1; /*--計算文件所占磁盤

58、的塊數(shù)-*/ for(i=0;i

59、 item = fat[item].item; /*-查找下一盤塊-*/ first = fdisk+item*DISKSIZE; } } return 0; } int rename() { int i; char strrename[8]; char strnewname[8]; printf("請輸入要重命名的文件"); scanf("%s",&strrename); // printf("%s",strrename); for(i=2;i

60、 //文件是否存在,以文件名為標準 { if(!strcmp(cur_dir->directItem[i].name,strrename)) { break; } } if(i>=MSD+2) return(NOT_EXSIT); printf("請輸入新的命名(最大文件名長度為8)"); scanf("%s",&strnewname); // cur_dir->directItem[i].name=strnewname;

61、strcpy(cur_dir->directItem[i].name,strnewname); return 0; } int del(char *name) { int i,cur_item,item,temp; for(i=2;idirectItem[i].name,name) && cur_dir->directItem[i].property == 0) cur_item = i; // pr

62、intf("--%d--",i); break; } if(i>=MSD+2) //--如果不在當前目錄中 return(NOT_EXIT); for(i=0;idirectItem[cur_item].firstDisk;/*--該文件的起始盤塊號-*/

63、while(item!=-1) /*--釋放空間,將FAT表對應(yīng)項進行修改-*/ { temp = fat[item].item; fat[item].item = -1; fat[item].em_disk =0; item = temp; } //釋放目錄項 cur_dir->directItem[cur_item].sign = 0; cur_dir->directItem[cur_item].firstDisk = -1; strcpy(cur_dir->directItem[cur_item].name,""); cur_dir->

64、directItem[cur_item].next = -1; cur_dir->directItem[cur_item].property = 0; cur_dir->directItem[cur_item].size = 0; return 0; } void dir() { int i,count=0; printf("\t文件名\t | \t文件大小\t\n"); for(i=2;idirectItem[i].firstDisk!=-1) /*-如果存在子目錄-*/ {

65、 count++; if(cur_dir->directItem[i].property==0) /*-文件-*/ { printf("\t%s\t | \t %d\t \n",cur_dir->directItem[i].name,cur_dir->directItem[i].size); } else { printf("\t目錄名:"); printf("%s\t",cur_dir->directItem[i].name); } } } if(count==0){ printf("不存在

66、子目錄\n"); } } void currentPath() {printf("%s/>",bufferdir);} void helpMenu() { printf("**********二級文件管理系統(tǒng)**********\n"); printf(" quit quit the file system \n"); printf(" create create a new file\n"); printf(" delete delete a file\n"); printf(" open open a file\n"); printf(" close close an openned file\n"); printf(" write write to a file\n"); printf(" read

展開閱讀全文
溫馨提示:
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)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!

五月丁香婷婷狠狠色,亚洲日韩欧美精品久久久不卡,欧美日韩国产黄片三级,手机在线观看成人国产亚洲