文件系统的模拟与实现

合集下载

操作系统文件管理系统模拟实验

操作系统文件管理系统模拟实验

文件管理系统模拟1.实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现 2.实验内容为Linux 系统设计一个简单的二级文件系统。

要求做到以下几点: (1)可以实现下列几条命令(至少4条) login 用户登录 dir列文件目录create 创建文件 delete 删除文件open 打开文件 close 关闭文件 read 读文件 write写文件(2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。

3.实验提示(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。

主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改.(2)用户创建的文件,可以编号存储于磁盘上。

入file0,file1,file2…并以编号作为物理地址,在目录中进行登记。

4.源代码#include<stdio 。

h> #include 〈string.h 〉 #include 〈stdlib 。

h 〉 #define MEM_D_SIZE 1024*1024 //总磁盘空间为1M #define DISKSIZE 1024 //磁盘块的大小1K #define DISK_NUM 1024 //磁盘块数目1K #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 //路径最大长度为1KB #define MSD 5 //最大子目录数5#define MOFN 5//最大文件深度为5#define MAX_WRITE 1024*128//最大写入文字长度128KBstruct fatitem /* size 8*/{int item; /*存放文件下一个磁盘的指针*/char em_disk; /*磁盘块是否空闲标志位 0 空闲*/};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];};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 initfile(){fdisk = (char *)malloc(MEM_D_SIZE*sizeof (char)); /*申请 1M空间*/format();}void format(){int i;FILE *fp;fat = (struct fatitem *)(fdisk+DISKSIZE); /*计算FAT 表地址,引导区向后偏移 1k)*/ /*————-初始化FAT表-———---——-—-*/fat[0]。

如何实现一个文件系统

如何实现一个文件系统

如何实现一个文件系统本文作者:康华:计算机硕士,主要从事Linux操作系统内核、Linux技术标准、计算机安全、软件测试等领域的研究与开发工作,现就职于信息产业部软件与集成电路促进中心所属的MII-HP Linux软件实验室。

如果需要可以联系通过kanghua151@联系他。

摘要:本文目的是分析在Linux系统中如何实现新的文件系统。

在介绍文件系统具体实现前先介绍文件系统的概念和作用,抽象出了文件系统概念模型。

熟悉文件系统的内涵后,我们再近一步讨论Linux系统中和文件系统的特殊风格和具体文件系统在Linux中组成结构,为读者勾画出Linux中文件系统工作的全景图。

最后,我们再通过Linux中最简单的Romfs 作实例分析实现文件系统的普遍步骤。

(我们假定读者已经对Linux文件系统初步了解)什么是文件系统首先要谈的概念就是什么是文件系统,它的作用到底是什么。

文件系统的概念虽然许多人都认为是再清晰不过的了,但其实我们往往在谈论中或多或少地夸大或片缩小了它的实际概念(至少我时常混淆),或者说,有时借用了其它概念,有时说的又不够全面。

比如在操作系统中,文件系统这个术语往往既被用来描述磁盘中的物理布局,比如有时我们说磁盘中的“文件系统”是EXT2或说把磁盘格式化成FAT32格式的“文件系统”等——这时所说的“文件系统”是指磁盘数据的物理布局格式;另外,文件系统也被用来描述内核中的逻辑文件结构,比如有时说的“文件系统”的接口或内核支持Ext2等“文件系统”——这时所说的文件系统都是内存中的数据组织结构而并非磁盘物理布局。

还有些时候说“文件系统”负责管理用户读写文件——这时所说的“文件系统”往往描述操作系统中的“文件管理系统”,也就是文件子系统。

虽然上面我们列举了混用文件系统的概念的几种情形,但是却也不能说上述说法就是错误的,因为文件系统概念本身就囊括众多概念,几乎可以说在操作系统中自内存管理、系统调度到I/O系统、设备驱动等各个部分都和文件系统联系密切,有些部分和文件系统甚至未必能明确划分——所以不能只知道文件系统是系统中数据的存储结构,一定要全面认识文件系统在操作系统中的角色,才能具备自己开发新文件系统的能力。

操作系统设计一个二级文件系统报告

操作系统设计一个二级文件系统报告

v .. . ..
. . . 资 料. .
操作系统(2014年秋季学期)
实 验 报 告
系别:计算机科学与技术 班级:信安12-1班 姓名:*** 学号:
实验名称:进程调度
NORTH CHINA UNIVERSITY OF TECHNOLOGY
2022-4-26 2/17
.
Word 资料
NORTH CHINA UNIVERSITY OF TECHNOLOGY
2022-4-26 4/17
.
Word 资料
NORTH CHINA UNIVERSITY OF TECHNOLOGY
.
Word 资料
NORTH CHINA UNIVERSITY OF TECHNOLOGY
.
Word 资料
NORTH CHINA UNIVERSITY OF TECHNOLOGY
}
五、编译过程截图
(下面是一个例子,换上你自己的图)
六、测试用例
(下面是一个例子,换上你自己的)
文字叙述一下测试过程的实例。

如先创建用户***、再产生文件****、再打开文件****,再写入内容********,再退出,再打开用户***,再将文件读出,读出的内容应该是*******。

等等。

六、实验结果
(下面是一个例子,换上你自己的图,给出根据测试用例的截图)。

(完整word版)一个多用户多级目录结构文件系统设计与实

(完整word版)一个多用户多级目录结构文件系统设计与实

操作系统课程设计姓名:学号:班级:电话:邮箱:课程设计题目:一个多用户多级目录结构文件系统设计与实现编译环境: Linux运行环境: Linux一、设计思想说明1 设计环境课程设计的环境是Linux 操作系统。

设计时可利用Linux 提供的文件管理的功能调用,建立一个模拟的文件系统。

基本思想是,在Linux 系统中创建一个较大容量的文件,作为所设计的文件系统的“文件卷”,并利用Linux 系统的功能调用,编写各程序模块。

2、文件卷的组织以 1M 的存储器空间作为文件空间,空间“分块”,编号为 0#~(BLKMAX-1)# 。

“分块”就是规定对文件卷的读/写以块为单位,每次读/写的起点为块大小的整倍数。

分块主要体现在文件卷的读/写模块上。

# define BSIZE 512 /* 512bytes/块 */# define BLKMAX 2048 /* 共2048 块 */0#块的作用: 0# 块是专用块(超级块)。

前半部用于存放文件卷空间的位示图(bitmap),位状态='0'表示对应块空闲,状态='1'表示已分配。

后半部的最后32 个字节用于存放根目录的目录结构。

0#块不参与文件空间的动态分配。

1#~(BLKMAX-1)#块用于存放文件(普通文件和子目录文件)的信息。

二、系统结构的说明本文件管理系统分为五层,上层调用下层,下层为上层服务。

以下为各层(由低到高)的简要说明:1、块管理层,通过TBlock类实现设下列主要函数:balloc()--块分配函数brelse()--块释放函数bread()—读一块函数bwrite()—写一块函数2、FCB管理层,通过TFcb类实现功能涉及到FCB结构的操作,定义了一些与FCB操作相关的函数3、打开文件管理层,通过TOFile类实现功能为涉及ofile结构的操作。

4、命令解释层,通过TEnter类和TOrder类实现功能为接受来自用户的命令,并解释、执行用户提出的文件访问操作。

模拟简单二级文件管理系统

模拟简单二级文件管理系统

模拟简单二级文件管理系统简单二级文件管理系统是一种用于管理和组织计算机文件的软件系统。

它提供了一种方便的方式来浏览、创建、修改和删除文件,以及对文件进行分类和搜索。

本文将介绍如何设计和实现一个模拟简单二级文件管理系统。

一、系统概述模拟简单二级文件管理系统是一个基于命令行界面的文件管理系统。

用户可以通过输入不同的命令来执行文件管理操作,如创建文件夹、创建文件、查看文件列表、移动文件等。

系统支持两级文件结构,即可以在根目录下创建文件夹,并在文件夹下创建文件。

系统还提供了文件搜索功能,用户可以根据文件名或文件类型进行搜索。

二、系统功能1. 创建文件夹:用户可以通过输入命令,在指定路径下创建一个新的文件夹。

2. 创建文件:用户可以通过输入命令,在指定路径下创建一个新的文件。

3. 查看文件列表:用户可以通过输入命令,查看指定路径下的文件夹和文件列表。

4. 移动文件:用户可以通过输入命令,将指定文件或文件夹移动到目标路径下。

5. 复制文件:用户可以通过输入命令,将指定文件或文件夹复制到目标路径下。

6. 删除文件或文件夹:用户可以通过输入命令,删除指定的文件或文件夹。

7. 文件搜索:用户可以通过输入命令,根据文件名或文件类型进行文件搜索。

三、系统设计1. 数据结构系统使用树状结构来表示文件系统,每个节点表示一个文件夹或文件。

节点包含以下属性:- 名称:节点的名称,可以是文件夹名称或文件名称。

- 类型:节点的类型,可以是文件夹或文件。

- 父节点:指向父节点的指针,用于表示文件夹的层次结构。

- 子节点列表:包含子节点的列表,用于表示文件夹下的文件和文件夹。

2. 系统流程系统的主要流程如下:- 用户输入命令。

- 系统解析命令,判断执行的操作类型。

- 根据操作类型,执行相应的操作。

- 更新文件系统的数据结构。

- 返回执行结果给用户。

四、系统实现系统可以使用编程语言来实现,如Python。

以下是一个简单的实现示例:```pythonclass Node:def __init__(self, name, type): = nameself.type = typeself.parent = Noneself.children = []class FileSystem:def __init__(self):self.root = Node("root", "folder")def create_folder(self, path, name):# 创建文件夹的逻辑def create_file(self, path, name):# 创建文件的逻辑def list_files(self, path):# 查看文件列表的逻辑def move_file(self, source_path, target_path): # 移动文件的逻辑def copy_file(self, source_path, target_path): # 复制文件的逻辑def delete_file(self, path):# 删除文件的逻辑def search_file(self, path, keyword):# 文件搜索的逻辑# 创建文件系统对象file_system = FileSystem()# 用户输入命令command = input("请输入命令:")# 解析命令并执行相应的操作# ...# 更新文件系统的数据结构# ...# 返回执行结果给用户# ...```以上是一个简单的模拟二级文件管理系统的设计和实现。

58064《计算机操作系统实验指导》实验思考解答.docx[5页]

58064《计算机操作系统实验指导》实验思考解答.docx[5页]

《计算机操作系统实验指导》(Linux版)(附微课视频)实验思考解答第1章操作系统实验体系介绍第1章无实验思考。

第2章实验环境的搭建与使用1. 实验2.1 Linux常用命令的使用(1)在Linux 中,图形界面与终端控制台以及各终端控制台之间在如何切换?使用ALT+F1~ALT+F6进行各终端控制台切换2. 实验2.2 Linux下C程序的编写(1)make 工具的编译原理是什么?make 是一个命令工具,它解释 Makefile 中的指令(规则)。

在 Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。

在执行 make 之前,需要一个命名为Makefile 的特殊文件(本文的后续将使用Makefile 作为这个特殊文件的文件名)来告诉 make 需要做什么(完成什么任务),该怎么做。

(2)如何直接使用gcc 命令完成myapp.c、greeting.h、greeting.c 三个文档的编译?输入以下两条命令:①gcc –c greeting.c //生成greeting.o文件② gcc –o greeting myapp.c greeting.o //把greeting.o和myapp.c一起编译成可执行文件greeting。

第3章进程控制与进程调度1. 实验3.1 进程的创建(1)总结调用fork()函数后的三种返回情况。

fork()系统调用有3种返回情况:返回值>0,表示当前进程是父进程,这个返回值为子进程的进程ID值;等于0,表示当前进程是子进程;小于0,表示进程创建失败,需要报错。

(2)总结fork()和wait()配合使用的情况,并尝试在父进程中取消wait()函数,观察进程的运行情况。

当父进程中同时使用fork()和wait()/waitpid()函数时,父进程会处于阻塞状态等待子进程的运行结束。

如果父进程中没有调用wait()/waitpid()函数,则父进程和其创建的子进程属于并发进程,也就是父进程和子进程几乎是独立运行的。

《Linux实验教程》教学课件 第7章 文件系统的设计与实现

《Linux实验教程》教学课件 第7章 文件系统的设计与实现

Ext2文件系统(4)
块组描述符 – 每个块组都有一个块组描述符ext2_group_desc,记录该
块组的以下信息: – 数据块位示图。表示数据块位示图占用的块号,此位示
图反映块组中数据块的分配情况,在分配或释放数据块 时需使用数据块位示图。 – inode位示图。表示inode位示图占用的块号,此位示图反 映块组中inode的分配情况,在创建或删除文件时需使用 inode位示图。 – inode表。块组中inode占用的数据块数,系统中的每个文 件对应一个inode,每个inode都由一个数据结构来描述。 – 空闲块数、空闲inode数和已用数目。 – 一个文件系统中的所有块组描述符结构组成一个块组描 述结构表,每个块组在其超级块之后都包含一个块组描 述结构表的副本,实际上,Ext2文件系统仅使用块组1中 的块组描述结构表。
– 文件和文件系统 – 文件分类和属性 – 文件控制块和文件目录
UNIX类文件系统和非UNIX类文件系统
• UNIX类文件使用四种和文件系统相关的抽象概念: 文件、目录项、索引节点和安装点。
• 文件(file)—文件是由文件名标识的有序字节串,典 型的配套文件操作有读、写、创建和删除等。
• 目录项(dentry)—是文件路径名中的一部分。 • 索引节点(inode)—是存放文件控制信息的数据结构,
又分磁盘块中的inode和主存中活动的inode。 • 安装点(mount point)—文件系统被安装在一个特定
的安装点上,所有的已安装文件系统都作为根文件 系统树中的叶子出现在系统中。
主要内容
• 背景知识 – 文件系统基本概念 – 文件管理的数据结构 – Ext2文件系统
• 实验内容 – 模拟实现一个Linux文件系统

《操作系统》实验二

《操作系统》实验二

《操作系统》实验二一、实验目的本实验旨在加深对操作系统基本概念和原理的理解,通过实际操作,提高对操作系统设计和实现的认知。

通过实验二,我们将重点掌握进程管理、线程调度、内存管理和文件系统的基本原理和实现方法。

二、实验内容1、进程管理a.实现进程创建、撤销、阻塞、唤醒等基本操作。

b.设计一个简单的进程调度算法,如轮转法或优先级调度法。

c.实现进程间的通信机制,如共享内存或消息队列。

2、线程调度a.实现线程的创建、撤销和调度。

b.实现一个简单的线程调度算法,如协同多任务(cooperative multitasking)。

3、内存管理a.设计一个简单的分页内存管理系统。

b.实现内存的分配和回收。

c.实现一个简单的内存保护机制。

4、文件系统a.设计一个简单的文件系统,包括文件的创建、读取、写入和删除。

b.实现文件的存储和检索。

c.实现文件的备份和恢复。

三、实验步骤1、进程管理a.首先,设计一个进程类,包含进程的基本属性(如进程ID、状态、优先级等)和操作方法(如创建、撤销、阻塞、唤醒等)。

b.然后,实现一个进程调度器,根据不同的调度算法对进程进行调度。

可以使用模拟的方法,不需要真实的硬件环境。

c.最后,实现进程间的通信机制,可以通过模拟共享内存或消息队列来实现。

2、线程调度a.首先,设计一个线程类,包含线程的基本属性(如线程ID、状态等)和操作方法(如创建、撤销等)。

b.然后,实现一个线程调度器,根据不同的调度算法对线程进行调度。

同样可以使用模拟的方法。

3、内存管理a.首先,设计一个内存页框类,包含页框的基本属性(如页框号、状态等)和操作方法(如分配、回收等)。

b.然后,实现一个内存管理器,根据不同的内存保护机制对内存进行保护。

可以使用模拟的方法。

4、文件系统a.首先,设计一个文件类,包含文件的基本属性(如文件名、大小等)和操作方法(如创建、读取、写入、删除等)。

b.然后,实现一个文件系统管理器,包括文件的存储和检索功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录➢ 1.需求分析 (2)➢ 2.概要设计 (2)➢ 2.3.1用户结构:账号与密码结构 (2)➢ 2.3.2数据结构说明 (3)➢ 2.3.3各模块流程图 (3)➢ 3.详细设计 (4)➢ 4.调试与操作说明 (5)➢ 5.课程设计总结与体会 (8)➢ 6.致谢 (8)➢7.附录 (9)1.需求分析文件系统是linux操作系统的重要组成部分,Linux文件具有强大的功能。

文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。

从这我们可以看出文件系统的重要性,要好好掌握,通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。

2.概要设计2.1系统的主要功能为Linux系统设计一个简单的二级文件系统,以实现下列功能:可以实现下列几条命令(1)login 用户登录(2)dir 文件目录列表(3)creat 创建文件(4)delete 删除文件(5)open 打开文件(6)close 关闭文件(7)read 读文件(8)write 写文件2.2系统模块功能结构本系统是模拟实现多用户多目录的文件系统(8个用户),在系统出现登录后 ,输入用户与口令,在用户登录系统后,可建立文件卷,将用户输入的文件保存在指定的文件中。

系统的命令与其命令的具体实现,此模拟系统共提供了login用户登录dir列文件目录mkdir建立目录create创建文件del删除文件open打开文件read读文件write写文件上述命令,并根据命令的含义与要求,用C++编程来完成所有具体操作。

该系统可以模拟完成用户的登陆和验证,列出文件和目录,新建目录,改变目录,创立和编写文件,删除文件和退出系统等功能。

运行环境要求开发环境:windows平台+visual c++6.0运行环境:windows全系列平台 Visual C++6.0 linux环境下用g++编译C++开发语言:c++2.3数据结构设计2.3.1用户结构:账号与密码结构typedef struct users{char name[8];char pwd[10];}users;本系统有8个默认的用户名,前面是用户名,后面为密码,用户登陆时只要输入正确便可进入系统,否则提示失败要求重新输入。

users usrarray[8] ={"usr1","usr1","usr2","usr2","usr3","usr3","usr4","usr4","usr5","usr5","usr6","usr6","usr7","usr7","usr8","usr8",};2.3.2数据结构说明a)文件结构链表struct fnode{char filename[FILENAME_LENGTH];int isdir;int isopen;char content[255];fnode *parent;fnode *child;fnode *prev;fnode *next;};b)函数介绍fnode *initfile(char filename[],int isdir);//初始化文件或目录void createroot();//建立系统根目录int run();系统运行int findpara(char *topara);对参数进行处理bool chklogin(char *users, char *pwd);检查账号与口令void help();命令列表int mkdir();建立目录int create();建立文件int read();读取文件int write();写入文件int del();删除文件int cd();切换目录int dir();文件与目录列表2.3.3各模块流程图3.详细设计确定程序设计的各个模块的算法及内部的数据组织,包括主要代码并描述各种算法3.1用户结构:账号与密码结构typedef struct users{char name[8];char pwd[10];}users;本系统有8个默认的用户名,前面是用户名,后面为密码,用户登陆时只要输入正确便可进入系统,否则提示失败要求重新输入。

