多级文件目录的文件管理系统文件.doc
文件系统管理阶段的特征
文件系统管理阶段的特征1.引言1.1 概述文件系统是计算机操作系统中的一个重要组成部分,负责管理和组织计算机的文件和目录。
文件系统管理阶段可以理解为对文件系统的不同方面进行管理和操作的阶段。
文件系统管理涉及到物理存储管理、文件目录管理以及文件访问与权限管理等各个方面。
在物理存储管理阶段,主要考虑如何进行存储资源的分配和管理。
文件目录管理阶段则关注如何组织和管理文件和目录的结构。
文件访问与权限管理阶段旨在保护文件的安全性,确保只有授权用户可以进行访问和操作。
在物理存储管理方面,我们需要考虑存储的分配和空间的管理。
存储的分配方式可以分为连续分配、链接分配和索引分配。
连续分配方式将文件连续地存储在存储介质上,链接分配方式则通过链接的方式将文件的不同部分组合在一起,索引分配方式则使用索引表进行存储位置的管理。
另外,还需要考虑如何管理和分配存储空间,一种常见的方式是使用位图法和空闲链表法进行空间的管理。
文件目录管理方面主要关注文件和目录的组织和管理。
单级目录结构将所有的文件和目录都放置在一个层次上,多级目录结构则通过层次结构的方式进行组织,树状目录结构则使用树的方式进行管理,而图状目录结构则使用图的方式进行管理。
每种目录结构都有其优点和缺点,根据实际需求选择合适的目录结构。
文件访问与权限管理是保护文件和信息安全的关键环节。
用户身份验证可以确保只有合法的用户可以进行访问和操作,文件权限控制则可以控制各个用户对文件的访问权限。
这些机制可以帮助保护个人和敏感信息的安全性。
综上所述,文件系统管理阶段涉及到物理存储管理、文件目录管理以及文件访问与权限管理等多个方面。
不同的管理策略和技术可以满足不同的需求和场景,同时也面临着各种挑战和发展趋势。
在未来的研究中,我们可以进一步探索新的管理思路和技术,以提高文件系统的效率和安全性。
文章结构部分的内容如下:1.2 文章结构本文主要探讨文件系统管理阶段的特征。
文章分为以下几个部分:引言:介绍文件系统管理阶段的重要性和研究背景。
操作系统-文件管理
操作系统-⽂件管理⽂件管理由于系统的内存有限并且不能长期保存,故平时总是把它们以⽂件的形式存放在外存中,需要时再将它们调⼊内存。
如何⾼效的对⽂件进⾏管理是操作系统实现的⽬标。
⽂件是对磁盘的抽象,所谓⽂件是指⼀组带标识(标识即为⽂件名)的、在逻辑上有完整意义的信息项序列。
信息项:构成⽂件内容的基本单位(单个字节,或多个字节),各信息项之间具有顺序关系⽂件内容的意义:由⽂件建⽴者和使⽤者解释⽂件系统操作系统中统⼀管理信息资源的⼀种软件,管理⽂件的存储、检索、更新,提供安全可靠的共享和保护⼿段,并且⽅便⽤户使⽤。
⽂件系统管理的对象有:⽂件(作为⽂件管理的直接对象),⽬录(为了⽅便⽤户对⽂件的存取和检索,在⽂件系统中配置⽬录,每个⽬录项中,必须含有⽂件名及该⽂件所在的物理地址,对⽬录的组织和管理是⽅便和提⾼对⽂件存取速度的关键),磁盘(磁盘)存储空间(⽂件和⽬录必定占⽤存储空间,对这部分空间的有效管理,不仅能提⾼外存的利⽤率,⽽且能提⾼对⽂件的存取速度)。
统⼀管理磁盘空间,实施磁盘空间的分配和回收实现⽂件的按名存取(名字空间----映射--->磁盘空间)实现⽂件信息的共享,并提供⽂件的保护、保密⼿段向⽤户提供⼀个⽅便使⽤、易于维护的接⼝,并向⽤户提供有关统计信息提供⽂件系统的性能提供与I/O系统的统⼀接⼝⽂件分类按⽂件性质和⽤途分类(UNIX)普通⽂件、⽬录⽂件、特殊⽂件(设备⽂件)、管道⽂件、套接字普通⽂件:包含了⽤户的信息,⼀般为ASCII或⼆进制⽂件⽬录⽂件:管理⽂件系统的系统⽂件特殊⽂件:字符设备⽂件:和输⼊输出有关,⽤于模仿串⾏I/O设备,例如终端,打印机,⽹卡等块设备⽂件:磁盘⽂件逻辑结构从⽤户⾓度看⽂件,由⽤户的访问⽅式确定,是⽤户可以直接处理的数据及其结构,独⽴于⽂件的物理特性,⼜称为⽂件组织。
图4-2a中的⽂件是⼀种⽆结构的字节序列,操作系统事实上不知道也不关⼼⽂件内容是什么,操作系统所见到的就是字节,其任何含义只在⽤户程序中解释。
操作系统第6章 文件管理(文件目录与目录文件)
具有相似的结构,它由用户所有文件的文件控制块组成。此外,
在系统中再建立一个主文件目录MFD(Master File Directory); 在主文件目录中,每个用户目录文件都占有一个目录项,其目录 项中包括用户名和指向该用户目录文件的指针。如图2所示:
2015/11/7
15
一 文件目录管理
图2
2015/11/7
●缺点:查找速度慢;文件不能重名。不便于实现文件共享。
文件名 文件名 1 文件名 2 … 物理地址 文件说明 状态位
2015/11/7
表1 单级目录
14
一 文件目录管理
【七】二级目录
●为了克服单级目录所存在的缺点,可以为每一个用户建立一个单 独的用户文件目录UFD(User File Directory)。这些文件目录
二级目录结构示意图
16
一 文件目录管理
●两级目录结构基本上克服了单级目录的缺点,并具有以下优点:
1) 提高了检索目录的速度。如果在主目录中有n个子目录,采用两 级目录可使检索效率提高n/2倍。
2) 在不同的用户目录中,可以使用相同的文件名。
3) 不同用户还可使用不同的文件名来访问系统中的同一个共享文件。 但当多个用户之间要相互合作去完成一个大任务,且一用户又需 去访问其他用户的文件时,这种隔离便成为一个缺点,因为这种 隔离会使诸用户之间不便于共享文件。
2015/11/7 11
一 文件目录管理
●当文件被打开时,要将磁盘索引结点拷贝到内存的索引结点中,便于
以后使用。在内存索引结点中又增加了以下内容: 1. 索引结点编号,用于标识内存索引结点。 2. 状态,指示i结点是否上锁或被修改。 3. 访问计数,每当有一进程要访问此i结点时,将该访问计数加1, 访问完再减1。 4. 文件所属文件系统的逻辑设备号。 5. 链接指针。设置有分别指向空闲链表和散列队列的指针。
文件管理系统方案---原本
1.1.安全网络硬盘需求分析1、对个人文件集中存储保护需求随着各单位信息化程度提高,各部门存在大量的文档数据,为保证各个科室的数据的安全,防止数据丢失、损坏、泄密、感染病毒,可以对数据进行集中存储,备份,并进行加密,保密,实现数据的集中安全存储,真正做到有备无患。
信息的泄密造成了潜在威胁:2、数据信息的共享保护需求目前,大部分单位数据资源充分利用率不高,缺乏统一的整合利用,没有形成知识仓库,各部门的资源无法共享,一方面造成资源的浪费,另一方面有时会造成信息比较滞后、陈旧,而且由于电子邮件技术体系的问题,只能传送较小容量的数据,在日常工作中往往需要传送几十甚至上百兆的数据,只能通过硬盘、光盘、U盘等介质进行迁移,但涉及到物理介质的迁移必然导致不方便和不安全,同时部门之间大数据量信息的共享,以前主要通过网络邻居或者简单文件服务器进行共享,这种网络模式对数据存在较大的安全隐患,安全机制非常脆弱,且由于文件服务器受超级用户等机制影响,非常容易泄密,因此,解决这些问题的关键是要建立一个统一安全的信息交换平台和管理中心,进行资源共享。
安全网络硬盘系统提供了一种可控、安全、方便和快速的可控共享机制,用户A共享给用户B的数据只有用户B可以看到,管理员和其它用户均无法偷窥,采用共享方式、直接调用等机制实现大文件的调用和迁移,解决了设计稿件、多媒体等数据的共享和迁移,保证了数据的高可靠性,加强了数据的可用性。
3、个人文件的安全备份保护需求用户的日常工作文件数据比较多,目前大部分是存在终端本地硬盘或者文件服务器中,同时由于对终端数据没有备份,或者备份有限,比如以U盘或者移动硬盘备份,介质不安全、容易损坏、较易感染病毒或者泄密,而且是属于冷备份,备份不及时、麻烦,如果硬盘损坏或系统崩溃造成数据丢失,则造成不可估量的损失。
因此,可以根据单位或者个人情况不同,在安全网络硬盘系统上设置相应的空间以及设置不同的权限,在每个电脑上,安装自动备份引擎,设置相应的存储任务,备份引擎将会自动定时将相应目录下资料自动拷入安全网络硬盘系统,实现了数据的异地备份,保证数据的安全。
目录级别资料
目录级别
目录级别通常分为单级目录结构、两级目录结构、多级目录结构等。
单级目录结构最简单,整个文件系统中只建立一张目录表,每个文件一个目录项,但查找速度慢,不能重名,不便于共享。
两级目录结构则为每个用户建立一个单独的用户文件目录UFD,系统建立一个主文件目录MFD,但不利于文件共享。
多级目录结构也称为树形目录结构,多级目录允许文件和子目录在同一目录内共享相同的名字,从而解决了命名冲突的问题,提高了目录的灵活性。
此外,目录级别还涉及到目录路径的问题,包括绝对路径和相对路径。
绝对路径是从根目录开始的文件或目录的完整路径,而相对路径则是从当前目录开始的文件或目录的路径。
总的来说,目录级别是文件系统中非常重要的概念,它能够帮助用户快速定位文件,提高文件管理的效率。
在实际应用中,目录级别的设置需要根据具体的需求和场景进行选择和设计。
03-目录和文件管理
第三章目录和文件管理复习题1.在Linux命令行中按Ctrl+L组合键的作用是什么?2.获得Linux命令的在线帮助的方式有哪些?简述各自的特点和区别3.简述相对路径和绝对路径的区别4.在Linux命令行下执行“ls -ld”命令的作用是什么?5.执行什么命令可以分别统计/boot目录中所有文件、子目录各自占用的空间大小?6.在Linux命令行一次创建多级目录的命令是什么?7.依次执行什么命令可以为文件/bin/bzip2创建一个软链接文件/bin/wx/bzip2?8.执行什么命令可以把目录/boot/grub、文件/etc/apg.conf复制到当前目录下的public_html文件夹中?9.在Linux命令行中执行“echo $PATH”命令的作用是什么?10.执行什么命令可以在/etc目录下查找“超过1024KB”和“名称以.conf结尾”的文件?预习题1.在Linux操作系统中使用什么命令可以分页查看文件内容?2.“grep -v”命令的作用是什么?3.vi编辑器包含哪几种工作模式?一、本章结构1.查看和检索文件2.备份和恢复文档3.使用 vi 文本编辑器二、查看文件内容 cat 命令cat命令用途:显示出文件的内容cat [选项] 文件名…三、查看文件内容 more命令more命令用途:全屏方式分页显示文件内容more [选项] 文件名…交互操作方法按Enter键向下逐行滚动按空格键向下翻一屏按q键退出四、查看文件内容 less 命令less 命令用途:与 more 命令相同,但扩展功能更多less [选项] 文件名…交互操作方法Page Up 向上翻页,Page Down 向下翻页按“/”键查找内容,“n”下一个内容,“N”上一个内容其他功能与 more 命令基本类似五、查看文件内容 head、tail 命令head命令用途:查看文件开头的一部分内容(默认为10行)head -n 文件名…tail命令用途:查看文件结尾的少部分内容(默认为10行)tail -n 文件名…tail -f 文件名六、统计文件内容 wc 命令wc命令用途:统计文件中的单词数量(Word Count)等信息wc [选项]... 目标文件...常用命令选项-l:统计行数-w:统计单词个数-c:统计字节数七、检索和过滤文件内容 grep 命令grep命令用途:在文件中查找并显示包含指定字符串的行grep [选项]... 查找条件目标文件常用命令选项-i:查找时忽略大小写-v:反转查找,输出与查找条件不相符的行查找条件设置要查找的字符串以双引号括起来“^……”表示以……开头,“……$”表示以……结尾“^$”表示空行例题:很多的配置文档里面会有很多空行,还有很多以#开头注释行。
(完整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类实现功能为接受来自用户的命令,并解释、执行用户提出的文件访问操作。
操作系统第6章 文件管理(文件目录与目录文件)
2015/11/7
2
内容提纲
一 文件目录管理
二 文件共享与文件保护1/7
3
一 文件目录管理
一 文件目录管理
【一】目录管理的基本功能
1.实现“按名存取”,目录管理中最基本的功能之一是通过提供的 访问文件名,便客快速准确地找到指定外存上的文件存储位置。 2.快速检索文件目录。通过合理地组织目录结构的方法,可加快对 目录的检索速度,从而提高对文件的存取速度。这是在设计一个 大、中型文件系统时所追求的主要目标。 3.实现文件共享。在多用户系统中,通过保留在外存中的副本,供 不同用户使用,以节省大量的存储空间,提高文件利用率。 4. 文件重名。系统允许在不同级别的目录中,命名相同的文件名。
2015/11/7
17
一 文件目录管理
【八】多级目录
●对于大型文件系统,通常采用三级或三级以上的目录结构,以提高对目 录的检索速度和文件系统的性能。多级目录结构又称为树型目录结构, 主目录称为根目录,把数据文件称为树叶,其它的目录均作为树的结 点。图2中,方框代表目录文件,圆圈代表数据文件。在该树型目录结 构中,主(根)目录中有三个用户的总目录项A、B和C。在B项所指出的B 用户的总目录 B中,又包括三个分目录 F、E和D,其中每个分目录中又 包含多个文件。如B目录中的 F分目录中,包含 J和N两个文件。为了提 高文件系统的灵活性,应允许在一个目录文件中的目录项既是作为目 录文件的 FCB,又是数据文件的 FCB,这一信息可用目录项中的一位来 指示。例如,在图3中,用户 A的总目录中,目录项 A是目录文件的 FCB, 而目录项B和D则是数据文件的FCB。
2. 优点:易于理解实现和维护;
3. 问题:划分要考虑到如果分层太少,连接与访问简 单,但每层内容复杂;分层太多,形成的参数太 多,传递速度慢。 4. Madnick 把文件系统画分为8层,如下图1所示
文件管理之目录管理
文件管理之目录管理1 引言1.1 概述为什么引入文件目录?实现对文件的按名存取,就要求每个文件必须有一个文件名和文件对应;一般用户文件的文件名由用户指定,系统文件和特殊文件的文件名由系统指定。
为了准确迅速的由文件名检索到文件物理块,我们把文件名及其结构信息等按一定的组织结构排列,用来方便文件检索。
这里。
我们把文件名和对该文件实施控制管理的控制管理信息称为该文件的文件说明。
并把一个文件说明按一定的逻辑结构存放到物理存储块的一个表目中。
这样,就利用文件说明信息,可以对文件进行创建、检索、维护等管理。
我们把一个文件的文件说明信息称为文件的目录(文件说明有时也叫文件控制块)。
对文件目录的管理就是对文件说明信息的管理。
总之,现代计算机系统中,存储大量文件,为了对文件进行有效管理,引入了文件目录,通过文件目录对文件进行管理。
1.2 什么是文件目录?❖目录是由文件说明索引组成的用于文件检索的特殊文件。
❖文件目录的内容主要是文件访问的控制信息(不包括文件内容)。
❖它是一张记录所有文件名及其存放地址、文件的说明和控制信息的表格。
❖每个文件有一个文件的目录项。
文件目录也是一种数据结构,用于标识文件及其物理地址,对目录管理要求如下:实现“按名存取”、提高对目录的检索速度、文件共享、允许文件重名2 文件控制块和索引节点文件说明信息2.1 什么是文件控制块?1 文件控制块(FCB)是用于描述和控制文件的数据结构。
存放了文件的有关说明信息,是文件存在的标志。
2 FCB中的信息:➢基本信息类:文件名、文件长度、类型、属性文件物理位置➢存取控制信息类:文件存取权限、用户名、口令、共享计数➢使用信息类:文件的建立日期、最后修改日期、保存期限、最后访问日期,3 说明:文件与文件控制块一一对应,而人们把文件控制块的有序集合称为文件目录,即一个文件控制块就是一个文件目录项。
通常一个文件目录也被看作是一个文件,称为目录文件。
4 下面是MS-DOS的文件控制块:2.2 索引节点2.2.1 索引节点引入什么是索引节点为什么引入它?文件目录通常是存放在磁盘上的,当文件很多时,文件目录要占用大量的盘块。
多级文件目录实验报告
一、实验目的1. 理解文件目录的概念及其在文件系统中的作用。
2. 掌握多级文件目录的结构和实现方法。
3. 熟悉文件目录的创建、删除、查询等操作。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验原理文件目录是文件系统中用于组织和管理文件的目录结构。
多级文件目录是一种树形结构,其中每个节点代表一个目录,叶子节点代表一个文件。
目录节点包含其子目录和文件的列表,而文件节点则包含文件的相关信息,如文件名、大小、创建时间等。
在多级文件目录中,每个目录可以包含多个子目录和文件,目录与目录之间通过父子关系相互连接。
用户可以通过目录路径来访问文件,路径中的每个目录名通过“/”分隔。
四、实验步骤1. 创建多级文件目录```pythondef create_directory(path):directories = path.split('/')current_path = ''for directory in directories:if directory:current_path += '/' + directoryif not os.path.exists(current_path): os.makedirs(current_path)```2. 删除文件目录```pythondef delete_directory(path):directories = path.split('/')current_path = ''for directory in directories:if directory:current_path += '/' + directoryif os.path.exists(current_path):os.rmdir(current_path)```3. 查询文件目录```pythondef list_directory(path):directories = path.split('/')current_path = ''for directory in directories:if directory:current_path += '/' + directorytry:files = os.listdir(current_path)print(f"目录:{current_path}")for file in files:print(f"文件:{file}")except FileNotFoundError:print(f"目录:{current_path} 不存在")```4. 主函数```pythonif __name__ == '__main__':path = input("请输入文件目录路径:")option = input("请选择操作(创建c、删除d、查询l):") if option == 'c':create_directory(path)elif option == 'd':delete_directory(path)elif option == 'l':list_directory(path)else:print("无效的操作")```五、实验结果与分析1. 创建多级文件目录输入路径:/home/user/project 执行结果:```目录:/home目录:/home/user目录:/home/user/project```2. 删除文件目录输入路径:/home/user/project 执行结果:```目录:/home/user目录:/home```3. 查询文件目录输入路径:/home/user执行结果:```目录:/home/user文件:readme.txt文件:test.py```六、实验总结通过本次实验,我们学习了多级文件目录的概念、结构和实现方法。
多级文件目录的文件管理系统
山东理工大学计算机学院课程设计(操作系统)班级姓名学号指导教师二○一一年六月二十四日课程设计任务书及成绩评定课题名称基于多级文件目录的文件管理系统设计Ⅰ、题目的目的和要求:巩固和加深对操作系统(OS)原理的理解,初步掌握操作系统组成模块和应用接口的使用方法,提高进行工程设计和系统分析的能力;通过选做上面的课题,实现OS最基本模块的管理功能,重点放在数据结构设计、文档规范化和程序设计风格。
Ⅱ、设计进度及完成情况Ⅲ、主要参考文献及资料[1] 汤子赢等.计算机操作系统(第二版).西安电子科技大学出版社,2006.8[2] 冯耀霖等.操作系统,西安电子科技大学出版社.1992[3] 张尧学等.计算机操作系统教程(第2版).清华大学出版社,2001.4[4] 谭耀铭.操作系统.中国人民大学出版社,2003.4[5] 刘坤起. 操作系统学习辅导与习题详解[M]. 北京: 电子工业出版社, 2003:58-67[6]孙钟秀等编著,操作系统教程[M],高等教育出版社,2003:46-78 Ⅳ、成绩评定:设计成绩:(教师填写)指导老师:(签字)二○一一年六月二十四日目录第一章概述 (1)第二章系统分析 (2)第三章系统设计 (3)第四章程序设计流程图或N-S图 (6)第五章调试过程中的问题及系统测试情况 (7)第六章结束语 (9)附录 (10)第一章概述课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。
课程设计是让同学对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。
《计算机操作系统》一门重要的专业课,是开发操作系统和软件系统的理论和应用基础。
本课程设计要求设计一个基于多级文件目录的文件管理系统。
通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。
第二章系统分析1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多级文件目录的文件管理系统。
文件(含多级子目录)的打包和解包(下)
⽂件(含多级⼦⽬录)的打包和解包(下) 现在咱们说说解包,⼀个.dat⽂件,⾥⾯不知道包含了多少个⽂件/⽂件夹的信息,我们怎么解包呢?⼜怎么保证⽂件与⽂件之间、⽂件与其⼦⽂件之间的分级对应关系呢?下⾯我们来回顾⼀下打包的过程:把⽂件/⽂件夹的外部信息(⽂件名、⽂件名长度、⽂件的长度)/(⽂件夹名、⽂件夹名长度、⽂件的长度、⽂件的相对路径信息、⽂件类型)以结构体的形式存放在.dat⽂件中,内容也保存到.dat⽂件中 解包参数设置: bool UnPackFileAndDirectory(const string& inputzipfile, const string& outputpath) 其中第⼀个参数inputzipfile是要解包哪个⽂件(全路径),第⼆个参数outputpath是解包在哪⼀路径下(给定路径) 解包按照打包接⼝逻辑的话:⽂件、⽂件夹的顺序读取内容即可,当然啦,两边的结构体信息要定义相同,这样⼤家的协议就⼀样,解包便不会出现问题了。
解包流程:1.定位解包⽂件;2.解包⽂件部分(⽂件外部信息+⽂件内容),写⼊到指定路径下;3.解包⽂件夹部分(⽂件夹外部信息,没有内容哈,⽂件夹的内容为0),创建⽂件夹,并建⽴在指定路径下1bool UnPackFileAndDirectory(const string& inputzipfile, const string& outputpath)2 {3 FILE *rfp = NULL;4 rfp = fopen(inputzipfile.c_str(), "rb");5if (rfp == NULL)6 {7 cout << "解包:⽂件打开失败!" << endl;8return false;9 }1011//⽂件部分12int filecount;13 fread(&filecount, sizeof(filecount), 1, rfp);1415for (size_t i = 0; i < filecount; i++)16 {17struct FileInfo packFile;18 fread(&packFile, sizeof(packFile), 1, rfp);1920 cout << "filename:" << packFile.FileName << ", nameLen:" << packFile.fileNameLen << ", fileLen:" << packFile.fileSize << endl;21string path_file = outputpath + '\\' + packFile.FileName; //path_file:全路径2223 FILE *unpackFile = NULL;24 unpackFile = fopen(path_file.c_str(), "wb");25if (unpackFile == NULL)26 {27 cout << "⽂件:⽂件创建失败!" << endl;28 }2930 unsigned char*tmpBu = new unsigned char[packFile.fileSize];31 fread(tmpBu, packFile.fileSize, 1, rfp);//当然也可以不借助缓冲区32 fwrite(tmpBu, packFile.fileSize, 1, unpackFile);3334 }35 cout << endl;3637//⽂件夹部分38int folderCount;39 fread(&folderCount, sizeof(folderCount), 1, rfp);4041for (size_t i = 0; i < folderCount; i++)42 {43struct FolderInfo folder;44 fread(&folder, sizeof(folder), 1, rfp);4546//⽂件夹的基本信息47 cout << "FolderName:" << folder.FolderName << ", nameLen:" << folder.FolderNameLen << ", FolderSize:" << folder.FileSize << ", path:" << folder.Filepath << ", type:" << folder.type << endl; 4849string path_folder = outputpath + '\\' + folder.Filepath; //解包后全路径50const char * Lpath = path_folder.c_str();5152if (folder.type == 0 ) //⽂件类型53 {54 FILE * unpackFolders = NULL;55 unpackFolders = fopen(path_folder.c_str(), "wb");56if (unpackFolders == NULL)57 {58 cout << "⽂件夹:⼦⽂件创建失败!" << endl;59 }6061 unsigned char*readFolder = new unsigned char[folder.FileSize];62 fread(readFolder, folder.FileSize, 1, rfp);63 fwrite(readFolder, folder.FileSize, 1, unpackFolders);6465 }66if (folder.type == 1)//⽂件夹类型67 {68 ::CreateDirectory(Lpath, NULL); //创建⽂件夹69 }70 }7172return true;73 } 细⼼的⼩伙伴都发现了,我在⽂件解包和打包的过程中,都⽤到了临时的缓冲区:unsigned char*tmpBu = new unsigned char[fileSize];我为什么不直接从⼀个⽂件读再写⼊⽬标⽂件呢?主要是我之前就是那么⼲的,结果发现有的⽂件解包出来与原来的⽂件并不⼀致。
计算机操作系统中的文件系统与存储管理
计算机操作系统中的文件系统与存储管理在计算机操作系统中,文件系统和存储管理是两个重要的概念。
文件系统是操作系统中的一种模块,它负责管理计算机中的文件和目录,提供对文件的读写、创建、删除等操作。
存储管理则是操作系统中的另一个模块,它负责管理计算机的存储资源,包括内存和硬盘等。
一、文件系统文件系统是计算机操作系统中的一个核心模块,它定义了文件的组织方式、存储结构、文件的访问和操作方法等。
文件系统的设计目标是提供一个方便、高效、可靠的文件管理机制。
1.1 文件与目录文件系统中的最基本单位是文件,文件是计算机中存储数据的逻辑单位。
文件由一组相关的信息和数据组成,可以是文本文件、图像文件、音频文件等。
文件通过文件名来标识和访问。
文件系统中的文件一般以层次结构的方式进行组织,通过目录来管理文件。
目录是一种特殊的文件,它用于存储其他文件和目录的信息。
目录可以包含其他目录,形成多级目录结构,方便用户组织和管理文件。
1.2 文件的操作文件系统提供了一系列的操作来对文件进行读写和管理。
常见的文件操作包括打开文件、关闭文件、读取文件、写入文件、创建文件、删除文件等。
这些操作可以通过文件系统提供的接口或命令来实现。
文件系统还支持对文件的访问控制和权限管理。
通过权限机制,可以限制用户对文件的访问和操作。
例如,可以设置只读权限、读写权限、执行权限等,以保护文件的安全性。
二、存储管理存储管理是计算机操作系统中的一个重要模块,它负责管理计算机的存储资源,包括内存和硬盘等。
存储管理的目标是高效地管理存储资源,提供对存储资源的分配和回收。
2.1 内存管理内存管理是存储管理的一个重要方面,它负责管理计算机中的内存资源。
操作系统通过内存管理实现了对内存空间的分配、回收和保护等操作。
内存管理可以将物理内存划分为若干个逻辑块,每个逻辑块称为页或帧。
内存管理还包括地址转换功能,将逻辑地址转换为物理地址。
通过地址转换,操作系统实现了地址空间的分隔和保护,保障各个进程的独立性和安全性。
文件夹及文件操作
文件夹及文件操作在操作系统中,文件夹也被称为目录(directory),文件夹可以包含其他文件夹和文件。
通过文件夹的层次结构,用户可以创建多级的文件夹来组织文件,使其更易于管理和查找。
文件夹和文件操作可以分为以下几个方面:1. 创建文件夹:用户可以通过操作系统提供的界面或者命令来创建文件夹。
在Windows系统中,用户可以右键点击鼠标,在菜单中选择“新建文件夹”来创建一个新的文件夹。
在命令行中,用户可以使用mkdir命令来创建文件夹。
3. 复制和粘贴:用户可以复制文件夹和文件到其他位置,或者复制文件夹和文件中的内容到其他文件夹和文件中。
在Windows系统中,用户可以选择一个文件夹或者文件,按下Ctrl+C来复制,然后在要粘贴的位置按下Ctrl+V来粘贴。
4. 剪切和粘贴:用户可以剪切文件夹和文件到其他位置,或者剪切文件夹和文件中的内容到其他文件夹和文件中。
在Windows系统中,用户可以选择一个文件夹或者文件,按下Ctrl+X来剪切,然后在要粘贴的位置按下Ctrl+V来粘贴。
5. 重命名:用户可以修改文件夹和文件的名称。
在Windows系统中,用户可以选中一个文件夹或者文件,右键点击鼠标,在菜单中选择“重命名”来修改名称。
6. 删除:用户可以将文件夹和文件从计算机系统中删除。
在Windows系统中,用户可以选中一个文件夹或者文件,按下Delete键来删除。
7. 查找和排序:当用户有大量的文件时,可以使用操作系统提供的查找和排序功能来快速找到所需的文件。
在Windows系统中,用户可以使用功能来查找文件,可以按照名称、日期、大小等进行排序。
8. 文件属性:用户可以查看文件的属性,如大小、创建时间、修改时间等。
在Windows系统中,用户可以右键点击鼠标,在菜单中选择“属性”来查看文件的属性。
9.文件夹和文件权限:操作系统通常提供了对文件夹和文件的权限管理功能,用户可以设置文件夹和文件的访问权限,如只读、读写等。
多级分层的文件存储
多级分层的文件存储1.引言1.1 概述概述部分的内容如下:概述:在当今数字化时代,信息的爆炸式增长给文件存储带来了新的挑战。
传统的文件存储方式已经不能满足人们对数据存储和检索的需求。
因此,多级分层的文件存储成为了一种备受关注的方案。
多级分层的文件存储是一种将文件按照其重要性和访问频率分配到不同层级的存储系统。
通过将文件分层存储,可以实现对文件的高效管理和优化存储资源的利用。
相比于传统的平坦式存储结构,多级分层的文件存储可以根据文件的不同属性和需求,选择合适的存储介质,并采用不同的数据管理策略,以达到存储成本最小化和读写性能最大化的目标。
多级分层的文件存储的核心理念是将文件按照其特定的属性和需求进行分类和管理。
常见的属性包括文件的重要性、访问频率、保留时长等。
根据这些属性,可以将文件划分为不同的层级,比如高频访问层、低频访问层和归档层等。
高频访问层用于存储经常被访问的文件,采用高速存储介质,以提供更快的读写性能;低频访问层用于存储不经常被访问的文件,采用较低成本的存储介质;归档层用于存储保留时间较长、但访问频率较低的文件,采用更低成本和更大容量的存储介质。
多级分层的文件存储的优势是显而易见的。
首先,它可以根据文件的特性和需求,进行精细化的文件管理和存储。
这样可以提高存储资源的利用率,降低存储成本。
其次,通过将文件分层存储,可以实现文件的快速访问和响应。
高频访问的文件存放在高速存储介质中,保证了读写的高效性。
最后,多级分层的文件存储还具有较好的拓展性和灵活性。
可以根据实际需求,随时增加或调整存储层级和存储介质。
总之,多级分层的文件存储是一种有效的文件管理和存储方案。
它可以提高存储资源的利用效率,提升文件的访问性能,并具有良好的拓展性。
随着数字信息的不断增长,多级分层的文件存储必将成为未来存储领域的重要趋势。
在接下来的章节中,我们将深入探讨多级分层文件存储的实现技术以及其优势和未来发展趋势。
文章结构部分的内容应该包含对整篇文章的大致框架和主要内容进行介绍。
文件的目录及目录管理
|-------include
|-------lib
|-------local-------bin
|
|-----etc
Байду номын сангаас
|
`-----lib
|-------man
|-------src---------linux
`-------tmp
图5.5
2.工作目录、用户主目录与路径
用户在登录到Linux系统中之后,每时每刻都处在某个目录之中,此 目录被称作工作目录或当前目录。
全路径名即指从根目录开始的路径名,亦称为绝对路径名。 相对路径名就是从当前目录开始到文件的路径名。 树型目录结构具有检索效率高、允许重名、便于实现文件共享等优点,
已成为目前广泛流行的一种目录结构。如MS-DOS、OS/2、UNIX等系统, 都是采用树型目录结构。
返回
对文件目录的管理有以下要求: (1)实现“按名存取”。即用户只须提供文件名,即可对文件进行
录UFD(User File Directory)。系统允许每个用户有一个用户目
录UFD,它包含了所属该用户的所有文件的文件目录。整个系统
有一个主目录MFD,在主目录中,每个用户目录都占有一个目录
项,其目录项中包括用户目录名和指向该用户目录的指针。
一个文件是由用户目录名和文件名唯一标识的,访问任一个文件 都是首先在主目录中按用户目录名查找相应的用户目录,然后再 在相应的用户目录中按文件名查找该文件的物理地址,因此,不 同用户即使命名了同名文件,也不会发生冲突。
操作系统
文件的目录及目录管理
1、目录结构 2、目录管理 3、LINUX的目录结构特点
为了实现对文件的“按名存取”,系统必须为每个文件设置用于 描述和控制文件的数据结构,它至少包括文件名和存放文件的物理地 址。这个数据结构称为文件控制块FCB。文件控制块的有序集合称为文 件目录,即一个文件控制块FCB就是一个文件目录项。
文件目录管理
1.2 文件目录结构
4. 无环结构目录
无环结构目录是多级目录的推广。多级层次目录不直 接支持文件或目录的共享。为了使文件或目录可以被 不同的目录所共享,可以把多级目录的层次关系加以 推广,形成无环结构目录。
1.2 文件目录结构
5. 图状结构目录
图状结构目录是在无环结构目录的基础上形成的一 种目录,如图6-17所示。无环结构目录存在的 一个问题是要保证目录结构中没有环。如果有 环,就会形成图状结构。
操作系统
文件目录管理
1.1文件目录概念
文件控制块(FCB):文件控制块是操作系统为管 理文件而设置的数据结构,存放了为管理文件所需 的所有有关信息 文件控制块是文件存在的标志
FCB就是目录表中的一个目录项 文件控制块的内容:文件名,文件号,用户名,文 件地址,文件长度,文件类型,文件属性,共享计 数,文件的建立日期,保存期限,最后修改日期, 最后访问日期,口令,文件逻辑结构,文件物理结 构等。
1.2 文件目录结构
多级目录具有以下优点: (1) 既可方便来自户查找文件,又可以把不同类型和
不同用途的文件分类。 (2) 允许文件重名。不但不同用户可以使用相同名
称的文件,同一用户也可使用相同名称的文件。 (3) 利用多级层次结构关系,可以更方便地制定保
护文件的存取权限,有利于文件的保护。 多级层次目录的缺点主要是不能直接支持文件或目
1.1文件目录概念
文件目录:把所有的FCB组织在一起,就 构成了文件目录,即文件控制块的有序集合
目录项:构成文件目录的项目(目录项就 是FCB)
目录文件:为了实现对文件目录的管理, 通常将文件目录以文件的形式保存在外存, 这个文件就叫目录文件
1.2 文件目录结构
4.4 文件目录管理
根目录
root
Liu
Home
file1
根目录
Os.zip
Zhao
b
file2
a,c
my
vim
图4.17 无环结构目录
5.图状结构目录 5.图状结构目录
图状结构目录是在无环结构目录的基础上形成的一种目录 (如图4.18). 无环结构目录存在的一个问题是要保证目录结构中没有环. 如果有环,就会形成图状结构.在图状结构目录中通过 link文件实现文件共享.当Zhao目录要共享Home目录时, 只需在Zhao目录下创建一个link文件,该文件包含指向 Home目录的指针即可. 在图状结构中,实现目录的遍历和文件的删除等操作时, 可能会存在问题. 相对于无环结构目录,图状结构目录需要有一些额外的措 施来解决上述问题,比如采用"垃圾收集"机制来解决文 件的删除问题等.
根目录
file!
file2
……
file3
图4.14 单级目录
主要优点是实现简单,但是存在明显的缺 点:
不允许文件重名.单级目录下的文件,不允许和 另一个文件有相同的名字.但是对于多用户系统 来说,这又是很难避免的.即使是单用户环境, 当文件数量很大时,也很难弄清到底有哪些文件, 这就导致文件系统极难管理. 文件查找速度慢.当系统中文件数目较多时,由 于拥有大量的目录项,致使查找—个指定的目录 项可能花费较长的时间.
4.4.1 文件目录概念 为实现"按名存取",必须建立文件名与外存空 间中的物理地址的对应关系,体现这种对应关系 的数据结构称为文件目录. 把若干文件目录组织在一起,以文件的形式保存 在外存上,以备后用,这就形成了目录文件. 每一个文件在文件目录中登记一项,作为文件系 统建立和维护文件的清单. 每个文件的文件目录项又称文件控制块FCB(File Control Block),FCB一般应该包括以下内容:
目录和文件管理
1 linux命令分类内部命令:shell自带的命令。
外部命令:shell之外另安装的程序。
2 linux命令格式命令字【选项】【参数】命令字不可以省略,选项和参数有时候可以不加。
选项和参数有时候可以调换位置。
命令的技巧:tab键补全,\换行,ctrl+U删行前,ctrl+k删行后,ctrl+L清屏,ctrl+C终止3 linux命令帮助的方法①内部命令的帮助方法:help pwd②外部命令的帮助方法:ls --help③在线命令的帮助方法:man ls,在man中可以用/来查询,例如查询-v选项可以输入/-v4 目录和文件的基本操作-----pwdpwd,插看当前目录mkdir /abc 在跟下创建目录cd /abc 切换目录。
pwd 查看目录操作示范:ls,列表就像双击文件夹看到的结果。
-l长格式-a看隐藏,-h看大小,--color带颜色。
echo 123 > 1.txt 创建了一个123内容的文件1.txtls 查看到了1.txtls -l 查看长格式ls -a 查看隐藏文件(隐藏文件.和..稍后解释)操作示范:alias myls='ls -alh',定义别名让命令更加个性化,别名操作示范du -sh /boot,插看boot目录的总大小。
几M而已du -ah /boot,插看boot的大小。
几M而已,还有下面子目录中每个文件的具体大小5 创建目录mkdirls,看看自己建立的文件mkdir /aa/bb/cc,发现无法一次性建立多个目录mkdir -p /aa/bb/cc,发现可以一次性建立多个目录ls -R /aa,看到了多级目录。
6 创建文件touch /2.txtls /,查看是否创建了2.txt7 创建软链接目录,即快捷方式注意软连接能做文件和目录,硬链接只能做文件。
ln -s /2.txt /root/Desktop/ 把cc发送到桌面操作指导:直接输入上方命令,在桌面查看即可。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
山东理工大学计算机学院课程设计(操作系统)班级姓名学号指导教师二○一一年六月二十四日课程设计任务书及成绩评定课题名称基于多级文件目录的文件管理系统设计Ⅰ、题目的目的和要求:巩固和加深对操作系统(OS)原理的理解,初步掌握操作系统组成模块和应用接口的使用方法,提高进行工程设计和系统分析的能力;通过选做上面的课题,实现OS最基本模块的管理功能,重点放在数据结构设计、文档规范化和程序设计风格。
Ⅱ、设计进度及完成情况日期内容6.13-6.15 选取参考书,查阅有关文献资料,完成课程设计说明书内容 1 部分。
完成课程设计说明书内容2-4 部分6.16~6.20 创建相关数据结构, 录入源程序6.21~6.22 调试程序并记录调试中的问题,完成课程设计说明书第5 部分。
6.23 系统测试,演示设计成果,考核成绩。
整理课程设计说明书,上午11 时,由学习委员交课6.24 程设计说明书(计算机科学系9#213 或直接交给指导教师)Ⅲ、主要参考文献及资料[1] 汤子赢等. 计算机操作系统(第二版). 西安电子科技大学出版社,2006.8[2] 冯耀霖等. 操作系统,西安电子科技大学出版社.1992[3] 张尧学等. 计算机操作系统教程( 第2 版). 清华大学出版社,2001.4[4] 谭耀铭. 操作系统. 中国人民大学出版社,2003.4[5] 刘坤起. 操作系统学习辅导与习题详解[M]. 北京: 电子工业出版社, 2003:58-67[6] 孙钟秀等编著,操作系统教程[M],高等教育出版社,2003:46-78 Ⅳ、成绩评定:设计成绩:(教师填写)指导老师:(签字)二○一一年六月二十四日目 录第一章 概述 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ 1 第二章 系统分析 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ 2第三章 系统设计⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ 3第四章 程序设计流程图或 N-S 图⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯6第五章调试过程中的问题及系统测试情况⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯7第六章结束语⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ 9附录⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ 10第一章概述课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。
课程设计是让同学对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。
《计算机操作系统》一门重要的专业课,是开发操作系统和软件系统的理论和应用基础。
本课程设计要求设计一个基于多级文件目录的文件管理系统。
通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。
第二章系统分析1. 在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多级文件目录的文件管理系统。
2. 文件物理结构可采用显式链接或其他方法。
4. 文件目录结构采用多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为 1.2 。
5. 设计一个较实用的用户界面,方便用户使用。
要求提供以下相关文件操作:第三章系统设计1. 文件的操作(1)文件的创建:(2)文件的打开:(3)文件的读:read(4)文件的写:write(5)文件关闭:close2. 数据结构体1). 文件夹数据结构体:typedef struct MFD // 主文件目录{ char username[100];char password[100];FILE *fp; // 文件目录指针}MFD;2). 用户文件数据结构体:typedef struct UFD // 用户文件目录{ char filename[256];char protect; // 保护码int length; // 文件长度}UFD;3). 功能实现命令数据结构体:typedef struct COMM // 命令串{char string[256]; // 用户命令串struct COMM *next; // 后继指针: 指向命令各参数所在的结点}COMM;MFD mainfd[N]; // 主文件目录数组UFD userfd[M]; // 用户文件目录数组OFD openfd[L]; // 打开文件目录数组COMM *command; // 命令串指针int next;}DISK;3. 主要模块组成1). 头文件:#include <io.h>#include <conio.h> // 里面有clrscr() 清屏函数#include <stdio.h>#include <stdlib.h>#include <malloc.h> // 内存分配函数#include <string.h>#include <ctype.h>#define N 30 // 用户数#define M 20 // 一个用户可保存M个文件#define L 5 // 用户只能一次打开L 个文件2). 功能模块实现函数:void init(); // 初始化主文件目录数组void init_ufd(char *username); // 初始化用户文件目录void mesg(char *str); // 输出函数char *getuser(); // 设置用户函数声明char *getpass(); // 设置口令函数声明COMM *readcommand(); // 读命令串函数声明void login(); // 用户登录void setpass(); // 设置口令void create(); // 创建用户文件void mydelete(); // 删除void myread(); // 读void myopen(); // 打开void myclose(); // 关闭void mywrite(); // 写void help(); // 帮助第四章程序设计流程图或N-S 图开始输入用户NO判断是否存在YES创打读写删关创改列建开文文除闭建变出文文件件文文子子子件件件件目目目录录录NO是否退出YES结束图1 程序流程图第五章调试过程中的问题及系统测试情况1. 运行后主界面显示图2 主界面2. 输入login 命令用户登陆,当用户账号不存在时,即可创建:图3 创建用户3. 创建用户下文件功能实现:图4 创建用户4. 打开文件open 命令功能的实现图5 打开文件5. 读文件read 命令功能实现图6. 读文件6. 写文件write 命令功能实现,及对内容中添加实现图7 写文件8. 退出文件logout 操作图8 退出文件第六章结束语这次操作系统课程设计,在编写过程中,遇到很多难题,特别是在操作系统实验中不曾注意到的问题,也有许多新的问题,在实际反复调试运行中,不断加深了对操作系统的理解,也很大地程度上提高了编程的能力,由于对重要概念的把握程度还不够深入,在实际理解编写时遇到很多不该发生的问题。
不过,都很好的解决并牢牢地掌握住了。
通过做多级目录文件系统,我知道了多级目录文件系统的工作原理,在打开文件时系统是如何进行操作的,并加深了理解。
希望在以后的学习中,继续保持这份昂扬的斗志,继续努力学习计算机方面的知识,永不懈怠。
通过这次课程设计,不仅让我了解了多级目录文件系统,更重要的还让我学会了、或者说是验证了“做事一定要有次序和对事物的总体把握”这句话。
开始我一味的进行调试,急切的想侥幸调试出来,但由于没有进行深入的考虑,我调试了很久都没没有成功,我仔细的分析题目,分析材料,在原由的基础上我进行了改正,我最后还是调试成功了,虽然还是经过了一翻努力,当然汗水还是留的很值,这次操作系统实习,不仅让我对操作系统这门课程有了更深入的研究、对很多重要的概念有了巩固和掌握,还给了我今后做事的启示。
做事要塌实,不能想着一步登天,要有计划,有目的的进行做事。
盲目真的不应该再在我们新一代的大学生身上出现了,我们应该认真找到自己的缺点并且及时改正。
在这里,我如果不说感谢的话,不知道要说些什么好;首先感谢学校和父母,然后更重要的是感谢老师的教导。
“活到老,学到老”,这也是我整个学习过程中的一次经验、一次总结,我相信它肯定会给我今后的学习有所启示和指导作用。
附录:源程序代码:#include <io.h>#include <conio.h> //里面有clrscr()清屏函数#include <stdio.h>#include <stdlib.h>#include <malloc.h> //内存分配函数#include <string.h>#include <ctype.h>#define N 30 //用户数#define M 20 //一个用户可保存M 个文件#define L 5 //用户只能一次打开L 个文件typedef struct MFD //主文件目录{char username[100];char password[100];FILE *fp; //文件目录指针}MFD;typedef struct UFD //用户文件目录{char filename[256];char protect; //保护码int length; //文件长度}UFD;typedef struct OFD //打开文件目录{char filename[256];char opencode; //打开保护码int *fp; //读写指针}OFD;typedef struct COMM //命令串{char string[256]; //用户命令串struct COMM *next; //后继指针:指向命令各参数所在的结点}COMM;MFD mainfd[N]; //主文件目录数组UFD userfd[M]; //用户文件目录数组OFD openfd[L]; //打开文件目录数组COMM *command; //命令串指针char username[100];int usernum,savenum,opennum;int workfile;void init(); //初始化主文件目录数组void init_ufd(char *username); //初始化用户文件目录void mesg(char *str); //输出函数char *getuser(); //设置用户函数声明char *getpass(); //设置口令函数声明COMM *readcommand(); //读命令串函数声明void login(); //用户登录void setpass(); //设置口令void create(); //创建用户文件void mydelete(); //删除void myread(); //读void myopen(); //打开void myclose(); //关闭void mywrite(); //写void help(); //帮助void main(){init();printf("\n\t\t 计科0804 班0812103773 张超");printf("\n\t\t ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ");printf("\n\t\t 多级文件目录的文件管理系统");printf("\n\t\t ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ");printf("\n\t\t 选择命令:");printf("\n\t\t login setpass create ");printf("\n\t\t open read write delete");printf("\n\t\t help exit copy rename");printf("\n\t\t 首次使用请输入help 命令请求帮助");printf("\n\t\t 使用中欢迎以help [<command>]请求帮助");while(1){readcommand();if(strcmp(command->string,"create")==0)create();else if(strcmp(command->string,"delete")==0)mydelete();else if(strcmp(command->string,"open")==0)myopen();else if(strcmp(command->string,"close")==0)myclose();else if(strcmp(command->string,"read")==0)myread();else if(strcmp(command->string,"write")==0)mywrite();else if(strcmp(command->string,"login")==0)login();else if(strcmp(command->string,"setpass")==0)setpass();else if(strcmp(command->string,"help")==0)help();else if(strcmp(command->string,"exit")==0)break;elsemesg("Bad command!");}}void mesg(char *str){printf("\n %s\n",str);}void init() //初始化主文件目录数组{FILE *fp; //文件指针char tempname[20],temppass[20];usernum=0; //全局变量初始化savenum=0;opennum=0;strcpy(username,"");//用户使用时,建立一个mainfile.txt 文件,包括每个用户的用户名和口令//然后,才能运行此程序if((fp=fopen("mainfile.txt","r"))!=NULL)// 以读方式打开文件mainfile.txt{while(!feof(fp))// 若不是文件尾{strcpy(tempname,""); //清空数组操作fgets(tempname,20,fp); //读用户名if(strcmp(tempname,"")!=0){fgets(temppass,20,fp);tempname[strlen(tempname)-1]='\0'; //设置串结束符temppass[strlen(temppass)-1]='\0';strcpy(mainfd[usernum].username,tempname); //生成mainfd 数组strcpy(mainfd[usernum].password,temppass); //生成userfd数组usernum++; //生成usernum 的值}if(usernum>=N)break;}fclose(fp);}}void init_ufd(char *username) //初始化用户文件目录{FILE *fp;char tempfile[100],tempprot;int templength;savenum=0;opennum=0;workfile=-1;if((fp=fopen(username,"r+"))!=NULL){while(!feof(fp)){strcpy(tempfile,"");fgets(tempfile,50,fp);if(strcmp(tempfile,"")!=0){fscanf(fp,"%c",&tempprot);fscanf(fp,"%d",&templength);tempfile[strlen(tempfile)-1]='\0';strcpy(userfd[savenum].filename,tempfile); //文件名userfd[savenum].protect=tempprot; //保护码userfd[savenum].length=templength; //文件长度savenum++;fgets(tempfile,50,fp);}}}}char *getuser() //设置用户函数声明{char username[20];char temp;int i;username[0]='\0';for(i=0;i<20;){while(!kbhit()); //按用户名规则输入用户名temp=getch();if(isalnum(temp)||temp=='_'||temp==(char)13){username[i]=temp;if(username[i]==(char)13){username[i]='\0';break;}putchar(temp);i++;username[i]='\0';}}return username;}char *getpass() //设置口令函数声明{char password[20];char temp;int i;password[0]='\0';for(i=0;i<20;){while(!kbhit()); //等待按键temp=getch();if(isalnum(temp)||temp=='_'||temp==(char)13){password[i]=temp;if(password[i]==(char)13){password[i]='\0';break;}putchar('*');i++;password[i]='\0';}}returnpassword; }COMM *readcommand() //读命令串函数声明{char temp[256];char line[256]; unsignedint i,end;COMM *newp,*p;command=NULL;strcpy(line,"");while(strcmp(line,"")==0){printf("\nc:\\>");gets(line); //输入一个命令串}for(i=0;i<=strlen(line);i++){if(line[i]==' ')i++;end=0;while(line[i]!='\0'&&line[i]!=' '){temp[end]=line[i];end++;i++;}if(end>0) //对命令行中的子串进行处理{temp[end]='\0';newp=(COMM*)malloc(sizeof(COMM*));strcpy(newp->string,temp);newp->next=NULL;if(command==NULL)command=newp; //把各子串链成一个链表else{p=command;while(p->next!=NULL)p=p->next;p->next=newp;}}}p=command;return command;}void login() //用户注册{FILE *fp;int i;char password[20],confirm[20],tempname[20];if(command->next==NULL){printf("\n User Name:");strcpy(tempname,getuser()); //输入用户名并且返回之}else if(command->next->next!=NULL){mesg("Too many parameters!");return;}else strcpy(tempname,command->next->string);for(i=0;i<usernum;i++)if(strcmp(mainfd[i].username,tempname)==0)break; //从mainfd 表中查找要注册的用户if(i>=usernum) //新用户{printf("\n 新用户账号,输入你的密码两次!");printf("\n 密码:");strcpy(password,getpass()); //输入口令并且返回之printf("\n 密码:");strcpy(confirm,getpass()); //第二次输入口令if(strcmp(password,confirm)==0) //两次输入的口令是否相同的处理情况{if(usernum>=N) //用户数不能超过Nmesg("创建新账号错误!用户账号字符超过限制.\n 登陆失败!");else{strcpy(mainfd[usernum].username,tempname); //把新用户和口令填入mainfd 中strcpy(mainfd[usernum].password,password);usernum++;strcpy(username,tempname);mesg("创建新用户!\n 登陆成功恭喜!");init_ufd(username); //初始化用户文件目录fp=fopen("mainfile.txt","w+"); //把新用户填入mainfile.txt 文件中for(i=0;i<usernum;i++){fputs(mainfd[i].username,fp);fputs("\n",fp);fputs(mainfd[i].password,fp);fputs("\n",fp);}fclose(fp);}}else //两次输入的口令是否相同的处理情况{mesg("创建新用户失败!两次输入密码不一致!");mesg("登陆失败!");}}else //注册过的用户登陆{printf("\n 密码:");strcpy(password,getpass());if(strcmp(mainfd[i].password,password)!=0)mesg("登陆失败!输入密码错误!");else{mesg("登陆成功恭喜你!");strcpy(username,tempname);init_ufd(username);}}}void setpass() //重新设置口令{int i;FILE *fp;char oldpass[20],newpass[20],confirm[20];if(strcmp(username,"")==0)mesg("No user login!");else{printf("\n 旧密码:");strcpy(oldpass,getpass());for(i=0;i<usernum;i++)if(strcmp(mainfd[i].username,username)==0)break;if(strcmp(mainfd[i].password,oldpass)!=0)mesg("旧密码错误!");else{printf("\n 新密码:");strcpy(newpass,getpass());printf("\n 确认密码:");strcpy(confirm,getpass());if(strcmp(newpass,confirm)!=0)mesg("密码修改错误! 确认密码错误.请重新输入");else{strcpy(mainfd[i].password,newpass);mesg("Password changed!");fp=fopen("mainfile.txt","w+");for(i=0;i<usernum;i++) //写回到mainfile.txt{fputs(mainfd[i].username,fp);fputs("\n",fp);fputs(mainfd[i].password,fp);fputs("\n",fp);}fclose(fp);}}}}void create(){mesg("File open success!");}void myopen() //打开文件{int i;int type=0;char tempcode;char tempfile[100];if(strcmp(username,"")==0)mesg("No user login!");elseif(command->next==NULL)mesg("Too few parameters!");else //存在2 个或3 个参数的处理{strcpy(tempfile,"");tempcode='r';if(strcmp(command->next->string,"/r")==0){tempcode='r';type=1;}else if(strcmp(command->next->string,"/w")==0){tempcode='w';type=1;}else if(strcmp(command->next->string,"/d")==0){tempcode='d';type=1;}else if(command->next->string[0]=='/')mesg("Error! /r /w /d request!");else if(command->next->next!=NULL)mesg("Too many parameters!");elsestrcpy(tempfile,command->next->string);if(type==1) //三个参数的情况补充if(command->next->next!=NULL)if(command->next->next->next!=NULL)mesg("Too many parameters!");else strcpy(tempfile,command->next->next->string);else mesg("Too few parameters!");if(strcmp(tempfile,"")!=0){for(i=0;i<savenum;i++)if(strcmp(tempfile,userfd[i].filename)==0)break;if(i>=savenum)mesg("File not existed!");else //文件存在的情况{for(i=0;i<opennum;i++)if(strcmp(tempfile,openfd[i].filename)==0)break;if(i<opennum) //文件已经打开{mesg("File already opened!");if(openfd[i].opencode!=tempcode){openfd[i].opencode=tempcode;mesg("File permissionchanged!"); }}else if(opennum>=L) //打开的文件已经占满了 5 个名额mesg("Error! cannot open file! nimber of opened files limited!");else //打开处理{strcpy(openfd[opennum].filename,tempfile);openfd[opennum].opencode=tempcode;workfile=opennum;opennum++; mesg("Fileopen success!");}}}}}void myclose() //关闭文件{int i,j;char tempfile[100];if(strcmp(username,"")==0)mesg("No user login!");else{if(command->next==NULL)mesg("Too few parameters!");else if(command->next->next!=NULL)mesg("Too many parameters!");else{strcpy(tempfile,command->next->string);for(i=0;i<savenum;i++)if(strcmp(userfd[i].filename,tempfile)==0)break;if(i>=savenum) //文件不存在mesg("文件不存在!");else{for(j=0;j<opennum;j++)if(strcmp(openfd[j].filename,tempfile)==0)break;if(j>=opennum) //文件存在了但是没有打开mesg("文件存在了但是没有打开!");else //文件存在并且打开{strcpy(openfd[j].filename,"");openfd[j].opencode=' ';opennum--;mesg("文件关闭成功!");}}}}}void mydelete() //删除文件{int i,j;int tempsave; //用于确定被删除文件在数组userfd[M] 中的位置char tempfile[100];FILE *fp;if(strcmp(username,"")==0)mesg("没有用户登陆!");else{if(command->next==NULL)mesg("Too few parameters!");else if(command->next->next!=NULL)mesg("太多参数导致错误!");else{strcpy(tempfile,command->next->string);for(i=0;i<savenum;i++)if(strcmp(userfd[i].filename,tempfile)==0)break;tempsave=i;if(tempsave>=savenum) //文件不存在mesg("the file donot existed!");else{for(j=0;j<opennum;j++)if(strcmp(openfd[j].filename,tempfile)==0)break;if(j<opennum) //文件存在了但是打开{mesg("文件不能删除!");mesg("首先需要关闭它!");}else //文件存在并且没有打开{strcpy(userfd[tempsave].filename,"");userfd[tempsave].protect=' ';userfd[tempsave].length=0;savenum--;for(i=tempsave;i<=savenum;i++) //从新将数组userfd[M]排序{strcpy(userfd[i].filename,userfd[i+1].filename);userfd[i].protect=userfd[i+1].protect;userfd[i].length=userfd[i+1].protect;}mesg("File delete!");fp=fopen(username,"w+"); //写回到文件usernamefor(i=0;i<savenum;i++){fputs(userfd[i].filename,fp);fputs("\n",fp);fprintf(fp,"%c\n%d\n",userfd[i].protect,userfd[i].length);}fclose(fp);}}}}}void myread() //读操作{int i;int tempsave;char tempfile[100];if(strcmp(username,"")==0)mesg("没有用户登陆!");else if(command->next==NULL)mesg("参数太少导致错误!");else if(command->next->next!=NULL)mesg("参数太多导致错误!");else{strcpy(tempfile,command->next->string);for(i=0;i<savenum;i++)if(strcmp(tempfile,userfd[i].filename)==0)break;if(i>=savenum)mesg("文件不存在!");else{tempsave=i;for(i=0;i<opennum;i++)if(strcmp(tempfile,openfd[i].filename)==0)break;if(i>=opennum)mesg("文件没有打开!");else{if(userfd[tempsave].length<1000)printf("\n The file size is %d B",userfd[tempsave].length);elseif(userfd[tempsave].length=1000)printf("\n The file size is 1000 B");elseprintf("\n The file size is %d,%d KB",userfd[tempsave].length/1000,userfd[tempsave].length%1000);mesg("文件读取成功!");}}}}void mywrite() //写操作{int i;int tempsave;char tempfile[100];if(strcmp(username,"")==0)mesg("没有用户登陆!");else if(command->next==NULL)mesg("参数太少导致错误!");else if(command->next->next!=NULL)mesg("参数太多导致错误");else{strcpy(tempfile,command->next->string);for(i=0;i<savenum;i++)if(strcmp(tempfile,userfd[i].filename)==0)break;if(i>=savenum)mesg("文件不存在!");else{tempsave=i;for(i=0;i<opennum;i++)if(strcmp(tempfile,openfd[i].filename)==0)break;if(i>=opennum)mesg("文件没有打开!");else{if(userfd[tempsave].length<1000)printf("\n The file size is %d KB",userfd[tempsave].length);elseif(userfd[tempsave].length=1000)printf("\n The file size is 1000KB");elseprintf("\n The file size is %d,%d KB",userfd[tempsave].length/1000,userfd[tempsave].length%1000);mesg("文件写成功!");}}}}void help() //帮助说明{ system("CLS"); //清屏static char *cmd[]={"login","setpass","create","open","read","write","delete","help","exit","copy","rename"};static char *cmdhlp[]={" 命令格式:login [<username>]","命令格式:setpass","命令格式:create <filename>","命令格式:open [/r|/w|/d] <filename>","命令格式:read <filename>","命令格式:write <filename>","命令格式t:delete <filename>","命令格式:help [<command>]","命令格式:exit","命令格式:copy <source filename> <destination filename>","命令格式:rename <old filename> <new filename>"};static char *detail[]={" 解说:用户进入多用户多级目录文件系统.","解说:修改用户密码.","解说:用户退出多用户多级目录文件系统.","解说:创建新文件.","解说:/r--只读[deflaut] \n\t /w-- 读和修改\n\t /d--读、修改和删除.","解说:读文件.","解说:修改新文件.","解说:删除新文件.","解说:/u--列出用户账号\n\t /o--列出打开文件\n\t /f --列出用户文件[deflaut]","解说:<command>--列出命令详细格式和解说.\n\t [deflaut] 列出命令.","解说:退出文件系统","解说:复制一个文件到另一个文件","解说:修改文件名."};int helpnum=13;int i;if(command->next==NULL){mesg(cmdhlp[9]);mesg(detail[9]);printf("\t 输入用户名是旧用户就直接登陆,否则就创建新用户");mesg("步骤2:打开(open命令)文件再读(read命令),写(write 命令),删除(delete命令)");printf(" 你可以打开一个或多个文件,一个命令能打开一个文件");mesg("步骤3:读(read命令),写(write 命令)或删除(delete命令)一些文件");printf(" 你可以操作打开文件中的一个,一个命令能操作一个文件");mesg("步骤4:关闭(close命令)打开文件");printf(" 你能关闭(close命令)一个打开的文件,一个命令能打开一个文件");mesg("步骤5:用户退出关闭所有用户打开的文件");printf(" \n 可输入的命令清单:");for(i=0;i<helpnum;i++){if(i%4==0)printf("\n");printf("%-10s",cmd[i]); }}else if(command->next->next!=NULL)mesg("参数太多");else{for(i=0;i<helpnum;i++)if(strcmp(command->next->string,cmd[i])==0)break;if(i>=helpnum)mesg("这命令不存在!");else{mesg(cmdhlp[i]);mesg(detail[i]);}}}。