虚拟文件系统虚拟文件系统
学生课程设计报告
2014 ~ 2015 学年 第 二 学期
学 院 XXXXXXXXX
专 业 软件工程
学 号
姓 名
指导教师
起 止 周 周数 1 实习地点 课程设计目的:
1、 理解文件系统功能
2、 完成对文件、目录及磁盘空间的管理并提供操作命令 3、 实现文件共享与保护
课程设计要求:
1、利用索引结点实现目录管理。
2、建立一个树形目录系统,目录文件及索引结点均用结构数组表示。 3、文件盘块采用FAT方式,空指针用-1表示,并设空闲盘块指针。 4、提供对文件、目录及磁盘空...
虚拟文件系统
学生课程
报告
2014 ~ 2015 学年 第 二 学期
学 院 XXXXXXXXX
专 业 软件工程
学 号
姓 名
指导教师
起 止 周 周数 1 实习地点 课程设计目的:
1、 理解文件系统功能
2、 完成对文件、目录及磁盘空间的管理并提供操作命令 3、 实现文件共享与保护
课程设计要求:
1、利用索引结点实现目录管理。
2、建立一个树形目录系统,目录文件及索引结点均用结构数组表示。 3、文件盘块采用FAT方式,空指针用-1表示,并设空闲盘块指针。 4、提供对文件、目录及磁盘空间的操作命令。
进度安排及主要
:
第一周:
完成用户登录,目录管理和文件管理
第二周:
成绩:
指导教师(签字)
年 月 日
一、概述
1.1 本文的目的
本文内容用于指导学生对课程设计报告的格式和内容安排进行控制。
学生在使用时,可直接用格式刷将本文对应部分的格式内容进行提取并加载到目标位置;对于封面、页眉等部分,请直接修改相关文字。
二、需求分析
本次要实现虚拟文件系统,主要功能有用户登录、子目录的创建、删除、子目录中项的显示;文件的创建、打开、删除、关闭、对文件进行读写等。
实现对目录和文件的基本操作和文件的共享与保护。
三、技术方案
本次课程设计用VS2013编写C++控制台程序模拟文件系统。系统初始时需要登录,登录成功方能对文件进行操作。
本虚拟文件系统采用两级目录,第一级目录对应用户账号,第二级目录对应用户下的文件。
文件系统的数据结构包括主目录(虚拟C盘)、子目录及所含文件等。三者都存放在磁盘中,方便进行操作。文件可以在目录中进行
,表明文件所在目录。
四、总体设计
4.1功能设计
1、首次运行系统需要先格式化磁盘空间,申请一个内存为1M的磁盘
空间。
2、用户登录,用户需输入正确的用户名和密码方能进入本系统进行文
件和目录的操作。
3、进入系统后可根据提示对文件和目录进行操作。
4.2虚拟文件系统算法
图
开始
初始化磁盘
否用户登录是否已登录
是
文件系统操
作
目录文件是
显更创删示删创打关退改读写建除目除建开闭出当子子录文文前文文文文系目目中件件目件件件件统录录的录项
执行成功,结束
否
提示出错
算法流程图4-1
五、详细设计
5.1系统功能说明
1、 创建子目录:输入createdir 目录名,即进行目录创建操作,若当前目录已满
或文件名已经存在则创建失败,返回失败信息。否则创建成功,并找到空闲
磁盘块,将该磁盘块设为已分配,填写目录项。
2、 删除子目录:removedir 目录名,检查当前目录项中有无该目录,判断要删
除的目录有无子目录,如果有子目录将其释放,进行删除操作。
3、 更改当前目录:cd 目录名,可以进入到子目录并回退上级目录。
4、 显示目录中项:showdir可以显示目录和文件,文件显示大小,目录显示[目
录]。
5、 文件操作:创建文件、打开文件(创建时自动打开该文件),删除文件,关
闭文件、读文件、写文件、
6、 退出
5.2数据结构
struct direct
{
/**
*文件控制快信息
*/
struct FCB
{
char name[9]; //文件/目录名8位
char property; //属性1位目录0位普通文件
int size; //文件/目录字节数、盘块数)
int firstdisk; //文件/目录起始盘块号
int next; //子目录起始盘块号
int sign; //1是根目录0不是根目录
}directitem[MSD + 2];
};
/**
*size 8
*/
struct fatitem
{
int item; //存放文件下一个磁盘的指针
char em_disk; //磁盘块是否空闲标志位0 空闲
};
struct opentable
{
struct openttableitem
{
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; //文件打开表
5.3方法函数
void initfile();
void format();
void enter();
void init();
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 createdir(char *name); int removedir(char *name); void showdir();
int cd(char *name);
void print();
void show();
void login();
5.4全局变量
#define MEM_D_SIZE 1024*1024 //总磁盘空间为M #define DISKSIZE 1024 //磁盘块的大小K #define DISK_NUM 1024 //磁盘块数目K #define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小
#define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号
#define ROOT_DISK_SIZE sizeof(struct direct) //根目录大小 #define DIR_MAXSIZE 1024 //路径最大长度为KB #define MSD 6 //最大子目录数
#define MOFN 4 //最大文件深度为
#define MAX_WRITE 1024*128 //最大写入文字长度KB
char *username = (char *)malloc(sizeof(char) * 100); char *password = (char *)malloc(sizeof(char) * 100);
六、软件测试
6.1格式化磁盘空间测试
6.2用户登录测试
6.3创建子目录测试
6.4进入子目录测试
6.5创建文件测试
6.6写入文件测试
6.7读文件测试
6.8返回上级目录测试
6.9显示目录中项测试
6.10读写权限测试
七、总结
本次课程设计我初步完成了虚拟文件系统的目录管理和文件管理。让我对于文件系统有了深层次的理解和掌握,通过自己编写程序逐步提高自己的编程能力,并从中体会到了很多乐趣和知识。同时让我对C语言中的指针有了一个更深的了解。
费由于以前对于C++知识没有掌握牢固,使我在编程中出现了很多错误。了很多时间,但是我通过不断学习也提高了很多,对一些细节的结构体等也有了一个更深的理解。
这次课程设计让我进行了以前课堂很少有的实践训练,虽然掌握的知识有限,但是这次经历让我提高了编程能力和编程思想,使我受益匪浅。
附录1
参考文献
[1] 谭浩强,C++程序设计(第2版)(清华大学出版社,2012. [2] 汤小丹、梁红兵、哲凤屏,计算机操作系统(西安电子科技大学出版社,2014. [3] 严蔚敏(数据结构(清华大学出版社.,2007
附录2
源码
// kcsj001.cpp : Defines the entry point for the console application. //
#include "stdafx.h"
#include
#include
#include
#define MEM_D_SIZE 1024*1024 //总磁盘空间为M
#define DISKSIZE 1024 //磁盘块的大小K
#define DISK_NUM 1024 //磁盘块数目K
#define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号
#define ROOT_DISK_SIZE sizeof(struct direct) //根目录大小 #define DIR_MAXSIZE 1024 //路径最大长度为KB #define MSD 6 //最大子目录数
#define MOFN 4 //最大文件深度为
#define MAX_WRITE 1024*128 //最大写入文字长度KB
char *username = (char *)malloc(sizeof(char) * 100); char *password = (char *)malloc(sizeof(char) * 100); struct direct
{
/**
*文件控制快信息
*/
struct FCB
{
char name[9]; //文件/目录名8位
char property; //属性1位目录0位普通文件
int size; //文件/目录字节数、盘块数)
int firstdisk; //文件/目录起始盘块号
int next; //子目录起始盘块号
int sign; //1是根目录0不是根目录
}directitem[MSD + 2];
};
/**
*size 8
*/
struct fatitem
{
int item; //存放文件下一个磁盘的指针
char em_disk; //磁盘块是否空闲标志位0 空闲 };
struct opentable
{
struct openttableitem
{
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 login();
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("disk.dat", "rb")) == NULL)
{
printf("您还没有格式化,是否格式化?(y/n)");
scanf("%c", &ch);
if (ch == 'y')
{
initfile();
printf("格式化成功! \n");
}
else
{
return 0;
}
}
printf("您还未登录,请先登录~ \n"); GotoTest:
login();
if ((strcmp(username, "readonly") != 0 || strcmp(password, "1234") !=
0)
&& (strcmp(username, "root") != 0 || strcmp(password, "root") !=
0)
&& (strcmp(username, "nopower") != 0 || strcmp(password,
"1234") != 0)){
printf("登录失败,请重新登录! \n");
goto GotoTest;
}
printf("登录成功~ \n");
enter();
print();
show();
strcpy(code[0], "exit");
strcpy(code[1], "create");
strcpy(code[2], "open");
strcpy(code[3], "close");
strcpy(code[4], "write");
strcpy(code[5], "read");
strcpy(code[6], "del");
strcpy(code[7], "createdir");
strcpy(code[8], "removedir");
strcpy(code[9], "showdir");
strcpy(code[10], "cd");
while (1)
{
scanf("%s", a);
for (i = 0; i<11; i++)
{
if (!strcmp(code[i], a))
break;
}
switch (i)
{
case 0: //退出文件系统
free(contect);
halt();
return 0;
case 1: //创建文件
scanf("%s", name);
flag = create(name);
if (flag == -1)
{
printf("Error: \n 长度太长 !\n");
}
else if (flag == -2)
{
printf("Error: \n 子目录已满 !\n");
}
else if (flag == -3)
{
printf("Error: \n 打开文件次数过多 !\n");
}
else if (flag == -4)
{
printf("Error: \n 名字已经在子目录中 !\n");
}
else if (flag == -5)
{
printf("Error: \n 磁盘空间已满!\n");
}
else
{
printf("创建文件成功! \n");
}
show();
break;
case 2://打开文件
scanf("%s", name);
fd = open(name);
if (fd == -1)
{
printf("Error: \n 打开的文件不存在! \n");
}
else if (fd == -2)
{
printf("Error: \n 文件已经打开! \n");
}
else if (fd == -3)
{
printf("Error: \n 打开文件次数过多! \n");
}
else if (fd == -4)
{
printf("Error: \n 这是一个子目录,不能打开进行读写! \n");
}
else
{
printf("打开成功! \n");
}
show();
break;
case 3://关闭文件
scanf("%s", name);
flag = close(name);
if (flag == -1)
{
printf("Error:\n 文件没有打开 ! \n");
}
else
{
printf("关闭成功! \n");
}
show();
break;
case 4://写文件
if (fd == -1)
{
printf("Error:\n文件没有打开 ! \n");
}
else
{
if (strcmp(username, "readonly") != 0 && strcmp(username,
"nopower") != 0){
printf("请输入文件内容:");
scanf("%s", contect);
flag = write(fd, contect, strlen(contect));
if (flag == 0)
{
printf("写入成功! \n");
}
else
{
printf("Error:\n 磁盘大小没满! \n");
}
}
else{
printf("您没有写入权限~\n");
}
}
show();
break;
case 5://读文件
if (fd == -1)
{
printf("Error:\n 文件没有打开 ! \n");
}
else
{
if (strcmp(username, "nopower") != 0){
flag = read(fd, contect);
if (flag == 0)
{
for (i = 0; idirectitem[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;
if ((fp = fopen("disk.dat", "wb")) == NULL)
{
printf("Error:\n 不能打开文件 \n");
return;
}
for (i = 2; idirectitem[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.dat", "wb")) == NULL)
{
printf("Error:\n 不能打开文件 \n");
return;
}
if (fwrite(fdisk, MEM_D_SIZE, 1, fp) != 1) //把虚拟磁盘空间保存到磁盘文件中
{
printf("Error:\n 文件写入出错! \n");
}
fclose(fp);
}
void initfile()
{
fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); //申请1M空间
format();
printf("install...\n");
}
void enter()
{
FILE *fp;
int i;
fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); //申请1M空间
if ((fp = fopen("disk.dat", "rb")) == NULL)
{
printf("Error:\n不能打开文件\n");
return;
}
if (!fread(fdisk, MEM_D_SIZE, 1, fp)) //把磁盘文件disk.dat 读入虚拟磁盘空间(内存)
{
printf("Error:\n不能读取文件\n");
exit(0);
}
fat = (struct fatitem *)(fdisk + DISKSIZE); //找到FAT表地址
root = (struct direct *)(fdisk + DISKSIZE + FATSIZE);//找到根目录地址
fclose(fp);
/**
*初始化用户打开表
*/
for (i = 0; i8) //文件名大于8位
return(-1);
for (j = 2; jdirectitem[j].name, name))
break;
}
if (jdirectitem[i].firstdisk == -1)
break;
}
if (i >= MSD + 2) //无空目录项
return(-2);
if (u_opentable.cur_size >= MOFN) //打开文件太多
return(-3);
for (j = ROOT_DISK_NO + 1; 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';
fd = open(name);
return 0;
}
int open(char *name)
{
int i, j;
for (i = 2; idirectitem[i].name, name))
break;
}
if (i >= MSD + 2)
return(-1);
//是文件还是目录
if (cur_dir->directitem[i].property == '1')
return(-4);
//文件是否打开
for (j = 0; j= MOFN) /*文件打开太多*/
return(-3);
//查找一个空闲用户打开表项
for (j = 0; jdirectitem[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= 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--;
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;
char Endter = '\n';
for (i = 0; idirectitem[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= DISK_NUM) //如果磁盘块已经分配完了
return(-1);
first = fdisk + i*DISKSIZE; //找到的那块空闲磁盘块的起始地址
if (j == ilen2 - 1) //如果是最后要分配的一块
{
for (k = 0; kdirectitem[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;
ilen1 = len / DISKSIZE;
modlen = len%DISKSIZE;
if (modlen != 0)
ilen1 = ilen1 + 1; //计算文件所占磁盘的块数
first = fdisk + item*DISKSIZE; //计算文件的起始位置
for (i = 0; idirectitem[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; idirectitem[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 (!strcmp(name, "."))
return(-4);
if (!strcmp(name, ".."))
return(-4);
if (strlen(name)>8) //如果目录名长度大于8位
return(-1);
for (i = 2; idirectitem[i].firstdisk == -1)
break;
}
if (i >= MSD + 2) //目录/文件已满
return(-2);
for (j = 2; jdirectitem[j].name, name))
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';
//所创目录在虚拟磁盘上的地址(内存物理地址)
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; idirectitem[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; idirectitem[i].name, name))
break;
}
if (i >= MSD + 2) //没有这个文件或目录
return(-1);
if (cur_dir->directitem[i].property != '1')//删除的不是目录
return(-3);
//判断要删除的目录有无子目录
temp_dir = (struct direct *)(fdisk +
cur_dir->directitem[i].next*DISKSIZE);
for (j = 2; jdirectitem[j].next != -1)
break;
}
if (jdirectitem[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;
printf("内容名称 类型(文件显示长度/目录显示<目录>)\n");
for (i = 2; idirectitem[i].firstdisk != -1) //如果存在子目录
{
printf("%s\t", cur_dir->directitem[i].name);
if (cur_dir->directitem[i].property == '0') //文件
printf("\t%d\t\n", cur_dir->directitem[i].size);
else
printf("\t<目录>\t\n");
}
}
}
int cd(char *name)
{
int i, j, item;
char *str;
char *temp, *point, *point1;
struct direct *temp_dir;
temp_dir = cur_dir;
str = name;
if (!strcmp("\\", name))
{
cur_dir = root;
strcpy(bufferdir, "Root:");
return 0;
}
temp = (char *)malloc(DIR_MAXSIZE*sizeof(char));//最长路径名字分配空间
for (i = 0; i<(int)strlen(str); i++)
temp[i] = str[i];
temp[i] = '\0';
for (j = 0; jdirectitem[j].name, temp))
break;
}
free(temp);//释放申请的临时空间
//if(temp_dir->directitem[j].property!='1') //打开的不是目录
//return(-2);
item = temp_dir->directitem[j].firstdisk;
//当前目录在磁盘中位置
temp_dir = (struct direct *)(fdisk + item*DISKSIZE);
if (!strcmp("..", name))
{
if (cur_dir->directitem[j - 1].sign != 1) //如果上级目录不是根
目录
{
point = strchr(bufferdir, '\\'); //查找字符串bufferdir中首
次出现字符\ 的位置
while (point != NULL)
{
point1 = point + 1; //减去'\'所占的空间,记录下次查找的起
始地址
point = strchr(point1, '\\');
}
*(point1 - 1) = '\0'; //将上一级目录删除
}
}
else if (j >= MSD + 2){
return(-1);
}
else
{
//if(name[0] !='\\')
bufferdir = strcat(bufferdir, "\\"); //修改当前目录
bufferdir = strcat(bufferdir, name);
}
//if (j >= MSD + 2) //不在当前目录
//return(-1);
cur_dir = temp_dir; //将当前目录确定下来
return 0;
}
void show()
{
printf("%s>", bufferdir); }
void print()
{
printf("\n");
printf(" --虚拟文件系统-- \n");
printf("\n");
printf("=========================================================
\n");
printf("操作 命令 \n");
printf("1、更改当前目录 -------->cd 目录名 \n");
printf("2、创建子目录 -------->createdir 目录名 \n");
printf("3、删除子目录 -------->removedir 目录名 \n");
printf("4、显示当前目录中的项 -------->showdir \n");
printf("5、创建文件 -------->create 文件名 \n");
printf("6、删除文件 -------->del 文件名 \n");
printf("7、打开文件 -------->open 文件名 \n");
printf("8、关闭文件 -------->close 文件名 \n");
printf("9、读文件 -------->read \n");
printf("10、写文件 -------->write \n");
printf("11、退出系统 -------->exit \n");
printf("\n");
printf("=========================================================
\n");
}
本文档为【虚拟文件系统】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。