users usrarray[8] ={"usr1","usr1","usr2","usr2","usr3","usr3","usr4","usr4","usr5","usr5","usr6","usr6","usr7","usr7","usr8","usr8",};3.2数据结构说明a)文件结构链表struct fnode{char filename[FILENAME_LENGTH];int isdir;int isopen;char content[255];fnode *parent;fnode *child;fnode *prev;fnode *next;};b)函数介绍fnode *initfile(char filename[],int isdir);//初始化文件或目录void createroot();//建立系统根目录int run();系统运行int findpara(char *topara);对参数进行处理bool chklogin(char *users, char *pwd);检查账号与口令void help();命令列表int mkdir();建立目录int create();建立文件int read();读取文件int write();写入文件int del();删除文件int cd();切换目录int dir();文件与目录列表4.调试与操作说明5.课程设计总结与体会经过几周的共同努力,在老师提供的帮助的基础上,我们将程序按要求设计并修改完善,使其能实现课程设计要求的基本功能。

操作系统是计算机科学与技术专业中的一门重要基础课,目的是让我们了解操作系统的基本概念,理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。

通过课程设计,可以进一步理解在计算机系统上运行的其它各类操作系统,并懂得在操作系统的支持下建立自己的应用系统。

操作系统课程设计,对于训练我们掌握程序设计、熟悉上机操作和程序调试技术都有重要作用。

