多级文件目录的文件管理系统文件.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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 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]);}}}。