模拟文件管理系统
文件管理系统的设计与实现

文件管理系统的设计与实现一、引言随着信息化时代的到来,各种企业的文档不断增长,使得文件管理系统成为企业不可或缺的一部分。
文件管理系统对于企业的办公效率和资源利用率有着极大的作用。
本文将涵盖文件管理系统的设计和实现,主要包括系统需求分析、系统设计和实现方案。
二、系统需求分析文件管理系统是一个可以对文件进行管理、检索、修改以及共享的软件系统,因此系统的主要功能需要满足以下几个需求:1. 用户管理:系统需要支持对用户进行管理,包括用户的增加、删除、修改、权限控制等。
不同的用户拥有不同的操作权限,比如只读、读写、管理员等。
2. 文件管理:系统需要对文件进行管理,包括文件的上传、下载、存储、备份等。
同时需要支持多种文件格式的存储与管理,比如文本、图片、音频、视频等。
3. 文件检索:系统需要提供快速检索功能,用户输入关键字可以搜索出相关文件。
4. 文件版本管理:系统需要支持对文件版本进行管理。
每次对文件进行修改时,系统需要产生一个新版本,并保存修改记录。
5. 文件共享:系统需要支持对文件进行共享,用户可以将自己的文件分享给其他用户。
6. 安全保护:系统需要采取安全措施保护用户的隐私和文件的安全性。
三、系统设计1. 技术选型:文件管理系统可以基于Web或桌面应用程序的技术架构,本文选择基于Web的应用程序实现。
在此基础上,我们选择使用Spring Boot + Spring Security + MyBatis + MySQL技术栈进行开发。
2. 系统模块设计:(1)用户管理模块:包括用户注册、登录、密码找回等功能。
用户权限控制分为管理员、普通用户等。
(2)文件管理模块:包括文件上传、下载、删除、修改、版本控制、文件分类以及文件的分享等操作。
(3)搜索模块:支持关键字搜索、文件名搜索等多种方式。
(4)安全管理模块:采用Spring Security作为安全框架,对系统进行全方面的安全保护,如权限认证、请求过滤、用户管理等。
文件系统管理实训报告

一、实训背景随着信息技术的飞速发展,文件系统作为存储和管理数据的核心,其性能、稳定性和安全性越来越受到重视。
为了提高我们对文件系统管理的理解和实践能力,我们进行了文件系统管理实训。
本次实训以Linux系统下的文件系统管理为主要内容,通过实际操作,加深对文件系统结构、命令、权限管理等方面的认识。
二、实训目标1. 掌握Linux文件系统的基本结构;2. 熟悉常用的文件系统管理命令;3. 理解文件权限和属性的概念;4. 学会文件系统备份与恢复;5. 提高文件系统的安全性和性能。
三、实训内容(一)文件系统结构Linux文件系统采用树状结构,以根目录“/”为起点,所有文件和目录都从根目录开始分层排列。
常见的文件系统结构包括:1. 根目录(/):包含系统中的所有目录和文件;2. 换行目录(/bin、/sbin、/usr):存放常用的系统命令和系统服务;3. 用户目录(/home):存放用户个人文件和目录;4. 临时目录(/tmp):存放临时文件和程序;5. 系统目录(/etc、/var、/opt):存放系统配置文件、日志文件和可选软件包。
(二)文件系统管理命令1. ls:列出目录内容;2. pwd:显示当前目录的绝对路径;3. cd:切换目录;4. mkdir:创建目录;5. rmdir:删除空目录;6. touch:创建空文件;7. rm:删除文件或目录;8. cp:复制文件或目录;9. mv:移动或重命名文件或目录;10. chmod:修改文件权限;11. chown:更改文件所有者;12. chgrp:更改文件所属组。
(三)文件权限和属性Linux文件权限分为三组:所有者、所属组和其他用户。
每组权限包括读(r)、写(w)和执行(x)三种。
通过chmod命令可以修改文件权限,例如:- chmod 755 filename:设置所有者有读、写、执行权限,所属组和其他用户有读、执行权限;- chmod u+x filename:给所有者添加执行权限;- chmod g-w filename:取消所属组的写权限。
操作系统文件管理系统模拟实验

