c++操作系统 仿linux 二级文件管理系统

合集下载

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

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

操作系统课程设计模拟简单二级文件管理系统*名:***学号:系别:计算机学院专业:网络工程年级:16级指导教师:2019年05 月11 日一、课程设计项目介绍(含项目介绍及设计目的)1、设计目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。

2、项目介绍:为LINUX 设计一个简单的二级文件系统。

本文件系统采用类似DOS系统的文件管理方式,每次调用该文件系统时,首先申请一定的内存空间,然后对该内存空间进行分配。

将申请到的空间划分为目录区,文件区;采用位示图进行空间管理,盘块的分配使用显示链接(FAT表)的方式。

每次调用该文件系统时自动为其分配空间,并将上次操作的结果从硬盘上调入内存;当结束调用时则将操作的结果重新存入硬盘,以便下次调用。

(每次使用都会自动搜索文件系统,以此确定是否是第一次使用;若是则格式化生成文件系统,否则读取已存在的文件系统。

)本项目通过VC编写简单的二级文件系统的代码,实现文件管理方式,使用者只需要给出相应的文件操作命令就可以分别得到各类文件操作的相应,并且可以选择登陆或注销不同用户。

二、总体设计(含系统的总体结构、原理框图或各模块介绍等)1、系统总体结构图:2、模块介绍(1)、主函数部分:在主函数系统接受输入信息,包括登陆用户和注册用户,登陆完成后选择相应的文件操作,可以选择创建目录、浏览目录、修改目录、创建文件等操作,如果选择错误就会出现相应的提示信息。

(2)、命令解释层函数:在命令解释层函数cmdexp()里加了一些选择和操作功能,增加程序实现的功能,如原来程序只有显示当前目录和文件、创建目录和修改目录的功能,把它拓展到系统所要求的全部功能,并在原有的程序的基础上进行相应的修改,使程序更加完善。

(3)、文件系统格式化函数:该函数首先建立文件,申请空间,在设置成功时将其空间写入filesystem.dat,使filesystem.dat为1M。

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

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

文件管理系统模拟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、进行文件操作和目录操作。

五、实验结果分析根据实验步骤进行文件操作和目录操作,观察系统的运行情况并记录相关实验结果。

六、实验结论通过本实验,深入了解了操作系统中文件管理系统的相关原理和实现方式,并且通过实验操作进一步巩固了相应的应用能力。

计算机操作系统实验二

计算机操作系统实验二

计算机操作系统实验二一、实验目的本实验旨在通过实际操作,深入理解和掌握计算机操作系统中的进程与线程管理。

通过实验,我们将了解进程的创建、执行、阻塞、唤醒等状态以及线程的创建、同步、通信等操作。

同时,通过实验,我们将学习如何利用进程和线程提高程序的并发性和效率。

二、实验内容1、进程管理a.进程的创建与执行:通过编程语言(如C/C++)编写一个程序,创建一个新的进程并执行。

观察和记录进程的创建、执行过程。

b.进程的阻塞与唤醒:编写一个程序,使一个进程在执行过程中发生阻塞,并观察和记录阻塞状态。

然后,通过其他进程唤醒该进程,并观察和记录唤醒过程。

c.进程的状态转换:根据实际操作,理解和分析进程的状态转换(就绪状态、阻塞状态、执行状态)以及转换的条件和过程。

2、线程管理a.线程的创建与同步:编写一个多线程程序,创建多个线程并观察和记录线程的创建过程。

同时,使用同步机制(如互斥锁或信号量)实现线程间的同步操作。

b.线程的通信:通过消息队列或其他通信机制,实现多个线程间的通信。

观察和记录线程间的通信过程以及通信对程序执行的影响。

c.线程的状态转换:根据实际操作,理解和分析线程的状态转换(新建状态、就绪状态、阻塞状态、终止状态)以及转换的条件和过程。

三、实验步骤1、按照实验内容的要求,编写相应的程序代码。

2、编译并运行程序,观察程序的执行过程。

