六、思考题
1、文件系统要解决哪些问题?
答:通过文件系统来组织和管理在计算机中所存储的大量程序和数据;或者说,文件系统的管理功能,是通过把它所管理的程序和数据组织成一系列文件的方法来实现的。 2、什么是文件目录?文件目录中包含哪些信息?目前广泛采用的目录结构形式是哪种? 答:文件目录是一种数据结构,用于标识系统中的文件及其物理地址,供检索时使用。 文件目录中包含文件名和索引结点编号。目前广泛采用的目录结构形式是单级目录结构,双级目录结构,多级目录结构和增加删除目录。
七、源代码
#include
#define getpch(type,num) (type*)malloc(sizeof(type)*num)
struct ufd{ /* 第二级:用户文件目录 UFD */ char filename[10]; /* 文件名 */
char procode[3]; /* 保护码 1:读 2:写 3:执行*/ int length; /* 文件长度 */ }*p;
typedef struct ufd UFD;
struct mdf{ /* 第一级:主目录 MDF */ char name[10]; /* 用户名 */
UFD* directory; /* 文件目录指针 */ }maindir[10]; /* 用户数组 */
typedef struct mdf MDF;
struct afd{ /* 文件运行目录 */ char filename[10]; /* 文件名 */
char procode[3]; /* 保护码 1:读 2:写 3:执行*/
int rw; /* 读写指针 初始状态读:0 写:文件长度 */ }afd[5];
int usernum,opennum; /* 登陆用户数量 打开文件数量*/ int filenum[10]; /* 所有的用户目录下的文件数目*/ char username[10]; /* 当前登陆系统的用户名*/
char command[][10]={\ /*文件操作命令*/
void login() /*用户注册,信息写入database文件*/ { int i,j;
FILE *fp; int loginum;
int creatnum[10];
printf(\注册页面=====\\n\\n\ printf(\请输入注册的用户数量:\ scanf(\ for(i=0;i printf(\请输入第%d个用户名:\ scanf(\ } for(i=0;i printf(\请输入%s用户新建文件数(小于10):\ scanf(\ p=getpch(UFD,10); maindir[i].directory=p; for(j=0;j printf(\请输入新建文件名:\ scanf(\ printf(\请输入要建立的文件的属性(1:读,2:写,3:执行.):\ scanf(\ printf(\请输入要构造的文件的长度:\ scanf(\ } } fp=fopen(\ fwrite(&loginum,sizeof(int),1,fp); /* 写已注册用户数量到dat文件*/ for(i=0;i fwrite(maindir[i].name,sizeof(char)*10,1,fp); /* 写已注册用户名到dat文件*/ } for(i=0;i { fwrite(&creatnum[i],sizeof(int),1,fp); /* 写用户新建文件数量到dat文件*/ p=maindir[i].directory; /* UFD获得文件目录指针*/ fwrite(p,sizeof(UFD),10,fp); /* 写用户文件目录指针地址到dat文件*/ } fclose(fp); printf(\注册完毕=====\\n\ printf(\ system(\ system(\} void init() /*初始化读入login信息*/ { int i,j; FILE *fp; fp=fopen(\ if(fp==NULL) { printf(\警告:根目录不存在记录,请先注册用户\\n\ login(); fp=fopen(\ } fread(&usernum,sizeof(int),1,fp); /* 读入已注册用户数量*/ for(i=0;i fread(maindir[i].name,sizeof(char)*10,1,fp); /* 读入已注册用户名*/ p=getpch(UFD,10); maindir[i].directory=p; } for(i=0;i fread(&j,sizeof(int),1,fp); filenum[i]=j; /*读入用户新建文件数量*/ p=maindir[i].directory; /*获得文件目录指针*/ fread(p,sizeof(UFD),10,fp); /*读入用户文件目录指针地址p*/ } opennum=0; /*运行文件数*/ } void createfile(int userid) /*新建文件*/ { system(\ char cfilename[10]; int filelen,i; char code[3]; if(filenum[userid]>=10)/*如果用户的文件已有10个*/ { printf(\用户的文件数量已达到上限,即10个!\\n\ return ; } printf(\新建文件页面=====\\n\\n\ printf(\请输入要建立的文件名:\ scanf(\ for(i=0;i if(strcmp((p+i)->filename,cfilename)==0) { printf(\文件名%s已存在!\\n\ system(\ system(\ return ; } } printf(\请输入要建立的文件的属性(1:读 2:写 3:执行):\ scanf(\ printf(\请输入要建立的文件的长度:\ scanf(\ strcpy(p[filenum[userid]].filename,cfilename); /*添加新文件名*/ strcpy(p[filenum[userid]].procode,code); /*添加保护码*/ p[filenum[userid]].length=filelen; /*添加文件长度*/ filenum[userid]=filenum[userid]+1; /*更新文件数量*/ printf(\文件建立成功!==\\n\ system(\ system(\} void deletefile(int userid) /*删除文件*/ { system(\ char dfilename[10]; int i,j; printf(\删除文件页面=====\\n\\n\ printf(\请输入要删除的文件名:\ scanf(\ for(i=0;i if(strcmp(p[i].filename,dfilename)==0)/*找到要删除的文件*/ { for(j=i;j strcpy(p[j].filename,p[j+1].filename); strcpy(p[j].procode,p[j+1].procode); p[j].length=p[j+1].length; if(j==filenum[userid]-1) { strcpy(p[j+1].filename,\ strcpy(p[j+1].filename,\ p[j+1].length=0; free(p+j+1); } } filenum[userid]--; printf(\文件删除成功!=====\\n\ system(\ system(\ return ; } } printf(\找不到要删除的文件!\\n\ system(\ system(\} void openfile(int userid) /*打开文件*/ { system(\ int i; char ofilename[10]; printf(\打开文件页面=====\\n\\n\ if(opennum>=5) { printf(\打开超过5个文件!\\n\ return ; } printf(\请输入要打开的文件的文件名:\ scanf(\ for(i=0;i if(strcmp(afd[i].filename,ofilename)==0) /*文件已经打开*/ { printf(\文件%s已打开!\\n\ return ; } } for(i=0;i if(strcmp(p[i].filename,ofilename)==0) /*找到该文件*/ { strcpy(afd[opennum].filename,ofilename); /*文件运行目录添加打开文件名*/ strcpy(afd[opennum].procode,p[i].procode); /*文件运行目录添加文件保护码*/ afd[opennum].rw=0; /*更新文件运行目录文件读写指针*/ opennum++; printf(\文件%s已打开!\\n\ printf(\打开文件成功=====\\n\\n\ system(\ system(\ return ; } } printf(\打不到要文件打开的文件,打开文件失败!\\n\ system(\ system(\} void closefile() /*关闭文件*/ { system(\ int i,j; char clfilename[10]; if(opennum==0) /*没有文件被打开过*/ { printf(\当前还没有打开文件!\\n\