文件管理系统模拟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]。
操作系统文件管理系统模拟实验

操作系统文件管理系统模拟实验操作系统文件管理系统模拟实验一、实验目的本实验旨在通过模拟操作系统的文件管理系统,加深对操作系统文件管理的理解,锻炼操作系统的应用能力。
二、实验环境1、操作系统:Windows/Linux/MacOS2、编程语言:C/C++/Java/Python等三、实验内容1、初始化文件管理系统1.1 创建根目录,并初始化空文件目录1.2 初始化用户目录和权限设置2、文件操作2.1 创建文件2.1.1 检查文件名合法性2.1.2 检查文件是否已存在2.1.3 为新文件分配磁盘空间2.1.4 添加文件元数据信息2.2 打开文件2.2.1 检查文件是否存在2.2.2 检查用户权限2.3 读取文件内容2.3.1 读取文件权限检查2.3.2 读取文件内容2.4 写入文件内容2.4.1 写入文件权限检查2.4.2 写入文件内容2.5 删除文件2.5.1 检查文件是否存在2.5.2 检查用户权限2.5.3 释放文件占用的磁盘空间2.5.4 删除文件元数据信息3、目录操作3.1 创建子目录3.1.1 检查目录名合法性3.1.2 检查目录是否已存在3.1.3 添加目录元数据信息3.2 打开目录3.2.1 检查目录是否存在3.2.2 检查用户权限3.3 列出目录内容3.3.1 列出目录权限检查3.3.2 列出目录内容3.4 删除目录3.4.1 检查目录是否存在3.4.2 检查用户权限3.4.3 递归删除目录下所有文件和子目录3.4.4 删除目录元数据信息四、实验步骤1、根据实验环境的要求配置操作系统和编程语言环境。
2、初始化文件管理系统,创建根目录,并初始化用户目录和权限设置。
3、进行文件操作和目录操作。
五、实验结果分析根据实验步骤进行文件操作和目录操作,观察系统的运行情况并记录相关实验结果。
六、实验结论通过本实验,深入了解了操作系统中文件管理系统的相关原理和实现方式,并且通过实验操作进一步巩固了相应的应用能力。
操作系统课程设计-一个简单的文件系统的详细设计

计算机系课程设计实验报告课程名称操作系统课程设计实验学期 2012 至 2013 学年第 1 学期学生所在系部计算机与信息管理系年级 2010 专业班级计算机001班学生姓名学号任课教师实验成绩计算机系制一个简单的文件系统的详细设计一、实验目的(1)阅读并调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
(2)了解设计一个n个用户的文件系统,每个用户可以保存M个文件。
用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。
二、实验要求1、阅读所给文件系统源程序,并加注释(注释量达60%),2、修改、完善该系统,画出所设计的文件系统的详细流程图。
三、文件系统功能设计1. 功能设计该文件系统是一个多用户、多任务的文件系统。
对用户和用户的文件数目并没有上限。
也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制。
该系统可以支持的操作命令如下:①bye——用户注销命令。
当使用该命令时,用户退出系统,注销该用户功能设计并回到登陆界面。
命令格式:bye②close——删除用户注册信息命令。
执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除。
命令执行完成后返回登陆界面。
命令格式:close③create——在当前目录下创建一个文件,且该文件不能跟当前已有的文件重名。
该文件的管理信息登记在用户文件信息管理模块中。
执行完该命令后回到执行命令行。
命令格式:create>file1其中:“>”符为提示符,file1为要创建的文件名。
④delete——删除当前用户目录下的一个文件,命令执行完毕返回至命令行。
命令格式:delete>file1其中:file1为要删除的文件名。
⑤list——显示当前注册目录下的所有文件信息,包括文件名、文件长度、文件操作权限。
文档管理系统方案