3、根据程序的输出和实际操作情况,分析和理解进程与线程的状态转换以及进程与线程管理的相关原理。

4、修改程序代码,尝试不同的操作方式,观察程序执行结果的变化,进一步深入理解和掌握进程与线程管理。

5、完成实验报告,总结实验过程和结果,提出问题和建议。

四、实验总结通过本次实验,我们深入了解了计算机操作系统中的进程与线程管理原理和实践操作。

在实验过程中,我们不仅学习了如何利用编程语言实现进程和线程的操作,还通过实际操作观察和分析了进程与线程的状态转换以及进程与线程管理的基本原理。

linux的文件系统、目录结构、文件管理实验报告

linux的文件系统、目录结构、文件管理实验报告

linux的文件系统、目录结构、文件管理实验报告Linux是一款使用广泛的操作系统,具有丰富的文件系统、目录结构、文件管理系统。

以下是Linux文件系统实验报告。

一、文件系统文件系统是指计算机操作系统用来管理文件和数据存储空间的一种机制。

Linux系统使用的是可扩展的第二代文件系统(ext2、ext3、ext4),它支持更大的文件和更大的分区,并使用了更高效的索引和更快的文件系统检查。

二、目录结构Linux目录结构是一个统一的层次结构,它将计算机的所有文件都组织到一个合理的层次结构中。

以下是Linux常见的目录结构:1. /(根目录):根目录是文件系统的根节点,所有文件和目录都以它为起点。

2. /bin:包含一些最基本的系统工具,比如ls、cp、mv等常用命令。

3. /dev:包含系统设备文件。

4. /etc:包含系统中的配置文件和脚本文件。

5. /home:用于存储用户的个人文件和数据。

6. /lib:包含了系统中使用的一些共享库文件。

7. /mnt:用于挂载外部设备,比如USB、CD-ROM等。

8. /opt:用于存放第三方软件的安装文件和数据。

9. /proc:该目录是一个虚拟目录,它不占用实际存储空间,但可以查看和修改系统的运行状态。

10. /root:超级用户的家目录。

11. /sbin:包含一些管理系统的系统管理员使用的工具。

12. /tmp:用于存放临时文件和目录。

13. /usr:用于存放非本地(不是系统)用户的应用程序和数据。

14. /var:用于存放可变的数据,比如日志文件。

三、文件管理文件管理是指对计算机文件进行操作,如创建、复制、粘贴、移动和删除等。

下面是Linux 文件管理的一些常见命令:1. ls:列出目录中的文件和子目录。

2. cd:切换目录。

3. mkdir:创建一个新目录。

4. touch:创建一个新文件。

5. cp:复制文件或目录。

6. mv:移动或重命名文件。

操作系统课程设计项目参考

操作系统课程设计项目参考

滴加碘液后
滴加碘液前
12/12/2021
第十二页,共二十三页。
消化(xiāohuà):在消化道内将食物分解成可吸收 (xīshōu)的成分的过程
(包括物理性消化和化学性消化)
吸收(xīshōu):营养物质通过消化道壁进入循环 系统的过程
12/12/2021
第十三页,共二十三页。
消化(xiāohuà)和吸收的过程
12/12/2021
第十九页,共二十三页。
练习(liànxí)
• 2、分析数据,指出(zhǐ chū)哪一部分消化道中消化液最多。
• 在每天摄入800克食物和1200毫升水的情况下, 消化腺大致分泌以下数量消化液。 1500毫升唾液 2000毫升胃液 1500毫升肠液 500毫升胆汁 1500毫升胰液
12/12/2021
第二十二页,共二十三页。
内容 总结 (nèiróng)
第二节。食物中的营养物质是在消化系统中被消化和吸收的。这粒西瓜籽在姗姗的消化道内, 经过了难忘的时光。它先遇到像轧钢机似的上、下尖硬的怪物,差点儿将它压得粉身碎骨。后来它
No 钻进了一条(yī tiáo)又长又窄的迷宫,它在这里走了很久,身边的许多物质都神秘地消失了。走出迷
唾液腺、胃腺(wèixiàn)、肝脏、胰腺、肠腺
1、淀粉在__口__腔__开始消化、蛋白质在____开始胃消化、脂肪在_______开始 消小化肠。
2、胆汁是一种消化液,但不含消化酶,起乳化脂肪的作用。
二、人体消化、吸收的主要器官—— _____小肠 能 训 练解
胰脏:分泌(fēnmì)胰液 肠腺:分泌肠液
肝脏:最大的腺体,分泌胆汁。 胆汁无消化酶,有乳化脂肪 的
作用。
第七页,共二十三页。

