二級文件管理課程設(shè)計(jì)
《二級文件管理課程設(shè)計(jì)》由會員分享,可在線閱讀,更多相關(guān)《二級文件管理課程設(shè)計(jì)(17頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、 操作系統(tǒng)二級文件管理課程設(shè)計(jì) 課程設(shè)計(jì)名稱: 二級文件管理系統(tǒng) 專 業(yè)班 級 : 學(xué) 生姓 名 : 學(xué) 號 指 導(dǎo) 老 師 : 一、 設(shè)計(jì)目的 通過一個簡單多用戶文件系統(tǒng)的設(shè)計(jì),加深理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實(shí)現(xiàn)。 二、設(shè)計(jì)內(nèi)容 為linux系統(tǒng)設(shè)計(jì)一個簡單的二級文件系統(tǒng)。要求做到以下幾點(diǎn): (1)可以實(shí)現(xiàn)下列幾條命令(至少4條); l
2、ogin 用戶登陸 dir 列文件目錄 create 創(chuàng)建文件 delete 刪除文件 open 打開文件 close 關(guān)閉文件 read 讀文件 write 寫文件 rename 重命名 (2)列目錄時要列出文件名、物理地址、保護(hù)碼和文件長度; (3)源文件可以進(jìn)行讀寫保護(hù)。 三、程序設(shè)計(jì) 1、在內(nèi)存中開辟一個虛擬磁盤空間作為文件存儲器,在其上實(shí)現(xiàn)一個多用戶多目錄的文件系統(tǒng)。 2、文件物理結(jié)構(gòu)可采用顯式鏈接或其他方法。 3、磁盤空閑空間的管理可選擇位示
3、圖或其他方法。如果采用位示圖來管理文件存儲空間,并采用顯式鏈接分配方式,則可以將位示圖合并到FAT中。 4、文件目錄結(jié)構(gòu)采用多用戶多級目錄結(jié)構(gòu),每個目錄項(xiàng)包含文件名、物理地址、長度等信息,還可以通過目錄項(xiàng)實(shí)現(xiàn)對文件的讀和寫的保護(hù)。 5、設(shè)計(jì)一個較實(shí)用的用戶界面,方便用戶使用。要求提供以下相關(guān)文件操作:用戶登錄、創(chuàng)建目錄、刪除目錄、創(chuàng)建文件、刪除文件、讀文件、寫文件、 重命名、退出。 四、源代碼 1、FileSystem.h #define DIR_LENGTH 1024 //路徑最長可達(dá)100字節(jié) #define MAX
4、_WRITE 1024*128 //寫入文字可達(dá)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; //磁盤塊是否空閑標(biāo)志位, 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; //文件打開標(biāo)志:1:打開。0:未打開 }openitem[MOFN];
10、 //最大文件打開數(shù) 5 int cur_size; //當(dāng)前打文件的數(shù)目 }; struct FatItem *fat; //FAT表 struct Direct *root; //根目錄 struct Direct *cur_dir; //當(dāng)前目錄 struct OpenTable user_op
11、enTable; //文件打開表 int fd=-1; //文件打開表的序號 char *bufferdir; //記錄當(dāng)前路徑的名稱 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
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)建文件共實(shí)現(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 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; //即一個根目錄項(xiàng)的空間 35、大小 196字節(jié)
/*指向上一級目錄的目錄項(xiàng)-----回指指針*/
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;i 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;j 43、
}
//如果沒循環(huán)完,則是因?yàn)槲募汛嬖?
if(j 44、>=MSD+2) //無空目錄項(xiàng)
return(-2);
for(j=ROOT_DISK_NO+1;j 45、 //確實(shí)如此
if(j>=DISK_NUM)
return(DISK_FULL);
fat[j].em_disk = 1; //將空閑塊置為已經(jīng)分配
//填寫目錄項(xià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;i 47、if(i>=MSD+2)
return(NOT_EXSIT);
//查找一個空閑用戶打開表項(xiàng)
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++;
//返回用戶打開表表項(xiàng)的序號
return(j);
}
int close(char *name)
{ 49、
int i;
for(i=0;i 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)表項(xiàng)第一個盤塊號
item 51、 = user_openTable.openitem[fd].firstdisk;
//找到當(dāng)前目錄所對應(yīng)表項(xiàng)的序號
for(i=2;i 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; i 54、len2+1; /*--還需要多少塊磁盤塊-*/
for(j=0;j 55、最后要分配的一塊-*/
{
for(k=0;k 56、的磁盤的空閑標(biāo)志位為已分配-*/
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; /*--計(jì)算文件所占磁盤 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、 //文件是否存在,以文件名為標(biāo)準(zhǔn)
{
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;i 62、intf("--%d--",i);
break;
}
if(i>=MSD+2) //--如果不在當(dāng)前目錄中
return(NOT_EXIT);
for(i=0;i 63、while(item!=-1) /*--釋放空間,將FAT表對應(yīng)項(xiàng)進(jìn)行修改-*/
{
temp = fat[item].item;
fat[item].item = -1;
fat[item].em_disk =0;
item = temp;
}
//釋放目錄項(xiàng)
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;i 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)2圖形與幾何第7課時圖形的位置練習(xí)課件新人教版
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)2圖形與幾何第1課時圖形的認(rèn)識與測量1平面圖形的認(rèn)識練習(xí)課件新人教版
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)1數(shù)與代數(shù)第10課時比和比例2作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊4比例1比例的意義和基本性質(zhì)第3課時解比例練習(xí)課件新人教版
- 2023年六年級數(shù)學(xué)下冊3圓柱與圓錐1圓柱第7課時圓柱的體積3作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊3圓柱與圓錐1圓柱第1節(jié)圓柱的認(rèn)識作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊2百分?jǐn)?shù)(二)第1節(jié)折扣和成數(shù)作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)下冊1負(fù)數(shù)第1課時負(fù)數(shù)的初步認(rèn)識作業(yè)課件新人教版
- 2023年六年級數(shù)學(xué)上冊期末復(fù)習(xí)考前模擬期末模擬訓(xùn)練二作業(yè)課件蘇教版
- 2023年六年級數(shù)學(xué)上冊期末豐收園作業(yè)課件蘇教版
- 2023年六年級數(shù)學(xué)上冊易錯清單十二課件新人教版
- 標(biāo)準(zhǔn)工時講義
- 2021年一年級語文上冊第六單元知識要點(diǎn)習(xí)題課件新人教版
- 2022春一年級語文下冊課文5識字測評習(xí)題課件新人教版
- 2023年六年級數(shù)學(xué)下冊6整理和復(fù)習(xí)4數(shù)學(xué)思考第1課時數(shù)學(xué)思考1練習(xí)課件新人教版