二级文件管理课程设计.docx

上传人:b****1 文档编号:23091525 上传时间:2023-04-30 格式:DOCX 页数:30 大小:22.31KB
下载 相关 举报
二级文件管理课程设计.docx_第1页
第1页 / 共30页
二级文件管理课程设计.docx_第2页
第2页 / 共30页
二级文件管理课程设计.docx_第3页
第3页 / 共30页
二级文件管理课程设计.docx_第4页
第4页 / 共30页
二级文件管理课程设计.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

二级文件管理课程设计.docx

《二级文件管理课程设计.docx》由会员分享,可在线阅读,更多相关《二级文件管理课程设计.docx(30页珍藏版)》请在冰豆网上搜索。

二级文件管理课程设计.docx

二级文件管理课程设计

操作系统二级文件管理课程设计

 

课程设计名称:

二级文件管理系统

专业班级:

学生姓名:

学号

指导老师:

 

一、设计目的

通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。

二、设计内容

为linux系统设计一个简单的二级文件系统。

要求做到以下几点:

(1)可以实现下列几条命令(至少4条);

login用户登陆

dir列文件目录

create创建文件

delete删除文件

open打开文件

close关闭文件

read读文件

write写文件

rename重命名

(2)列目录时要列出文件名、物理地址、保护码和文件长度;

(3)源文件可以进行读写保护。

三、程序设计

1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。

2、文件物理结构可采用显式链接或其他方法。

3、磁盘空闲空间的管理可选择位示图或其他方法。

如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。

4、文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。

5、设计一个较实用的用户界面,方便用户使用。

要求提供以下相关文件操作:

用户登录、创建目录、删除目录、创建文件、删除文件、读文件、写文件、

重命名、退出。

四、源代码

1、FileSystem.h

#defineDIR_LENGTH1024//路径最长可达100字节

#defineMAX_WRITE1024*128//写入文字可达128k字节

#defineMEM_D_SIZE1024*1024//1M磁盘空间

#defineDISKSIZE1024//磁盘块的大小1K

#defineMSD5//最大子目录数5

#defineDISK_NUMMEM_D_SIZE/DISKSIZE//磁盘块数目1024=1M/1K

#defineFATSIZEDISK_NUM*sizeof(structFatItem)//FAT表大小1024*8=8K

#defineMOFN5//最大文件打开数5

#defineROOT_DISK_NOFATSIZE/DISKSIZE+1//根目录起始盘块号9

#defineROOT_DISK_SIZEsizeof(structDirect)//根目录大小196

#defineLOGIN15

#defineNAME_LONG1

#defineNOT_EXSIT-1

#defineNOT_OPEN-1

#defineDIR_FULL-2

#defineOPEN_FULL-3

#defineALREADY-4

#defineNOT_R_W-4

#defineDISK_FULL-5

#defineNOT_EXIT-1

structFatItem//size8

{intitem;//存放文件下一个磁盘的指针

charem_disk;//磁盘块是否空闲标志位,0空闲

};

structDirect

{structFCB

{charname[8];//文件/目录名8位

charproperty;//属性1位目录0位普通文件

intsize;//文件/目录字节数、盘块数)

intfirstDisk;//文件/目录起始盘块号

intnext;//子目录起始盘块号

intsign;//1是根目录0不是根目录

}directItem[MSD+2];//最大子目录5

};

structOpenTable

{structOpenTableItem

{charname[9];//文件名

intfirstdisk;//起始盘块号

intsize;//文件的大小

charopen_flag;//文件打开标志:

'1':

打开。

'0':

未打开

}openitem[MOFN];//最大文件打开数5

intcur_size;//当前打文件的数目

};

structFatItem*fat;//FAT表

structDirect*root;//根目录

structDirect*cur_dir;//当前目录

structOpenTableuser_openTable;//文件打开表

intfd=-1;//文件打开表的序号

char*bufferdir;//记录当前路径的名称

char*fdisk;//虚拟磁盘起始地址

intcur_user;

intfind_N=0;

voidinit();

voidformat();

voidenter();

voidassign();

intcreate(char*name);

intopen(char*name);

intclose(char*name);

intrename();

intwrite(intfd,char*buf,intlen,char*name);

intread(intfd,char*buf,char*name);

intdel(char*name);

voiddir();

intlogin();

voidhelpMenu();

voidcurrentPath();

2、FileSystem.cpp

#include

#include

#include"conio.h"

#include"FileSystem.h"

#include

intstatue=0;