文档管理系统方案文档管理系统方案:为企业打造高效、便捷的文档管理平台随着企业业务的快速发展,文档资料的数量和种类不断增加,如何高效、有序地进行文档管理成为了企业面临的难题。
本文将介绍文档管理系统的构建方案,包括系统的主题、收集信息、需求分析、模型设计、编码实现、测试验证和优化改进等方面。
一、确定主题文档管理系统的主题是管理企业各类文档,包括文件、合同、规章制度、技术文档等,实现文档的存储、分类、检索、共享和权限控制等功能。
该系统的目标是为企业提供一个高效、便捷的文档管理平台,提高文档利用率和降低管理成本。
二、收集信息在确定主题后,我们需要收集相关信息,包括市场需求、用户痛点、竞争对手等。
通过调研和分析,我们发现市场上对文档管理系统的需求主要集中在以下几个方面:1、安全性:保障文档的保密性和完整性,确保只有授权用户能够访问和操作相关文档。
2、便捷性:提供快速、方便的文档检索和操作功能,提高工作效率。
3、可追溯性:实现文档的版本控制和历史记录追踪,方便用户跟踪文档的修改历史。
4、分类管理:支持按照文档类型、部门、项目等不同维度对文档进行分类管理,方便用户查找和管理相关文档。
三、需求分析在收集信息的基础上,我们对用户需求进行了深入分析,将系统需要实现的功能和特点归纳如下:1、用户管理:包括用户注册、登录、权限分配等功能。
2、文档存储:支持多种文件格式的存储,并提供文件大小限制和存储空间管理功能。
3、文档检索:支持按照关键词、文件名、内容等不同条件进行检索,并提供高级检索功能。
4、文档操作:支持文档的上传、下载、复制、移动、删除等操作。
5、文档分类:支持按照不同的分类标准对文档进行分类,并支持自定义分类。
6、权限管理:支持对不同用户进行不同的权限分配,确保文档的安全性。
7、版本控制:支持对文档进行版本控制,记录文档的修改历史。
8、统计分析:支持对文档的存储情况、使用情况等进行统计分析,为管理层提供决策支持。
基于ASP.NET MVC模式的文件管理系统的实现

基于 MVC模式的文件管理系统的实现 MVC is a popular web development framework that enables developers to build dynamic and robust web applications.A file management system is an application that helps users to organize, store, and access digital files efficiently. In this article, we will explore how to build a file management system using the MVC pattern.The MVC pattern is a Model-View-Controller (MVC) architecture that separates the application into three parts: the model, the view, and the controller. The model is responsible for managing data and business logic. The view displays information to the user. The controller handles user input and controls the flow of the application.To build a file management system using MVC, we need to understand the requirements, design the architecture, create the models and controllers, and implement the views and templates.RequirementsThe file management system should have the following features:1. User authentication: Users should be able to log in to the system securely and manage their files.2. File upload and download: Users must be able to upload and download files from the system.3. File sharing: Users should be able to share their files with otherusers.4. File search: Users should be able to search for files by name, date, and other criteria.5. File versioning: The system should support multiple versions of files, enabling users to track changes and revert to earlier versions.6. File synchronization: The system must support synchronization between devices, enabling users to access files from anywhere and on any device.ArchitectureThe architecture of the file management system should follow the MVC pattern. The system will have three parts:1. Model: The model is responsible for managing data and business logic. The model will include classes for managing user accounts, files, sharing, versioning, and synchronization.2. View: The view is responsible for displaying data to the user. The user interface will be created using HTML, CSS, and JavaScript.3. Controller: The controller handles user input and controls the flow of the application. The controller will handle user authentication, file upload and download, file sharing, file search, file versioning, and file synchronization.Models and ControllersWe will create the following models and controllers to implement the features of the file management system:1. Account model: The account model will manage user accounts and include methods for user authentication, user registration, and user profile management.2. File model: The file model will manage files and include methods for file upload, file download, file sharing, file search, and file versioning.3. HomeController: The HomeController will handle user authentication and display the home page of the application.4. AccountController: The AccountController will handle user authentication, user registration, and user profile management.5. FileController: The FileController will handle file upload and download, file sharing, file search, file versioning, and file synchronization.Views and TemplatesWe will create the following views and templates to implement the user interface of the file management system:1. Login view: The login view will display the login form and enable users to log in to the system.2. Register view: The register view will display the registration form and enable users to create new accounts.3. Home view: The home view will display the user's home page and enable users to access their files.4. File upload view: The file upload view will display the file upload form and enable users to upload their files.5. File download view: The file download view will enable users to download their files.6. File sharing view: The file sharing view will enable users to share their files with other users.7. File search view: The file search view will enable users to search for files by name, date, and other criteria.ConclusionIn this article, we explored how to build a file management system using the MVC pattern. We discussed the requirements, design, models, controllers, views, and templates required for building such an application. With this knowledge, you can start building your own file management system using MVC.为了便于阐述,本文将针对一个在线学习平台的业务数据进行分析,并总结其中的洞察和趋势,以便为业务决策提供参考。
如何编写一个简单的操作系统文件系统