操作系统原理及应用(Linux)第5章 文件管理

操作系统原理及应用(Linux)第5章 文件管理
直 接 块
Addr[11]
Addr[12] 一次间接

Addr[13] 二次间接
Addr[14] 三次间接

物理块
… …
… …
混合索引表
假设1个磁盘块4KB,一个索引表项占4B, 直接索引表引出磁盘块 12个
12*4KB=48KB 一级索引表引出文件磁盘块的数量
4KB/4B=1K个 支持的文件长度 1K*4KB=4MB 二级索引表引出文件磁盘块的数量1K*1K 支持的文件长度 1K*1K*4KB=4GB 三级索引表引出文件磁盘块的数量1K*1K*1K 支持的文件长度 >1K*1K*1K*4KB=4TB
…… ……
666 7771
文 索引表指针
件 说 明
索引表
逻辑 块号
0
1 2 3
物理 块号
26
文 件
索引表指针


索引表
逻辑 块号
0
1 2 3
4
物理 块号
NULL
27
优点:既能方便迅速地实现随机存取,又能满足文件动态 增长的需要。 缺点:增加了索引表带来的存储空间开销。
2.多级索引(类似多级页表)
1.数据项 数据项是描述一个对象的某种属性的字符集,是数据组织中可以命名的最 小逻辑数据单位。 2.记录 记录是一组相关数据项的集合,用于描述一个对象在某方面的属性。 3.文件 文件是由创建者定义的、具有文件名的一组相关信息的集合。
4
5.1.2 文件系统
文件系统是操作系统中对文件进行管理和操作的软件机构与数据的 集合,即文件管理系统。 1.文件系统的需解决的问题 (1)有效地分配存储器的存储空间。 (2)提供一种组织数据的方法。数据在辅存设备上的分布构成了文件的 物理结构,实现了“按名存取”的功能。 (3)提供合适的存取方法。 (4)提供一组服务,以执行所需要的操作。这些操作包括创建文件、撤 消文件、组织文件、读文件、写文件、传输文件和控制文件的访问权限 等。

操作系统编译实验报告

操作系统编译实验报告

一、实验目的1. 了解操作系统的基本组成和编译过程;2. 掌握使用GCC编译器编译操作系统的基本步骤;3. 熟悉操作系统的启动过程;4. 培养动手实践能力和团队合作精神。

二、实验环境1. 操作系统:Linux2. 编译器:GCC3. 实验平台:虚拟机三、实验内容1. 操作系统基本组成2. 编译器使用3. 操作系统启动过程四、实验步骤1. 操作系统基本组成操作系统主要由以下几个部分组成:(1)引导程序(Bootloader):负责加载操作系统内核;(2)内核(Kernel):操作系统核心,负责管理计算机硬件资源;(3)系统调用接口(System Call Interface):用户程序与内核之间的接口;(4)用户程序(User Programs):提供用户与计算机交互的平台。

2. 编译器使用(1)安装GCC编译器:在Linux系统中,通常可以通过包管理器安装GCC编译器。

以Debian/Ubuntu为例,可以使用以下命令安装:sudo apt-get install build-essential(2)编写源代码:编写操作系统内核的源代码,保存为C语言文件,例如kernel.c。

(3)编译源代码:使用GCC编译器将源代码编译成可执行文件。

