实验四 文件系统实验
更新时间:2023-12-06 04:00:01 阅读量: 教育文库 文档下载
- 实验四小推荐度:
- 相关推荐
实验四 文件系统实验 实验目的
1) 掌握文件系统的工作机理。 2) 理解文件系统的主要数据结构。 3) 学习较为复杂的LINUX下的编程
实验内容
1)
设计并实现一个一级(单用户)文件系统程序 a.提供以下操作:
? 文件创建/删除接口命令create/delete ? 目录创建/删除接口命令mkdir/rmdir ? 显示目录内容命令ls b.创建的文件不要求格式和内容 2)
设计并实现一个二级文件系统程序 a.提供用户登录; b.文件、目录要有权限
实验结果及其解释说明
基本上实现了简单文件系统的实现。 创建并读写文件如下图所示:
打开文件、关闭文件、创建并显示子目录、删除子目录如下图所示:
实验中的问题及解决
首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都应以文件的形式存放于磁盘,这样便于查找和修改。
由于对文件系统理解不够深刻,导致程序在一些原理上的迷糊不清,而时间较短,因此采取了简化的方法。在写程序的开始也没有做详细的规划,因此在程序的结构上有些混乱。在后期做了一些调整,但是整体还是有缺陷的。 另外程序只是很简单的实现了文件管理系统,只有一些非常简单的功能,而且功能考虑的也不尽全面、严谨,
难免会出现一些Bug。必须对写好的程序进行反复的调试和优化。
实验体会
通过学习基本掌握了文件系统的存储结构,当遇到困难的时候,认真思考和查阅资料可以有很大的帮助。经过这次实验,锻炼了自己的动手的能力和分析问题的能力。在构造函数的时候可以开阔思维,同时加深自己对文件系统实现的理解。在进行理论知识的学习时,我们一定要注意动手应用,这样可以让我们更好地掌握理论知识。
程序清单
#include
#define DIR_LENGTH 1024 /*路径最长可达100字节*/
#define MAX_WRITE 1024*128 /*写入文字可达128k字节*/ #define MEM_D_SIZE 1024*1024 /*1M磁盘空间*/ #define DISKSIZE 1024 /*磁盘快的大小 1K*/
#define MSD 5 /*最大子目录数 5 (类似五叉树)*/
#define DISK_NUM MEM_D_SIZE/DISKSIZE /*磁盘快数目 1024=1M/1K*/
#define FATSIZE DISK_NUM*sizeof(struct fatitem) /*FAT表大小 8K=8192B (理想应该是 1.5K)*/
#define MOFN 5 /*最大文件打开数 5 (即除根以外最大深度为5)*/ #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 /*根目录起始盘快号 9*/ #define ROOT_DISK_SIZE sizeof(struct direct)/*根目录大小 196*/
/*---------------FAT表项结构-----------------------*/
struct fatitem /* size 8*/ {
int item; /*存放文件下一个磁盘的指针*/
char em_disk; /*磁盘块是否空闲标志位 0 空闲*/ };
/*-------------------目录项结构------------------------*/
struct direct /* size 196*/ {
/*-----文件控制快信息-----*/ struct FCB {
char name[9]; /*文件/目录名 8位*/
char property; /*属性 1位目录 0位普通文件*/ int size; /*文件/目录字节数(原注释位盘块数)*/ int firstdisk; /*文件/目录 起始盘块号*/ int next; /*子目录起始盘块号*/
int sign; /*1是根目录 0不是根目录*/
}directitem[MSD+2]; };
/*------------------文件打开表项结构--------------------------*/ struct opentable /* size 104*/ {
struct openttableitem /* size 20*/ {
char name[9]; /*文件名*/ int firstdisk; /*起始盘块号*/ int size; /*文件的大小*/ }openitem[MOFN];
int cur_size; /*当前打文件的数目*/ };
/*-------------------------------------------------------------------*/ struct fatitem *fat; /*FAT表*/ struct direct *root; /*根目录*/
struct direct *cur_dir; /*当前目录*/
struct opentable u_opentable; /*文件打开表*/ int fd=-1; /*文件打开表的序号*/
char *bufferdir; /*记录当前路径的名称*/ char *fdisk; /*虚拟磁盘起始地址*/
void initfile(); void format(); void enter(); void halt();
int create(char *name); int open(char *name); int close(char *name);
int write(int fd,char *buf,int len); int read(int fd,char *buf); int del(char *name); int mkdir(char *name); int rmdir(char *name); void dir();
int cd(char *name); void print(); void show();
/*----------------------------------------------------------------------------------------------*/
/*------------------------------------------初始化文件系统--------------------------------------*/ void initfile() {
fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请 1M空间*/ format(); free(fdisk); }
/*----------------------------------------------------------------------------------------------*/ /*------------------------------------------格式化----------------------------------------------*/ void format() { int i;
FILE *fp;
fat = (struct fatitem *)(fdisk+DISKSIZE); /*计算FAT表地址(为什么向后偏移 1k)*/ /*-----初始化FAT表------------*/ fat[0].item=-1; /*引导块*/ fat[0].em_disk='1';
for(i=1;i fat[i].item=i+1; fat[i].em_disk='1'; } fat[ROOT_DISK_NO-1].item=-1; fat[ROOT_DISK_NO-1].em_disk='1'; fat[ROOT_DISK_NO].item=-1; /*存放根目录的磁盘块号*/ fat[ROOT_DISK_NO].em_disk='1'; for(i=ROOT_DISK_NO+1;i fat[i].item = -1; fat[i].em_disk = '0'; } /*-----------------------------------------------*/ root = (struct direct *)(fdisk+DISKSIZE+FATSIZE); /*根目录的地址*/ /*初始化目录*/ /*---------指向当前目录的目录项---------*/ root->directitem[0].sign = 1; root->directitem[0].firstdisk = ROOT_DISK_NO; strcpy(root->directitem[0].name,\ root->directitem[0].next = root->directitem[0].firstdisk; root->directitem[0].property = '1'; root->directitem[0].size = ROOT_DISK_SIZE; /*-------指向上一级目录的目录项---------*/ 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 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(\ { printf(\ return; } if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) /*把虚拟磁盘空间保存到磁盘文件中*/ { printf(\ } fclose(fp); } /*----------------------------------------------------------------------------------------------*/ /*--------------------------------进入文件系统--------------------------------------------------*/ void enter() { FILE *fp; int i; fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请 1M空间*/ if((fp=fopen(\ { printf(\ return; } if(!fread(fdisk,MEM_D_SIZE,1,fp)) /*把磁盘文件disk.dat 读入虚拟磁盘空间(内存)*/ { printf(\ exit(0); } fat = (struct fatitem *)(fdisk+DISKSIZE); /*找到FAT表地址*/ root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目录地址*/ fclose(fp); /*--------------初始化用户打开表------------------*/ for(i=0;i strcpy(u_opentable.openitem[i].name,\ u_opentable.openitem[i].firstdisk = -1; u_opentable.openitem[i].size = 0; } u_opentable.cur_size = 0; cur_dir = root; /*当前目录为根目录*/ bufferdir = (char *)malloc(DIR_LENGTH*sizeof(char)); strcpy(bufferdir,\显示根目录为E:*/ } /*----------------------------------------------------------------------------------------------*/ /*------------------------------------退出文件系统----------------------------------------------*/ void halt() { FILE *fp; int i; if((fp=fopen(\ { printf(\ return; } if(!fwrite(fdisk,MEM_D_SIZE,1,fp)) /*把虚拟磁盘空间(内存)内容读入磁盘文件disk.dat */ { printf(\ } fclose(fp); free(fdisk); free(bufferdir); for(i=0;i strcpy(u_opentable.openitem[i].name,\ u_opentable.openitem[i].firstdisk = 0; u_opentable.openitem[i].size = 0; } u_opentable.cur_size = 0; /*用户打开文件数清零*/ return; } /*----------------------------------------------------------------------------------------------*/ /*----------------------------------------创建文件----------------------------------------------*/ int create(char *name) { int i,j; if(strlen(name)>8) /*文件名大于 8位*/ return(-1); for(i=2;i if(cur_dir->directitem[i].firstdisk==-1) break; } for(j=2;j { if(!strcmp(cur_dir->directitem[j].name,name)) break; } if(i>=MSD+2) /*无空目录项*/ return(-2); if(u_opentable.cur_size>=MOFN) /*打开文件太多(第五层)*/ return(-3); if(j for(j=ROOT_DISK_NO+1;j if(fat[j].em_disk=='0') break; } if(j>=DISK_NUM) return(-5); fat[j].em_disk = '1'; /*将空闲块置为已经分配*/ /*-----------填写目录项-----------------*/ strcpy(cur_dir->directitem[i].name,name); cur_dir->directitem[i].firstdisk = j; cur_dir->directitem[i].size = 0; cur_dir->directitem[i].next = j; cur_dir->directitem[i].property = '0'; /*cur_dir->directitem[i].sign 丢失*/ /*---------------------------------*/ fd = open(name); /*打开所创建的文件*/ return 0; } /*----------------------------------------------------------------------------------------------*/ /*----------------------------------------打开文件----------------------------------------------*/ int open(char *name) { int i, j; for(i=2;i if(!strcmp(cur_dir->directitem[i].name,name)) break; } if(i>=MSD+2) /*文件不存在*/ return(-1); /*--------是文件还是目录-----------------------*/ if(cur_dir->directitem[i].property=='1')/*是目录,不可打开读写*/ return(-4); /*--------文件是否打开-----------------------*/ for(j=0;j if(!strcmp(u_opentable.openitem[j].name,name)) break; } if(j if(u_opentable.cur_size>=MOFN) /*文件打开太多*/ return(-3); /*--------查找一个空闲用户打开表项-----------------------*/ for(j=0;j if(u_opentable.openitem[j].firstdisk==-1) break; } /*--------------填写表项的相关信息------------------------*/ u_opentable.openitem[j].firstdisk = cur_dir->directitem[i].firstdisk; strcpy(u_opentable.openitem[j].name,name); u_opentable.openitem[j].size = cur_dir->directitem[i].size; u_opentable.cur_size++; /*----------返回用户打开表表项的序号--------------------------*/ return(j); } /*----------------------------------------------------------------------------------------------*/ /*----------------------------------------关闭文件----------------------------------------------*/ int close(char *name) { int i; for(i=0;i { if(!strcmp(u_opentable.openitem[i].name,name)) 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--; fd = -1; /*文件打开表的序号为 -1 */ return 0; } /*----------------------------------------------------------------------------------------------*/ /*----------------------------------------写文件------------------------------------------------*/ int write(int fd, char *buf, int len) { char *first; int item, i, j, k; int ilen1, ilen2, modlen, temp; /*----------用 $ 字符作为空格 # 字符作为换行符-----------------------*/ char Space = 32; /*SPACE的ASCII码值*/ char Endter= '\\n'; for(i=0;i if(buf[i] == '$') /*用 $ 字符作为空格*/ buf[i] = Space; else if(buf[i] == '#') buf[i] = Endter; } /*----------读取用户打开表对应表项第一个盘块号-----------------------*/ item = u_opentable.openitem[fd].firstdisk; /*-------------找到当前目录所对应表项的序号-------------------------*/ for(i=2;i if(cur_dir->directitem[i].firstdisk==item) break; } temp = i; /*-存放当前目录项的下标-*/ /*------找到的item 是该文件的最后一块磁盘块-------------------*/ while(fat[item].item!=-1) { item =fat[item].item; /*-查找该文件的下一盘块--*/ } /*-----计算除该文件的最末地址-------*/ first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE; /*-----如果最后磁盘块剩余的大小大于要写入的文件的大小-------*/ 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<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++) {/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/ first[i] = buf [i]; } /*-----计算分配完最后一块磁盘的剩余空间(字节) 还剩下多少字节未存储-------*/ ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE); ilen2 = ilen1/DISKSIZE; modlen = ilen1%DISKSIZE; if(modlen>0) ilen2 = ilen2+1; /*--还需要多少块磁盘块-*/ /*调试时特别注意*/ for(j=0;j for(i=ROOT_DISK_NO+1;i if(fat[i].em_disk=='0') break; } if(i>=DISK_NUM) /*--如果磁盘块已经分配完了-*/ return(-1); first = fdisk+i*DISKSIZE; /*--找到的那块空闲磁盘块的起始地址-*/ if(j==ilen2-1) /*--如果是最后要分配的一块-*/ { for(k=0;k else/*-如果不是要最后分配的一块--*/ { for(k=0;k fat[item].item = i; /*--找到一块后将它的序号存放在上一块的指针中-*/ 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; } 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; if(len>u_opentable.openitem[fd].size) /*--欲读出的文件长度比实际文件长度长-*/ return(-1); ilen1 = len/DISKSIZE; modlen = len%DISKSIZE; if(modlen!=0) ilen1 = ilen1+1; /*--计算文件所占磁盘的块数-*/ first = fdisk+item*DISKSIZE; /*--计算文件的起始位置-*/ for(i=0;i { if(i==ilen1-1) /*--如果在最后一个磁盘块-*/ { for(j=0;j else /*--不在最后一块磁盘块-*/ { for(j=0;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 if(!strcmp(cur_dir->directitem[i].name,name)) break; } cur_item = i; /*--用来保存目录项的序号,供释放目录中-*/ if(i>=MSD+2) /*--如果不在当前目录中-*/ return(-1); if(cur_dir->directitem[cur_item].property!='0') /*--如果删除的(不)是目录-*/ return(-3); for(i=0;i if(!strcmp(u_opentable.openitem[i].name,name)) return(-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->directitem[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; } /*----------------------------------------------------------------------------------------------*/ /*---------------------------------------创建子目录---------------------------------------------*/ int mkdir(char *name) { int i,j; struct direct *cur_mkdir; if(strchr(name,'\\\\'))/*如果目录名中有 '\\'字符*/ return(-4); if(!strcmp(name,\ return(-6); if(!strcmp(name,\ return(-6); if(strlen(name)>8) /*-如果目录名长度大于 8位-*/ return(-1); for(i=2;i if(cur_dir->directitem[i].firstdisk==-1) break; } if(i>=MSD+2) /*-目录/文件 已满-*/ return(-2); for(j=2;j if(!strcmp(cur_dir->directitem[j].name,name)) break; } if(j for(j=ROOT_DISK_NO+1;j if(fat[j].em_disk=='0') break; } if(j>=DISK_NUM) return(-5); fat[j].em_disk='1'; /*-将该空闲块设置为已分配-*/ /*-------------填写目录项----------*/ strcpy(cur_dir->directitem[i].name,name); cur_dir->directitem[i].firstdisk=j; cur_dir->directitem[i].size=ROOT_DISK_SIZE; cur_dir->directitem[i].next=j; /*-指向子目录(其实就是其本身)的起始盘块号-*/ cur_dir->directitem[i].property='1'; /*-sign=1为根标志,这里可以省略-*/ /*-所创目录在虚拟磁盘上的地址(内存物理地址)-*/ cur_mkdir=(struct direct *)(fdisk+cur_dir->directitem[i].firstdisk*DISKSIZE); /*-初始化目录-*/ /*-指向当前目录的目录项-*/ cur_mkdir->directitem[0].sign=0; cur_mkdir->directitem[0].firstdisk=cur_dir->directitem[i].firstdisk; strcpy(cur_mkdir->directitem[0].name,\ cur_mkdir->directitem[0].next=cur_mkdir->directitem[0].firstdisk; cur_mkdir->directitem[0].property='1'; cur_mkdir->directitem[0].size=ROOT_DISK_SIZE; /*-指向上一级目录的目录项-*/ cur_mkdir->directitem[1].sign=cur_dir->directitem[0].sign;/*-指向上一级目录的目录项-*/ cur_mkdir->directitem[1].firstdisk=cur_dir->directitem[0].firstdisk; strcpy(cur_mkdir->directitem[1].name,\ cur_mkdir->directitem[1].next=cur_mkdir->directitem[1].firstdisk; cur_mkdir->directitem[1].property='1'; cur_mkdir->directitem[1].size=ROOT_DISK_SIZE; for(i=2;i cur_mkdir->directitem[i].sign=0; cur_mkdir->directitem[i].firstdisk=-1; strcpy(cur_mkdir->directitem[i].name,\ cur_mkdir->directitem[i].next=-1; cur_mkdir->directitem[i].property='0'; cur_mkdir->directitem[i].size=0; } return 0; } /*----------------------------------------------------------------------------------------------*/ /*---------------------------------------删除子目录---------------------------------------------*/ int rmdir(char *name) { int i,j,item; struct direct *temp_dir; /*-检查当前目录项中有无该目录-*/ for(i=2;i if(!strcmp(cur_dir->directitem[i].name,name)) break; } if(cur_dir->directitem[i].property!='1')/*-删除的不是目录-*/ return(-3); if(i>=MSD+2) /*-没有这个文件或目录-*/ return(-1); /*-判断要删除的目录有无子目录-*/ /*-要删除的目录起始地址-*/ temp_dir=(struct direct *)(fdisk+cur_dir->directitem[i].next*DISKSIZE); for(j=2;j if(temp_dir->directitem[j].next!=-1) break; } if(j return(-2); /*-有关联则报错,也可以采取级联删除,像Windows-*/ /*------------找到起始盘块号,并将其释放----------------*/ item=cur_dir->directitem[i].firstdisk; fat[item].em_disk='0'; /*-修改目录项-*/ cur_dir->directitem[i].sign=0; cur_dir->directitem[i].firstdisk=-1; strcpy(cur_dir->directitem[i].name,\ cur_dir->directitem[i].next=-1; cur_dir->directitem[i].property='0'; cur_dir->directitem[i].size=0; return 0; } /*----------------------------------------------------------------------------------------------*/ /*-------------------------------显示当前目录的子目录-------------------------------------------*/ void dir() { int i; for(i=0;i if(cur_dir->directitem[i].firstdisk!=-1) /*-如果存在子目录-*/ { /*-其本身和父目录也算?-*/ printf(\ if(cur_dir->directitem[i].property=='0') /*-文件-*/ printf(\ else /*-目录-*/ printf(\ } } } /*----------------------------------------------------------------------------------------------*/ /*---------------------------------------更改当前目录-------------------------------------------*/ int cd(char *name) { int i,j,item; char *str,*str1; char *temp,*point,*point1; struct direct *temp_dir; temp_dir=cur_dir; /*-先用临时目录代替当前目录-*/ str=name; /*-str用来记录下次查找的起始地址-*/ if(!strcmp(\如果输入\回根目录*/ { cur_dir = root; strcpy(bufferdir,\ return 0; } j=0; for(i=0;i<(int)strlen(str);i++)/*查找有两个连续是\即\退出 */ { if(name[i]=='\\\\') { j++; if(j>=2) { return -3; } } else j=0; } if(name[0]=='\\\\') /*如果最后一个是\去掉这个\ { temp_dir = root; strcpy(bufferdir,\ str++; } if(str[strlen(str)-1] == '\\\\') { str[strlen(str)-1] = '\\0'; } str1=strchr(str,'\\\\'); /*-找到'\\'字符的位置-*/ temp = (char *)malloc(DIR_LENGTH*sizeof(char));/*-为子目录的名字分配空间-*/ while(str1!=NULL) /*-找到-*/ { for(i=0;i temp[i]=str[i]; } temp[i]='\\0'; for(j=2;j if(!strcmp(temp_dir->directitem[j].name,temp)) break; } if(j>=MSD+2) /*-不在当前目录-*/ return(-1); item=temp_dir->directitem[j].firstdisk; temp_dir=(struct direct *)(fdisk+item*DISKSIZE); /*-计算当前目录物理位置-*/ str=str1+1; str1=strchr(str,'\\\\'); //free(temp); } str1=str1+strlen(str); for(i=0;i<(int)strlen(str);i++) temp[i]=str[i]; temp[i]='\\0'; for(j=0;j if(!strcmp(temp_dir->directitem[j].name,temp)) break; } free(temp);/*释放申请的临时空间*/ if(temp_dir->directitem[j].property!='1') /*-打开的不是目录-*/ return(-2); if(j>=MSD+2) /*-不在当前目录-*/ return(-1); item=temp_dir->directitem[j].firstdisk; /*-当前目录在磁盘中位置-*/ temp_dir=(struct direct *)(fdisk+item*DISKSIZE); if(!strcmp(\ { if(cur_dir->directitem[j-1].sign!=1) /*-如果子目录不是根目录-*/ { point=strchr(bufferdir,'\\\\'); while(point!=NULL) { point1=point+1; /*-减去'\\'所占的空间,记录下次查找的起始地址-*/ point=strchr(point1,'\\\\'); } *(point1-1)='\\0'; /*-将上一级目录删除-*/ } else { } } else if(!strcmp(\ { bufferdir=bufferdir; /*-如果是当前目录则不变-*/ } else { if(name[0] !='\\\\') bufferdir = strcat(bufferdir,\修改当前目录-*/ bufferdir = strcat(bufferdir,name); } cur_dir=temp_dir; /*-将当前目录确定下来-*/ return 0; } /*----------------------------------------------------------------------------------------------*/ /*---------------------------------------显示当前路径-------------------------------------------*/ void show() { printf(\} /*----------------------------------------------------------------------------------------------*/ /*--------------------------------------输出提示信息--------------------------------------------*/ void print() { printf(\退出文件系统 halt\\n\ printf(\创建文件 create 文件名\\n\ printf(\删除文件 del 文件名\\n\ printf(\打开文件 open 文件名\\n\ printf(\关闭文件 close 文件名\\n\ printf(\写文件 write\\n\ printf(\读文件 read\\n\\n\ printf(\创建子目录 mkdir 目录名\\n\ printf(\删除子目录 rmdir 目录名\\n\ printf(\显示当前目录的子目录 dir\\n\ printf(\更改当前目录 cd 目录名\\n\ } /*----------------------------------------------------------------------------------------------*/ /*------------------------------------------主函数----------------------------------------------*/ int 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(\如果还没有进行格式化,则要格式化*/ { printf(\ scanf(\ if(ch=='y') { initfile(); printf(\ } else { //return; } } enter(); print(); show(); /*将命令全部保存在CODE数组中*/ strcpy(code[0],\ strcpy(code[1],\ strcpy(code[2],\ strcpy(code[3],\ strcpy(code[4],\ strcpy(code[5],\ strcpy(code[6],\ strcpy(code[7],\ strcpy(code[8],\ strcpy(code[9],\ strcpy(code[10],\ while(1) { scanf(\ for(i=0;i<11;i++) { if(!strcmp(code[i],a)) break; } switch(i) { case 0: //*--退出文件系统--// free(contect); halt(); //return; case 1: //*--创建文件--// scanf(\ flag = create(name); if(flag==-1) { printf(\ } else if(flag==-2) { printf(\ } else if(flag==-3) { printf(\ } else if(flag==-4) { printf(\ } else if(flag==-5) { printf(\ } else { printf(\ } show(); break; case 2://--打开文件--// scanf(\ fd = open(name); if(fd == -1) { printf(\ } else if(fd == -2) { printf(\ } else if(fd == -3) { printf(\ } else if(fd == -4) { printf(\ } else { printf(\ } show(); break; case 3://--关闭文件--// scanf(\ flag = close(name); if(flag == -1) { printf(\ } else { printf(\ } show(); break; case 4:/*--写文件--*/ if(fd ==-1) { printf(\ } else { printf(\ scanf(\ flag=write(fd,contect,strlen(contect)); if(flag == 0) { printf(\ } else { printf(\ } } show(); break; case 5:/*--读文件--*/ if(fd ==-1) { printf(\ } else { flag = read(fd,contect); if(flag == -1) { printf(\ } else { //printf(\ for(i=0;i printf(\ } printf(\ } } show(); break; case 6://*--删除文件-- scanf(\ flag = del(name); if(flag == -1) { printf(\ } else if(flag == -2) { printf(\ } else if(flag == -3) { printf(\ } else { printf(\ } show(); break; case 7://*--创建子目录--/ scanf(\ flag = mkdir(name); if(flag == -1) { printf(\ } else if(flag == -2) { printf(\ } else if(flag == -3) { printf(\ } else if(flag == -4) { printf(\ } else if(flag == -5) { printf(\ } else if(flag == -6) { printf(\ } else if(flag == 0) { printf(\ } show(); break; case 8://*--删除子目录--/ scanf(\ flag = rmdir(name); if(flag == -1) { printf(\ } else if(flag == -2) { printf(\ } else if(flag == -3) { printf(\ } else if(flag == 0) { printf(\ } show(); break; case 9://*--显示当前子目录--/ dir(); show(); break; case 10:/*--更改当前目录--*/ scanf(\ flag = cd(name); if(flag == -1) { printf(\ } else if(flag == -2) { printf(\ } else if(flag == -3) { printf(\ } show(); break; default: printf(\ show(); } } }
正在阅读:
实验四 文件系统实验12-06
高职高专英语IV教学大纲10-16
二十年后回家乡02-16
德耀中华观后感04-01
2020党章党规党纪轮训学习心得体会三篇09-10
年回收5万吨废旧蓄电池(含铅废物)项目可行性研究报告10-09
图论203-29
演讲稿 站在新起点 实现新跨越05-18
科教版小学科学五年级上册学生活动手册参考答案解析 - 图文12-04
维生素C注射液的制备06-09
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 实验
- 文件
- 系统