如何编写一个简单的操作系统文件系统操作系统文件系统是操作系统管理存储设备上文件和目录的系统。
它的设计和实现对操作系统的性能和功能有着重要的影响。
一个好的文件系统需要具备高效的存储管理、可靠的数据存储和恢复机制、良好的用户接口等特点。
下面通过简单的文件系统设计来介绍文件系统的基本原理和实现步骤。
一、文件系统的基本要求1.存储管理:文件系统需要能够有效地管理存储设备上的存储空间,实现文件的分配和释放。
2.数据存储与恢复:文件系统需要具备数据持久化的能力,能够保证文件在存储设备上安全存储,并能够在系统崩溃时自动恢复数据。
3.文件操作接口:文件系统需要提供用户友好的文件操作接口,如读取、写入、创建、删除、重命名等操作。
二、文件系统设计1.文件控制块(FCB):文件系统中的每个文件都有对应的文件控制块,用来存储文件的基本信息,如文件名、大小、创建时间、修改时间、访问权限等。
2.目录结构:文件系统需要维护一个目录结构,用来记录文件和目录的层次关系。
可以采用树形结构来组织目录,每个目录节点包含文件或子目录的信息。
3.空闲块管理:文件系统需要通过空闲块管理来实现文件存储空间的分配和释放。
可以采用位图或空闲块链表的方式进行管理。
4.存储分配策略:文件系统需要设计合适的存储分配策略,如连续分配、链式分配、索引分配等。
不同的分配策略对文件系统的性能和可靠性有着重要影响。
5.数据恢复机制:文件系统需要设计合适的数据恢复机制来保证文件在系统崩溃时能够正确地恢复数据。
可以采用日志、备份、快照等方式来实现数据恢复。
6.用户接口:文件系统需要提供良好的用户接口,使用户能够方便地进行文件操作。
可以设计命令行或图形界面来实现用户与文件系统的交互。
三、文件系统实现步骤1.设计文件控制块结构:根据文件系统的需求,设计合适的文件控制块结构,包括文件名、文件大小、创建时间、修改时间、访问权限等字段。
2.设计目录结构:根据文件系统的需求,设计合适的目录结构,包括目录名称、父目录、子目录和文件的信息等字段。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.设计说明设计实现一个简单的模拟文件管理系统,包括目录文件、普通文件、i结点和存储区,具体要求如下:(1)程序初始化时应构造如图1-1所示的目录结构。
图1-1 初始目录树(2)在此模拟文件管理系统中可以实现的操作有:改变目录:cd<目录名>,工作目录转移到指定的目录下。
目录不存在时,给出错误信息。
创建文件:edit<文件名>,创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。
对于重名文件给出错误信息。
删除文件:del<文件名>,当没在用户使用指定文件时,将其删除。
文件不存在时给出错误信息。
显示目录:dir<目录名>,显示指定目录下的全部文件和第一级子目录,如果没有指定目录名,则显示当前目录下的相应内容。
创建目录:md<目录名>,在指定路径下创建指定的目录,如没有指定路径,则在当前目录下创建指定的目录。
对于重名目录给出错误信息。
删除目录:rd<目录名>,删除指定目录及其下的全部文件和子目录。
如果指定目录为空,可直接删除,否则给出用户提示是否删除。
其他说明:<目录名>和<文件名>都支持全路径名和相对路径名。
文件名由目录结构中各级文件名分量排列构成,各分量间用“/”隔开。
输入exit命令可退出此模拟文件管理系统。
二.工作原理2.1 编译工具本程序使用的函数均为标准C库函数,可以由任何支持标准C的编译器编译运行。
已经通过测试的编译环境如下:Windows平台:Visual C++ 6.0使用方法:用VC6打开fileSys.c文件,执行Build,根据对话框提示创建工程文件。
Build完成即可用Execute运行程序。
Linux平台: Gcc 2.96使用方法:到fileSys.c所在路径下,执行命令gcc-o fileSys fileSys.c生成可执行文件fileSys,执行./fileSys运行程序。
2.2 相关说明支持相对路径和绝对路径:相对路径如“cd user/file1↙”,“dir↙”绝对路径如“cd /user/file1”(root指根目录)、“cd /user/file1↙”、“cd/↙”(表示对根目录操作)如果命令或路径出错会有详尽的提示。
在新建文件或目录中,若文件名或目录名同名的文件或目录下已存在,则创建失败并给以提示。
CD命令中,如果遇到路径错误,将报错,并保持在当前路径下等待下一次命令。
如果有命令格式或者文件目录格式有错,系统将报错,并提示用户,允许重试。
不允许对文件操作的命令与对目录操作的命令混用,否则报错。
本系统采用了动态分布存储空间的链表结构,所以对文件数目没有明确限制,只受系统资源制约。
Exit为退出系统命令,该命令不能接目录名。
在6个命令中,只有dir可接空路径名,表示对当前目录的操作,其他的将会对命令格式的错误情况报错。
三.详细设计3.1程序框架及函数调用关系函数之间的关系如图3-1所示,每个函数的说明如下:Main(): 主函数CdComd(): 改变目录功能处理EditComd(): 创建文件功能处理DelComd(): 删除文件功能处理RdComd(): 删除目录功能处理Dircomd(): 显示目录功能处理Mdcomd(): 创建目录功能处理Init(): 初始化文件树ParseCommand(): 接受输入的命令并将其分解成操作名和路径文件名ExecuteCommand(): 执行命令,根据参数Paral,调用相应的功能处理模块;若输入命令有误,则报错图3-1 调用关系图FindPath(): 查找参数ph所指向的路径FindFileName(): 从参数para2中找到要建立或删除的子目录,文件名,并调用查找路径子函数把指针指向其父亲结点CreateFileNode(): 创建结点GetInput(): 缓冲区安全输入子函数,如果输入超过缓冲区长度,则截取前[缓冲区长度-1]位,最后一位补“/0”CheckCommand(): 命令检查GetDir(): 获取当前目录名Trim(): 对命令进行格式处理,即去掉空格等3.2数据结构及相应算法整个文件系统采用二叉树型存储结构,如图3-2所示图3-2 初始目录树每一个结点的结构如下:Struct FileNode{Char filename[FILENAME_LEN]; //文件名/目录名int isdir; //目录文件识别标志int i_nlind; //文件的链接数int adr; //文件的地址Struct FileNode *parent,*child; //指向父亲的指针和指向左孩子的指针Struct FileNode *sibling_prev,*sibling_next;//指向前一个兄弟的指针//和指向后一个兄弟的指针};3.3程序流程图本程序中共包含一个主函数和16个子函数,这里仅对其中的9个函数用流程图来进行详细说明。
(1) Main()主函数(见图3-3)图3-3 主程序流程图(2)FindFileName()子函数:获取文件或目录名,并调用查找路径子函数把指针指向其父亲结点(见图3-4)图3-4 FindFileName()(3)ParseCommand()分解命令子函数(见图3-5)图3-5 ParseCommand()(4)FindPath():查找路径子函数,ph是路径名参数(见图3-6)图3-6 FindPath()(5)CdComd():cd改变目录功能处理子函数(见图3-7)图3-7 CdComd()(6)EditComd():edit创建文件功能处理子函数(见图3-8)图3-8 EditComd()(7)DelComd():del删除文件功能处理子函数(见图3-9)图3-9 DelComd()(8)RdComd():rd删除目录功能处理子函数(见图3-10)图3-10 RdComd()(9)DirComd():dir显示目录功能处理子函数(见图3-11)图3-11 DirComd()3.4程序源代码#include <stdio.h>#include <iostream.h>#include <string.h>#include <ctype.h>#include <stdlib.h>#define FILENAME_LEN 21#define INPUT_LEN 81#define COMMAND_LEN 11//结点结构struct FileNode{char filename[FILENAME_LEN];//文件名/目录名int isdir;//目录文件识别标志int i_nlink;//文件的链接数int adr;//文件的地址struct FileNode *parent, *child;//指向父亲的指针和指向左孩子的指针struct FileNode *sibling_prev, *sibling_next;//指向前一个兄弟的指针和指向//后一个兄弟的指针.};void Init();//初始化文件树int ParseCommand();//接受输入的命令并把其分解成操作名和路径文件名void ExecuteCommand();//执行命令int cdComd();//处理cd命令int editComd();//处理edit命令int delComd();//处理del命令int rdComd();//处理rd命令int dirComd();//处理dir命令int mdComd();//处理md命令int FindPath(char *ph);//寻找参数ph所指向的路径//从参数Para2中找到要建立或删除的文件、目录名,并把指针指向其父亲结点int FindFilename(char Para2[]);struct FileNode* CreateFileNode(char filename[],int isdir,int i_nlink);//创建结点int GetInput(char* buffer,unsigned int buffer_len);//获取输入int CheckCommand();//命令检查int GetDir(int begin,char* path,char* curDir);//获取路径void Trim(char* str);struct FileNode *cp, *tp, *root,*upper;char path[INPUT_LEN-COMMAND_LEN];//记录当前走过的路径char curpath[INPUT_LEN-COMMAND_LEN],Para1[COMMAND_LEN],Para2[INPUT_LEN-COMMAND_LEN],tmppath[INPUT_LEN-COMMAND_LEN];char filename[FILENAME_LEN],dirname[FILENAME_LEN],tmp;unsigned int i,j;//主函数int main(){Init();//初始化文件树while(1){if(ParseCommand())//分解命令ExecuteCommand();//执行命令}}//执行命令子函数void ExecuteCommand(){int sign;//根据参数Para1调用相应的功能处理模块if(strcmp(Para1,"cd")==0)sign=cdComd(); //cd命令else if(strcmp(Para1,"edit")==0)sign=editComd(); //edit命令else if(strcmp(Para1,"del")==0)sign=delComd(); //del命令else if(strcmp(Para1,"dir")==0)sign=dirComd(); //dir命令else if(strcmp(Para1,"md")==0)sign=mdComd(); //md命令else if(strcmp(Para1,"rd")==0)sign=rdComd(); //rd命令else if(strcmp(Para1,"exit")==0)exit(0); //exit命令elseprintf("命令错误,请重试\n"); //命令输入不正确,报错}//创建结点struct FileNode* CreateFileNode(char filename[],int isdir,int i_nlink){//申请结点空间struct FileNode* node=(struct FileNode*)malloc(sizeof(struct FileNode));//相应内容赋初值strcpy(node->filename,filename);node->isdir=isdir;node->i_nlink=i_nlink;node->parent=NULL;node->child=NULL;node->sibling_prev=NULL;node->sibling_next=NULL;return node;}//初始化文件树void Init(){struct FileNode *binNode,*usrNode,*unixNode,*etcNode,*libNode,*userNode,*binNode2,*liuNode,*sunNode,*ftiNode;strcpy(path,"/"); //根目录写入当前路径//创建文件树的结点binNode=CreateFileNode("bin",1,0);usrNode=CreateFileNode("usr",1,0);unixNode=CreateFileNode("unix",0,0);etcNode=CreateFileNode("etc",1,0);libNode=CreateFileNode("lib",1,0); userNode=CreateFileNode("user",1,0); binNode2=CreateFileNode("bin",1,0);liuNode=CreateFileNode("liu",1,0); sunNode=CreateFileNode("sun",1,0);ftiNode=CreateFileNode("fti",1,0);cp=tp=root=CreateFileNode("/",1,0);//结点相应内容赋值root->parent=NULL;root->child=binNode;root->sibling_prev=root->sibling_next=NULL;binNode->parent=root;binNode->child=NULL;binNode->sibling_prev=NULL;binNode->sibling_next=usrNode;usrNode->parent=NULL;usrNode->child=libNode;usrNode->sibling_prev=binNode;usrNode->sibling_next=unixNode;unixNode->parent=NULL;unixNode->child=NULL;unixNode->sibling_prev=usrNode;unixNode->sibling_next=etcNode;etcNode->parent=NULL;etcNode->child=NULL;etcNode->sibling_prev=unixNode;etcNode->sibling_next=NULL;libNode->parent=usrNode;libNode->child=liuNode;libNode->sibling_prev=NULL;libNode->sibling_next=userNode;userNode->parent=NULL;userNode->child=NULL;userNode->sibling_prev=libNode;userNode->sibling_next=binNode2;binNode2->parent=NULL;binNode2->child=NULL;binNode2->sibling_prev=userNode;binNode2->sibling_next=NULL;liuNode->parent=libNode;liuNode->child=NULL;liuNode->sibling_prev=NULL;liuNode->sibling_next=sunNode;sunNode->parent=NULL;sunNode->child=NULL;sunNode->sibling_prev=liuNode;sunNode->sibling_next=ftiNode;ftiNode->parent=NULL;ftiNode->child=NULL;ftiNode->sibling_prev=sunNode;ftiNode->sibling_next=NULL;}//获取文件或目录名,并把指针指向其父亲结点int FindFilename(char Para2[]){i=strlen(Para2)-1;j=0;while(Para2[i]!='/'&& i>=0){filename[j]=Para2[i];i--; j++;}filename[j]='\0';//获得逆序的文件或目录名,存入filename中if(i<0) Para2[i+1]='\0';else Para2[i]='\0';j--;//filename逆转,获得正确的文件或目录名for(i=0;i<strlen(filename)/2;i++,j--){tmp=filename[i];filename[i]=filename[j];filename[j]=tmp;}//查找路径if(strlen(Para2)>0){int sign=FindPath(Para2);if(sign==0) return 0;}return 1;}//缓冲区安全输入子函数//如果输入超过buffer_len,则截取前buffer_len-1长度的输入,//buffer_len处字符用'/0'代替int GetInput(char* buffer,unsigned int buffer_len){unsigned int count=0;while(count<buffer_len){if((buffer[count]=getchar())==10){buffer[count]='\0';return count;}count++;}while(getchar()!=10);buffer[buffer_len-1]='\0';return -1;}//分解命令子函数int ParseCommand(){char Inputs[INPUT_LEN];int i=0,j=0,ch;unsigned int k=0;printf("%s>",path);//获取输入if(GetInput(Inputs,INPUT_LEN)==-1){printf("输入行太长。