重点培养我们的思维能力、创新能力和排错能力。

通过课程设计,进一步融会贯通教材内容,掌握程序各功能模块的工作原理,相互联系和来龙去脉,完整地建立系统的概念。

激发我的学习热情和主动性,培养我的独立工作能力,在实践活动中,将所学知识综合运用,增长才干,并积累经验。

对编程语言C又有了更深一层次的认识,并对其的编程能力有所加强,但还是很多的不足有待改进,对于编程来说还需要大量的实践,才能在发现问题和解决问题中前进与提高。

6.致谢在这次课程设计的过程中,我得到了许多人的帮助。

首先我要感谢我的老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次报告的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把系统做得更加完善。

在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。

其次,我要感谢帮助过我的同学,他们也为我解决了不少我不太明白的设计商的难题。

同时也感谢学院为我提供良好的做毕业设计的环境。

最后再一次感谢所有在设计中曾经帮助过我的良师益友和同学7.附录系统的主要源代码#include "stdio.h"#include "iostream.h"#include "string.h"#include "iomanip.h"#define FILENAME_LENGTH 10 //文件名称长度#define COMMAND_LENGTH 10 //命令行长度#define PARA_LENGTH 30 //参数长度//账号结构typedef struct users{char name[8];char pwd[10];}users;//文件结构struct fnode{char filename[FILENAME_LENGTH];int isdir;int isopen;char content[255];fnode *parent;fnode *child;fnode *prev;fnode *next;};//账号users usrarray[8] ={"usr1","usr1","usr2","usr2","usr3","usr3","usr4","usr4","usr5","usr5","usr6","usr6","usr7","usr7","usr8","usr8",};fnode *initfile(char filename[],int isdir);void createroot();int run();int findpara(char *topara);bool chklogin(char *users, char *pwd);void help();int mkdir();int create();int read();int write();int del();int cd();int dir();fnode *root,*recent,*temp,*ttemp;charpara[PARA_LENGTH],command[COMMAND_LENGTH],temppara[PARA_LENGTH],recentpara[PARA _LENGTH];//创建文件与目录结点fnode* initfile(char filename[],int isdir){fnode *node=new fnode;strcpy(node->filename,filename);node->isdir=isdir;node->isopen=0;node->parent=NULL;node->child=NULL;node->prev=NULL;node->next=NULL;return node;}//创建文件存储结点void createroot (){recent=root=initfile("/",1);root->parent=NULL;root->child=NULL;root->prev=root->next=NULL;strcpy(para,"/");}int mkdir(){temp=initfile(" ",1);cin>>temp->filename;if(recent->child==NULL){temp->parent=recent;temp->child=NULL;recent->child=temp;temp->prev=temp->next=NULL;}else{ttemp=recent->child;while(ttemp->next){ttemp=ttemp->next;if(strcmp(ttemp->filename,temp->filename)==0&&ttemp->isdir==1) {printf("对不起,目录已存在!");return 1;}}ttemp->next=temp;temp->parent=NULL;temp->child=NULL;temp->prev=ttemp;temp->next=NULL;}return 1;}int create(){temp=initfile(" ",0);cin>>temp->filename;cin>>temp->content;if(recent->child==NULL){temp->parent=recent;temp->child=NULL;recent->child=temp;temp->prev=temp->next=NULL;cout<<"文件建立成功!"<<endl;}else{ttemp=recent->child;while(ttemp->next){ttemp=ttemp->next;if(strcmp(ttemp->filename,temp->filename)==0&&ttemp->isdir==0){printf("对不起,文件已存在!");return 1;}}ttemp->next=temp;temp->parent=NULL;temp->child=NULL;temp->prev=ttemp;temp->next=NULL;cout<<"文件建立成功!"<<endl;}return 1;}int dir(){int i=0,j=0;temp=new fnode;temp=recent;if(temp!=root){cout<<" <DIR> "<<".."<<endl;i++;}if(temp->child==NULL){cout<<"Total: "<<" directors " <<i<<" files "<< j <<endl;return 1;}temp=temp->child;while(temp){if(temp->isdir){cout<<" <DIR> "<<temp->filename<<endl;i++;}else{cout<<" <FILE> "<<temp->filename<<endl;j++;}temp=temp->next;}cout<<"Total: "<<" directors " <<i<<" files "<< j <<endl;}int read(){char filename[FILENAME_LENGTH];cin>>filename;if(recent->child==NULL){cout<<"文件不存在!"<<endl;return 1;}if(strcmp(recent->child->filename,filename)==0){cout<<recent->child->content<<endl;return 1;}else{temp=recent->child;while(temp->next){if(strcmp(temp->next->filename,filename)==0){cout<<temp->next->content<<endl;return 1;}}cout<<"文件不存在!"<<endl;}}int write(){char filename[FILENAME_LENGTH];cin>>filename;if(recent->child==NULL){cout<<"文件不存在!"<<endl;return 1;}if(strcmp(recent->child->filename,filename)==0) {recent->child->isopen=1;//设置文件标记为打开cin>>recent->child->content;recent->child->isopen=0;//设置文件标记为关闭cout<<"文件写入成功!"<<endl;return 1;}else{temp=recent->child;while(temp->next){if(strcmp(temp->next->filename,filename)==0){recent->child->isopen=1;//设置文件标记为打开cin>>temp->next->content;recent->child->isopen=0;//设置文件标记为关闭cout<<"文件写入成功!"<<endl;return 1;}}cout<<"文件不存在!"<<endl;}}int cd(){ char topara[PARA_LENGTH];cin>>topara;if(strcmp(topara,"..")==0){int i;while(recent->prev)recent=recent->prev;if(recent->parent){recent=recent->parent;}i=strlen(para);while(para[i]!='/' && i>0) i--;if(i!=0)para[i]='\0';elsepara[i+1]='\0';}else{findpara(topara);}return 1;}int findpara(char *topara){int i=0;int sign=1;if(strcmp(topara,"/")==0){recent=root;strcpy(para,"/");return 1;}temp=recent;strcpy(temppara,para);if(topara[0]=='/'){recent=root->child;i++;strcpy(para,"/");}else{if(recent!=NULL && recent!=root) strcat(para,"/");if(recent && recent->child){if(recent->isdir)recent=recent->child;else{printf("路径错误!\n");return 1;}}}while(i<=strlen(topara) && recent) {int j=0;if(topara[i]=='/' && recent->child){i++;if(recent->isdir)recent=recent->child;else{printf("路径错误\n");return 0;}strcat(para,"/");}while(topara[i]!='/' && i<=strlen(topara)){recentpara[j]=topara[i];i++;j++;}recentpara[j]='\0';while((strcmp(recent->filename,recentpara)!=0 || (recent->isdir!=1)) && recent->next!=NULL){recent=recent->next;}if(strcmp(recent->filename,recentpara)==0){if(recent->isdir==0){strcpy(para,temppara);recent=temp;printf("是文件不是目录。

相关文档
最新文档