charuser[20]="li";

charpassword[20]="123";

intmain()

{FILE*fp;

charch;

charcmd[13];

charname[10];

inti,flag;

char*contect;

helpMenu();

while((flag=login())!

=LOGIN)

{printf("密码不正确!

\n");

printf("请输入正确的用户名和密码!

\n");

}

contect=(char*)malloc(MAX_WRITE*sizeof(char));

if((fp=fopen("disk.bat","rb"))==NULL)//创建一个文件

{

printf("Willyouinitializethedisk?

(yorn)");

scanf("%s",&ch);

if(ch=='y')

{init();

printf("InitializeSucceed!

\n");}

else

{return0;}

}

enter();

//分析命令

while

(1)

{printf("%s/>",bufferdir);

scanf("%s",cmd);

if(strcmp(cmd,"help")==0||strcmp(cmd,"?

")==0)

{helpMenu();}

elseif(strcmp(cmd,"model")==0)

{printf("需要修改密码么(y/n)");

scanf("%s",&ch);

if(ch=='y')

{printf("请输入密码\b");

scanf("%s",&password);

printf("修改成功");}

else

{printf("退出修改密码\n");}

}

elseif(strcmp(cmd,"login")==0)

{while(login()!

=LOGIN)

{printf("请输入正确的用户名或密码\n");}

}

elseif(strcmp(cmd,"quit")==0)

{free(contect);

exit

(1);

return0;

}

elseif(strcmp(cmd,"create")==0)

{scanf("%s",name);

flag=create(name);

//关于创建文件共实现四个判断

if(flag==NAME_LONG)

{//文件名太长

printf("Error:

\n文件的名称太长!

\n");}

elseif(flag==DIR_FULL)

{//目录下文件数超

printf("Error:

\n该目录下的文件和目录数已满!

\n");}

elseif(flag==ALREADY)

{//重名

printf("Error:

\n该目录下已存在该文件!

\n");}

elseif(flag==DISK_FULL)

{//磁盘空间满

printf("Error:

\n磁盘空间已满!

\n");}

else

{printf("成功创建文件!

\n");}

}

elseif(strcmp(cmd,"open")==0)

{statue=1;

scanf("%s",name);

fd=open(name);

if(fd==NOT_EXSIT)

{printf("Error:

\n所要打开的文件不存在!

\n");}

else

{printf("打开成功!

\n");}

}

elseif(strcmp(cmd,"write")==0)

{statue=2;

scanf("%s",name);

if(fd==NOT_OPEN)

{

printf("Error:

\n该文件没有打开,请打开后再写入\n");

}

else

{

printf("请输入文件的内容:

");

scanf("%s",contect);//connect为一个长度为128字节的变量值

flag=write(fd,contect,strlen(contect),name);

if(flag==0)//每个盘块可写入最多128字节

{

printf("已成功写入!

\n");

}

else

{

printf("Error:

\n硬盘空间不足,无法写入!

\n");

}

}

}

elseif(strcmp(cmd,"read")==0)

{

statue=3;

scanf("%s",name);

fd=open(name);

if(fd==NOT_EXSIT)

{

printf("Error:

\n不存在该文件,不能读!

\n");

}

elseif(fd==NOT_OPEN)

{

printf("该文件已经打开!

\n");

}

else

{

flag=read(fd,contect,name);

if(flag==0)

{

for(i=0;i

{

printf("%c",contect[i]);

}

printf("\t\n");

//if(gets(a)==NULL);

}

}

}

elseif(strcmp(cmd,"delete")==0)

{

scanf("%s",name);

flag=del(name);

if(flag==NOT_EXIT)

{

printf("Error:

\n该文件没有退出,不能删除!

\n");

}

elseif(flag==-NOT_OPEN)

{

printf("Error:

\n该文件是打开的,请先关闭它,然后再删除!

\n");

}

else

{

printf("已成功删除文件!

\n");

}

}

elseif(strcmp(cmd,"dir")==0)

{

dir();

}

elseif(strcmp(cmd,"format")==0)

{

format();

puts("formatsuccess!

");

}

elseif(strcmp(cmd,"close")==0)

{

statue=0;

inti;

for(i=0;i

{

if(!

strcmp(user_openTable.openitem[i].name,name))

break;

}

if(i>=MOFN)

printf("Error:

\n该文件没有打开,无需关闭!

\n");

else

{

//清空该文件的用户打开表项

strcpy(user_openTable.openitem[i].name,"");

user_openTable.openitem[i].firstdisk=-1;

user_openTable.openitem[i].size=0;

user_openTable.openitem[i].open_flag='0';

user_openTable.cur_size--;

printf("%s","closesuccess!

\n");

continue;

}

}

elseif(strcmp(cmd,"rename")==0)

{

if(statue>=1)

{

printf("打开文件不能重命名");

}

else{

printf("%d",statue);

flag=rename();

if(flag==NOT_EXIT)

{

printf("文件不存在\n");

}

}

}

else{

printf("\n指令错误!

\n");

}

}

}

intlogin()

{

charinuser[20];

charinpassword[20];

charch;

intj=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)//将输入的密码转换成字符****

{

putchar('*');

inpassword[j]=ch;

j++;

}

inpassword[j]='\0';//字符数组的最后一位为'\0',故要加该语句

//printf("您输入的密码是:

%s",inpassword);

printf("\n");

getchar();

if((strcmp(inuser,user)==0)&&(strcmp(inpassword,password)==0))

{

bufferdir="wang";

returnLOGIN;

}

else

{

return0;

}

 

}

 

voidinit()

{

fdisk=(char*)malloc(MEM_D_SIZE*sizeof(char));//分配空间

format();

}

voidformat()

{

inti;

FILE*fp;

fat=(structFatItem*)(fdisk+DISKSIZE);//FAT1M

/*-----初始化FAT表fat[1]---fat[7]------------*/

for(i=1;i

{

fat[i].item=i+1;

fat[i].em_disk='1';

}

for(i=ROOT_DISK_NO;i

{

fat[i].item=-1;//item为-1即表示还没有使用

fat[i].em_disk='0';

}

root=(structDirect*)(fdisk+DISKSIZE+FATSIZE);//根目录的地址1k+8k

root->directItem[0].sign=1;//根目录

root->directItem[0].firstDisk=ROOT_DISK_NO;//=9;//第9个盘块开始

strcpy(root->directItem[0].name,".");//定义其文件名为'.'

root->directItem[0].next=root->directItem[0].firstDisk;//子目录的起始盘块是根目录所在第一个盘块,即未出

//第一块

root->directItem[0].property='1';//1根目录

root->directItem[0].size=ROOT_DISK_SIZE;//即一个根目录项的空间大小196字节

/*指向上一级目录的目录项-----回指指针*/

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;

for(i=2;i

{//子目录最大只有5个表项

root->directItem[i].sign=0;

root->directItem[i].firstDisk=-1;

strcpy(root->directItem[i].name,"");

root->directItem[i].next=-1;

root->directItem[i].property='0';

root->directItem[i].size=0;

}

 

if((fp=fopen("disk.bat","wb"))==NULL)

{

printf("Error:

\nCan'tOpenTheFile\n");

return;

}

//虚拟到物理

if(fwrite(fdisk,MEM_D_SIZE,1,fp)!

=1)

{

printf("Error:

\n文件写入错误!

\n");

}

fclose(fp);

}

voidenter()

{

FILE*fp;

inti;

//重新回到初始空间---虚拟中操作

fdisk=(char*)malloc(MEM_D_SIZE*sizeof(char));//申请1M空间

//判断disk文件是否存在

if((fp=fopen("disk.bat","rb"))==NULL)

{

printf("Error:

\n打开文件出错!

\n");

return;

}

if(!

fread(fdisk,MEM_D_SIZE,1,fp)){//把磁盘文件disk.dat读入虚拟磁盘空间(内存)

//回到新申请的fdisk中

printf("Error:

\n不能读文件!

\n");

exit(0);

}

fat=(structFatItem*)(fdisk+DISKSIZE);

root=(structDirect*)(fdisk+DISKSIZE+FATSIZE);

fclose(fp);

//最多能打开5个文件

for(i=0;i

{

strcpy(user_openTable.openitem[i].name,"");

user_openTable.openitem[i].firstdisk=-1;

user_openTable.openitem[i].size=0;

}

user_openTable.cur_size=0;

cur_dir=root;

bufferdir=(char*)malloc(DIR_LENGTH*sizeof(char));

strcpy(bufferdir,"Root:

");

}

intcreate(char*name)

{

inti,j;

//文件名超过8字符

if(strlen(name)>8)//文件名大于8位

return(NAME_LONG);

//重名check

for(j=2;j

{

//如果同名则跳出

if(!

strcmp(cur_dir->directItem[j].name,name)&&cur_dir->directItem[j].prop

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 自我管理与提升

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1