实验四 文件系统实验

更新时间:2023-12-06 04:00:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验四 文件系统实验 实验目的

1) 掌握文件系统的工作机理。 2) 理解文件系统的主要数据结构。 3) 学习较为复杂的LINUX下的编程

实验内容

1)

设计并实现一个一级(单用户)文件系统程序 a.提供以下操作:

? 文件创建/删除接口命令create/delete ? 目录创建/删除接口命令mkdir/rmdir ? 显示目录内容命令ls b.创建的文件不要求格式和内容 2)

设计并实现一个二级文件系统程序 a.提供用户登录; b.文件、目录要有权限

实验结果及其解释说明

基本上实现了简单文件系统的实现。 创建并读写文件如下图所示:

打开文件、关闭文件、创建并显示子目录、删除子目录如下图所示:

实验中的问题及解决

首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都应以文件的形式存放于磁盘,这样便于查找和修改。

由于对文件系统理解不够深刻,导致程序在一些原理上的迷糊不清,而时间较短,因此采取了简化的方法。在写程序的开始也没有做详细的规划,因此在程序的结构上有些混乱。在后期做了一些调整,但是整体还是有缺陷的。 另外程序只是很简单的实现了文件管理系统,只有一些非常简单的功能,而且功能考虑的也不尽全面、严谨,

难免会出现一些Bug。必须对写好的程序进行反复的调试和优化。

实验体会

通过学习基本掌握了文件系统的存储结构,当遇到困难的时候,认真思考和查阅资料可以有很大的帮助。经过这次实验,锻炼了自己的动手的能力和分析问题的能力。在构造函数的时候可以开阔思维,同时加深自己对文件系统实现的理解。在进行理论知识的学习时,我们一定要注意动手应用,这样可以让我们更好地掌握理论知识。

程序清单

#include #include #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(); } } }

本文来源:https://www.bwwdw.com/article/zfrt.html

Top