以kernel.c为例,编译命令如下:gcc -o kernel kernel.c3. 操作系统启动过程(1)引导程序:当计算机启动时,引导程序首先被加载到内存中。

引导程序负责查找操作系统内核的位置,并将其加载到内存中。

(2)内核初始化:内核被加载到内存后,开始执行初始化过程。

初始化过程包括内存管理、设备驱动程序加载等。

(3)系统调用接口:内核初始化完成后,系统调用接口被建立。

用户程序可以通过系统调用与内核进行交互。

(4)用户程序运行:用户程序被加载到内存中,开始执行。

用户程序可以通过系统调用请求内核提供的服务。

五、实验结果与分析1. 编译成功使用GCC编译器成功编译了操作系统内核源代码,生成了可执行文件。

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

实现了操作系统的管理员与用户登录权限的分离,还有文件夹的增删改查文件的增删改查,模拟linux。

main.cpp#include <iostream>#include <string>#include "BFSystem.h"using namespace std;FBSystem *g_FBSystem = NULL;int main(){int a;char g_UserName[256]; //用户名char g_PassWord[256]; //密码g_FBSystem = new FBSystem();//用户验证cout<<"用户名: ";cin>>g_UserName;cout<<"密码: ";char c,m[] = "???";int i;for(i=0;i<3;i++){doc = getch();while(c<'0'||c>'9');m[i] = c;putchar('*');}while(1) //回车继续{c = getch();if(c==13)break;}if(g_FBSystem->Login(g_UserName,m)){cout<<endl;cout<<"登陆成功!"<<endl;cout<<"欢迎:";cout<<g_UserName<<endl;}else{ cout<<endl;cout<<"无此用户:"<<g_UserName<<"输入任意键退出!"<<endl;char exit;cin>>exit;return 0;}//系统初始化g_FBSystem->Initialize();char time[32];strcpy(time,g_FBSystem->GetTime()); //将后者复制给前者printf("时间:%s\n",time);g_FBSystem->ShowMenu();while (1){memset(g_FBSystem->m_CommandTemp,NULL,32); //将g_FBSystem->m_CommandTemp全部变成nullcin.sync(); //清除cin缓冲区for (int i=0; i<10;i++){if(g_FBSystem->m_CurPath[i][0]!=0)cout<<g_FBSystem->m_CurPath[i];}cin>>g_FBSystem->m_CommandTemp;int commandID = g_FBSystem->SeekCommand(g_FBSystem->m_CommandTemp);char name[256];char name1[256];char text[256];memset(text,0,256);switch(commandID){case 0:cin>>name;g_FBSystem->CreateDirectory(name);break;case 1:cin>>name;g_FBSystem->DeleteDirectory(name);break;case 2:cin>>name;cin>>name1;g_FBSystem->RenameDirectory(name, name1);break;case 3:cin>>name;g_FBSystem->OpenDirectory(name);break;case 4:cin>>name;g_FBSystem->CreateFile(name);break;case 5:cin>>name;g_FBSystem->DeleteFile(name);break;case 6:cin>>name;cin>>name1;g_FBSystem->RenameFile(name, name1);break;case 7:g_FBSystem->Format();break;case 8:cin>>name;g_FBSystem->Read(name);break;case 9:cin>>name;g_FBSystem->Write(name);break;case 10:g_FBSystem->ShowMenu();break;case 11:g_FBSystem->ShowAllFiles();break;case 12:g_FBSystem->ReturnPreDirectory();break;case 13:cin>>name;g_FBSystem->Inquiry(name);break;case 14:cin>>name[0];g_FBSystem->FuzzyInquiry(name[0]);break;case 15:g_FBSystem->Exit();return 0;break;default:break;}}return 0;}FBSystem.cpp#include "BFSystem.h"FBSystem::FBSystem(){m_NumOfObject = 0; //初始化对象数目为0strcpy(m_UserName1,"yjz");strcpy(m_Password1,"123");strcpy(m_UserName2,"jj");strcpy(m_Password2,"123");strcpy(m_Command[0],"mkdir"); //初始化命令行strcpy(m_Command[1],"mddir");strcpy(m_Command[2],"rndir");strcpy(m_Command[3],"cd");strcpy(m_Command[4],"mkfile");strcpy(m_Command[5],"mdfile");strcpy(m_Command[6],"rnfile");strcpy(m_Command[7],"format");strcpy(m_Command[8],"read");strcpy(m_Command[9],"write");strcpy(m_Command[10],"menu");strcpy(m_Command[11],"dir");strcpy(m_Command[12],"cd..");strcpy(m_Command[13],"query");strcpy(m_Command[14],"fquery");strcpy(m_Command[15],"exit");memset(m_CommandTemp, NULL, 32);memset(m_CurPath, NULL, 2560);strcpy(m_CurPath[0], "root\\");this->m_CurPathFatherID = 0;this->m_CurPathID = 0;this->m_CurMaxID = 0;this->m_CurFaID = 0;this->m_pow=0;}bool FBSystem::Login(char* _userName, char* _password){if (strcmp(_userName, m_UserName1)==0&&strcmp(_password, m_Password1)==0){m_pow=1;return true;}if (strcmp(_userName, m_UserName2)==0&&strcmp(_password, m_Password2)==0){m_pow=0;return true;}return false;}void FBSystem::Initialize(){FILE *m_FilePoint=fopen("system","rb"); //以只读方式打开系统文件if(m_FilePoint==NULL){printf("无法打开:");printf("system");}fseek(m_FilePoint,0,0); //定位文件指针到文件起始位置int num;fread(&num,4,1,m_FilePoint);m_NumOfObject = num;if (num>0){fseek(m_FilePoint, 4, SEEK_SET); //相对于文件起始点第5个字节的位置for (int i = 0; i<m_NumOfObject; i++) //读取文件中的信息,并压入列表中{FBObject *temp = new FBObject();fread(temp, sizeof(FBObject), 1, m_FilePoint);this->m_ObjectList.push_back(*temp);}}fclose(m_FilePoint);}bool FBSystem::CreateDirectory(char* _dirName){for(this->m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator){if (!strcmp(m_ObjectIterator->name, _dirName) && m_ObjectIterator->type == 0){cout<<"目录名重复!"<<endl;return false;}}FBObject *temp = new FBObject();char time[256];strcpy(time,GetTime());temp->fatherID = this->m_CurPathID;strcpy(temp->lastTime,time);strcpy(temp->name,_dirName);temp->objectID = GetMaxID();temp->size = 0;temp->type = 0; //0为目录this->m_ObjectList.push_back(*temp);return true;}bool FBSystem::DeleteDirectory(char* _dirName){for(this->m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator){if (!strcmp(m_ObjectIterator->name, _dirName) && m_ObjectIterator->type ==0){//检查该目录是否为非空list<FBObject>::iterator temp;for(temp = m_ObjectList.begin();temp!= m_ObjectList.end();++temp){if (temp->fatherID == m_ObjectIterator->objectID){cout<<"不能删除非空的目录!"<<endl;return false;}}//空则可以删除m_ObjectIterator = m_ObjectList.erase(m_ObjectIterator);return true;}}return true;}bool FBSystem::RenameDirectory(char* _srcName, char* _descName){for(this->m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator){if (!strcmp(m_ObjectIterator->name, _srcName) && m_ObjectIterator->type == 0){strcpy(m_ObjectIterator->name, _descName);return true;}}return true;}bool FBSystem::OpenDirectory(char* _name){for(this->m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator){//存在该名称且类型为目录if (!strcmp(m_ObjectIterator->name, _name) && m_ObjectIterator->type==0){int temp =0;for (int i=0; i<10;i++){if(m_CurPath[i][0]==0){temp = i;break;}}strcat(m_CurPath[temp],_name);strcat(m_CurPath[temp],"\\");m_CurPathFatherID = m_CurPathID;m_CurPathID = m_ObjectIterator->objectID;return true;}}if (!strcmp("root", _name)){memset(m_CurPath, NULL, 2560);strcpy(m_CurPath[0], "root\\");m_CurPathFatherID = 0;m_CurPathID = 0;return true;}cout<<"错误操作!"<<endl;return false;}bool FBSystem::CreateFile(char* _fileName){for(this->m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator){if (!strcmp(m_ObjectIterator->name, _fileName) && m_ObjectIterator->type ==1){cout<<"文件名重复!"<<endl;return false;}}FBObject *temp = new FBObject();char time[256];strcpy(time,GetTime());temp->fatherID = this->m_CurPathID;strcpy(temp->lastTime,time);strcpy(temp->name,_fileName);temp->objectID = GetMaxID();temp->size = 0;temp->type = 1; //0为目录this->m_ObjectList.push_back(*temp);FILE *p = fopen(_fileName,"w+");fclose(p);return true;}bool FBSystem::DeleteFile(char* _fileName){for(this->m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator){if (!strcmp(m_ObjectIterator->name, _fileName) && m_ObjectIterator->type ==1){remove(m_ObjectIterator->name);m_ObjectIterator = m_ObjectList.erase(m_ObjectIterator);return true;}}return true;}bool FBSystem::RenameFile(char* _srcName, char* _descName){for(this->m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator){if (!strcmp(m_ObjectIterator->name, _srcName) && m_ObjectIterator->type == 1){strcpy(m_ObjectIterator->name, _descName);rename(_srcName,_descName);return true;}}return true;}void FBSystem::Format(){for(this->m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator){if(m_ObjectIterator->type == 1)remove(m_ObjectIterator->name);}m_ObjectList.clear();m_NumOfObject = 0; //初始化对象数目为0memset(m_CommandTemp, NULL, 32);memset(m_CurPath, NULL, 2560);strcpy(m_CurPath[0], "root\\");this->m_CurPathFatherID = 0;this->m_CurPathID = 0;this->m_CurMaxID = 0;}bool FBSystem::Read(char* _name){for(this->m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator){if(!strcmp(_name,m_ObjectIterator->name) && m_ObjectIterator->type == 1&&m_ObjectIterator->fatherID == m_CurPathID){FILE *p = fopen(_name, "rb");if(p==NULL)return false;char *temp = new char[m_ObjectIterator->size];fread(temp, m_ObjectIterator->size, 1, p);temp[m_ObjectIterator->size] = '\0';cout<<temp<<endl;fclose(p);return true;}}cout<<"错误操作!"<<endl;return false;}bool FBSystem::Write(char* _name){for(this->m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator){if(!strcmp(_name,m_ObjectIterator->name) && m_ObjectIterator->type == 1 &&m_ObjectIterator->fatherID == m_CurPathID){cout<<"Input:"<<endl;cin.sync();char ch[256];cin.get(ch,256);int size = 0;for (int i=0;i<256;i++){if(ch[i]==NULL){size = i;break;}}FILE *p = fopen(_name, "w+");fwrite(ch, size, 1, p);m_ObjectIterator->size = size;fclose(p);return true;}}cout<<"错误操作!"<<endl;return false;}bool FBSystem::ReturnPreDirectory(){for(this->m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator){//如果上一层目录是根目录if (m_CurPathFatherID == 0){memset(m_CurPath, NULL, 2560);strcpy(m_CurPath[0], "root\\");m_CurPathID = 0;m_CurPathFatherID = 0;return true;}if(m_ObjectIterator->objectID == m_CurPathFatherID && m_ObjectIterator->type == 0){for (int i=0; i<10;i++){if(m_CurPath[i][0]==0){strcpy(m_CurPath[i-2], m_ObjectIterator->name);strcat(m_CurPath[i-2],"\\");memset(m_CurPath[i-1],NULL, 256);m_CurPathID = m_CurPathFatherID;m_CurPathFatherID = m_ObjectIterator->fatherID;return true;}}}}return true;}void FBSystem::ShowAllFiles(){printf("\t 名称\t 大小\t 类型\t 时间\n");for(this->m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator){//遍历列表属于该目录的对象便显示其信息if(m_ObjectIterator->fatherID == m_CurPathID){cout<<"\t"<<setw(10)<<m_ObjectIterator->name;cout<<"\t"<<setw(8)<<m_ObjectIterator->size;if(m_ObjectIterator->type)cout<<"\t"<<setw(8)<<"文件";elsecout<<"\t"<<setw(8)<<"目录";char time[32];strcpy(time,m_ObjectIterator->lastTime);cout<<"\t"<<time<<endl;}}cout<<endl;}void FBSystem::ShowMenu(){cout<<"--------------------菜单----------------------------"<<endl;if(m_pow==0){cout<<"| 您的身份:游客|"<<endl;} if(m_pow==1){cout<<"| 您的身份:管理员|"<<endl;} if(m_pow==1){cout<<"| |"<<endl;cout<<"| 创建文件:mkfile [name] |"<<endl;cout<<"| 删除文件:mdfile [name] |"<<endl;cout<<"| 修改文件名字:rnfile [srcname] [descname] |"<<endl;}cout<<"| 读文件:read [name] |"<<endl;if(m_pow==1){cout<<"| 写文件:write [name] |"<<endl;cout<<"| 创建目录:mkdir [name] |"<<endl;cout<<"| 删除目录:mddir [name] |"<<endl;cout<<"| 修改目录名字:rndir [srcname] [descname] |"<<endl;cout<<"| 格式化:format |"<<endl;}cout<<"| 进入目录:cd [name] |"<<endl;cout<<"| 显示菜单:menu |"<<endl;cout<<"|显示所有文件信息:dir |"<<endl;cout<<"| 返回上一层目录:cd.. |"<<endl;cout<<"| 查询文件:query [name] |"<<endl;cout<<"| 首字母查询:fquery [header] |"<<endl;cout<<"| 退出(必做):exit |"<<endl;cout<<"| |"<<endl;cout<<"----------------------------------------------------"<<endl;}bool FBSystem::Inquiry(char* _name){printf("\t 名称\t 大小\t 类型\t 时间\n");for(this->m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator){if (!strcmp(m_ObjectIterator->name, _name) &&m_ObjectIterator->fatherID == m_CurPathID){cout<<"\t"<<setw(10)<<m_ObjectIterator->name;cout<<"\t"<<setw(8)<<m_ObjectIterator->size;if(m_ObjectIterator->type)cout<<"\t"<<setw(8)<<"文件";elsecout<<"\t"<<setw(8)<<"目录";char time[32];strcpy(time,m_ObjectIterator->lastTime);cout<<"\t"<<time<<endl;}}return true;}bool FBSystem::FuzzyInquiry(char _name){printf("\t 名称\t 大小\t 类型\t 时间\n");for(this->m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator){if (m_ObjectIterator->name[0]==_name&&m_ObjectIterator->fatherID == m_CurPathID){cout<<"\t"<<setw(10)<<m_ObjectIterator->name;cout<<"\t"<<setw(8)<<m_ObjectIterator->size;if(m_ObjectIterator->type)cout<<"\t"<<setw(8)<<"文件";elsecout<<"\t"<<setw(8)<<"目录";char time[32];strcpy(time,m_ObjectIterator->lastTime);cout<<"\t"<<time<<endl;}}return true;}int FBSystem::SeekCommand(char* _command){if(m_pow==0) //游客{for (int i=0; i<16; i++){if (!(strcmp(m_Command[i], _command))){switch(i){case 0:cout<<"对不起!您没有这个权限!"<<endl;break;case 1:cout<<"对不起!您没有这个权限!"<<endl;break;case 2:cout<<"对不起!您没有这个权限!"<<endl;break;case 3:return i;break;case 4:cout<<"对不起!您没有这个权限!"<<endl;break;case 5:cout<<"对不起!您没有这个权限!"<<endl;break;case 6:cout<<"对不起!您没有这个权限!"<<endl;break;case 7:cout<<"对不起!您没有这个权限!"<<endl;break;case 8:return i;break;case 9:cout<<"对不起!您没有这个权限!"<<endl;break;case 10:return i;break;case 11:return i;break;case 12:return i;break;case 13:return i;break;case 14:return i;break;case 15:return i;break;default:break;}}}}if(m_pow==1) //管理员{for (int i=0; i<16; i++){if (!(strcmp(m_Command[i], _command))){return i;}}}return -1;}int FBSystem::GetMaxID(){for(this->m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator){if(m_ObjectIterator->objectID>m_CurMaxID){ m_CurMaxID = m_ObjectIterator->objectID + 1;return m_CurMaxID;}}return m_CurMaxID+1;}void FBSystem::Exit(){m_NumOfObject = m_ObjectList.size();FBObject *buf = new FBObject[m_NumOfObject];int i =0;for(m_ObjectIterator = m_ObjectList.begin();m_ObjectIterator!= m_ObjectList.end();++m_ObjectIterator,i++){buf[i] = *m_ObjectIterator;}FILE *p = fopen("system", "w+");fwrite(&m_NumOfObject, 4,1, p);fseek(p, 4, SEEK_SET);fwrite(buf, sizeof(FBObject), m_NumOfObject, p);fclose(p);}char* FBSystem::GetTime(){//time_t now_time = time(NULL);//int year = now_time/time_t t = time(0);char tmp[64];strftime( tmp, sizeof(tmp), "%Y/%m/%d %X",localtime(&t));//puts( tmp );return tmp;}FBSystem.h#include <list>#include <ctime>#include <time.h>#include <stdio.h>#include <conio.h>#include <iostream>#include <iomanip>#include <string>using namespace std;struct FBObject{int fatherID; //父节点IDint objectID; //该对象IDchar name[1024]; //对象名称int size; //对象尺寸int type; //对象类型0为目录,1为文件char lastTime[256]; //对象最后修改时间};class FBSystem{public:FBSystem();~FBSystem(){}bool Login(char* _userName, char* _password); //用户认证void Initialize(); //初始化bool CreateDirectory(char* _dirName); //创建目录bool DeleteDirectory(char* _dirName); //删除目录bool RenameDirectory(char* _srcName, char* _descName); //修改目录名称bool OpenDirectory(char* _name); //进入目录bool CreateFile(char* _fileName); //创建文件bool DeleteFile(char* _fileName); //删除文件bool RenameFile(char* _srcName, char* _descName); //修改文件名称bool ReturnPreDirectory(); //返回上一层目录void Format(); //格式化bool Read(char* _name); //读文件bool Write(char* _name); //写文件bool Write2(char* _text);void ShowAllFiles(); //显示当前目录所有文件信息void ShowMenu(); //显示菜单bool Inquiry(char* _name); //查询bool FuzzyInquiry(char _name); //模糊查询void Exit();int SeekCommand(char* _command); //搜索是否存在刚刚输入的命令int GetMaxID(); //获得当前可用的最大IDchar* GetTime(); //获得时间public:char m_Command[16][32]; //存储所有命令char m_CommandTemp[32]; //刚刚输入的命令char m_CurPath[10][256]; //记录当前路径int m_CurPathFatherID; //当前所在的目录的父节点IDint m_CurPathID; //当前所在的目录自身IDint m_pow;protected:list<FBObject> m_ObjectList; //对象列表list<FBObject>::iterator m_ObjectIterator; //迭代器int m_NumOfObject;char m_UserName[256];char m_Password[256];char m_UserName1[256];char m_Password1[256];char m_UserName2[256];char m_Password2[256];char m_UserName3[256];char m_Password3[256];int m_CurMaxID; //当前所有对象的ID 最大值,用来创建对象IDint m_CurFaID;};。

相关文档
最新文档