蔡求童 文件管理打印

更新时间:2023-12-04 01:21:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

操作系统课程设计 学 院 数学与计算机学院 学科门类 工学 专 业 软件工程 学 号 2012436058 姓 名 蔡求童 指导教师 张明

2014年 7 月 14日

学年论文(课程设计) 题目:

河北大学学年论文(课程设计)任务书

(指导教师用表)

学 生 姓 名 论文(设计)题目 蔡求童 指 导 教 师 基于显示链接的文件管理系统 张明 主要研究 在采用显示链接法的基础上实现单用户的磁盘文件管理部分,包括:文件的逻(设计)内容 辑结构、文件的物理结构、目录结构、磁盘分配回收、文件的保护和用户接口。 装 订 线

研究方法 根据操作系统理论课上学习的操作系统中关于文件管理实现方法,在显示链接的基础上模拟实现操作系统的文件管理功能和用户接口。 主要任务 及目标 主要任务:在采用显示链接法的基础上实现单用户的磁盘文件管理部分和用户接口。 目标:通过模拟操作系统原理的实现,加深对操作系统工作原理和操作系统实现方法的理解;通过模拟操作系统原理的实现练习编程。 [1]操作系统习题解答与实验指导. 王煜,张明,刘振鹏. 中国铁道出版社. 2010 主要参 考文献 [2]操作系统实验指导. 任爱华. 清华大学出版社. 2004 [3]操作系统实验教程(Windows版). 姚卫华. 清华大学出版社. 2005 论文(设计)各阶段名称 布置任务 进度安排 整体设计 编写程序 撰写论文 日期 第13周-第15周 第16周 第16周-第17周 第18周 指导教师签字:

装 订 线

系主任签字: 主管教学院长签字:

河北大学学年论文(课程设计)成绩评定表

学院:数学与计算机学院 学生姓名 蔡求童 专业 年级 软件工程 2012级 论文(设计)题目 基于显示链接的文件管理系统 本论文主要阐述四部分内容,引言部分,主要说明本次操作系统课程设计的性质、设计目的、任务和要求以及意义;系统分析与设计部分,主要阐述系统的主要功能模块以及每个模块计划采用的实现方法和原理;系统实现部分,主要通过程序截图等工具描述主要模块的实现流程;结束语部分,主要书写已经实现的本系统存在的不足、改进方案和在课程设计中的实际感受。 论此次课程设计的主要内容是在采用显示链接法的基础上实现单用户的磁盘文文(件管理部分,包括:文件的逻辑结构、文件的物理结构、目录结构、磁盘分配回收、设文件的保护和用户接口。 计)磁盘是断电后内容不丢失的,因此用文件模拟磁盘。文件的逻辑结构采用流式内结构;文件的内容:文件的内容均采用文本文件。磁盘的分配采用链接结构(显式容提链接)的分配方式。用户接口提供用户命令接口,要求文件名中既可以支持相对路要径的文件名,也可支持绝对路径的路径名。 指 导 教师 评 语

成绩: 指导教师(签名): 年 月 日 摘 要

本论文主要阐述四部分内容,引言部分,主要说明本次操作系统课程设计的性质、设

计目的、任务和要求以及意义;系统分析与设计部分,主要阐述系统的主要功能模块以及每个模块计划采用的实现方法和原理;系统实现部分,主要通过程序截图等工具描述主要模块的实现流程;结束语部分,主要书写已经实现的本系统存在的不足、改进方案和在课程设计中的实际感受。

此次课程设计的主要内容是在采用显示链接法的基础上实现单用户的磁盘文件管理部分,包括:文件的逻辑结构、文件的物理结构、目录结构、磁盘分配回收、文件的保护和用户接口。

磁盘是断电后内容不丢失的,因此用文件模拟磁盘。文件的逻辑结构采用流式结构;文件的内容:文件的内容均采用文本文件。磁盘的分配采用链接结构(显式链接)的分配方式。用户接口提供用户命令接口,要求文件名中既可以支持相对路径的文件名,也可支持绝对路径的路径名。

关键词:文件管理 显示链接 磁盘 目录

ABSTRACT

This thesis mainly discusses four parts, the introduction, mainly explains the operating system of curriculum design, design objective, the nature of the tasks and requirements and significance; analysis and system design, principle and method of realization of the main

function module mainly expounds the system and each module program is adopted; the part of system implementation, mainly through the procedure and screenshots tool to describe the implementation procedure of main modules; the ending part, there are mainly writing has realized the shortcomings of the system, improvement scheme and practical experience in curriculum design.

The main contents of this curriculum design is to realize the disk file management part, single user based on the display URL method includes: protection and user interface logic structure, physical structure, file directory structure, disk allocation, file recovery.

The disk is the content after the power is not lost, so the simulated disk file. There are two hard disk requirements of simulation system. The logical structure of documents by flow type structure; the contents of the file: file contents using text file. Disk allocation using link

structure (explicit link) distribution. The user interface provides the user command interface, requires the file name can support relative file path name, can also support the absolute path name.

Keywords: File Management hows Disk Directory

目 录

一 引言 ................................................................................................ 1

1.1性质 ................................................................................................... 1 1.2设计目的 ........................................................................................... 1 1.3任务和要求 ....................................................................................... 1 1.4意义 ................................................................................................... 1 1.5 论文结构安排 .................................................................................. 1

二 系统分析与设计 .......................................................................... 2

2.1系统要求 ........................................................................................... 2 2.2 实现方法和原理 .............................................................................. 2

三 系统实现 ....................................................................................... 5

3.1程序代码 ........................................................................................... 5 3.2程序截图 ......................................................................................... 27

四 结束语 ......................................................................................... 29 参考文献 .............................................................................................. 30

一 引言

1.1 性质

操作系统是计算机科学与技术专业的主要专业基础课和主干课。操作系统对计算机系统资源实施管理,是所有其他软件与计算机硬件的唯一接口,所有用户在使用计算机时都要得到操作系统提供的服务。

1.2 设计目的

通过模拟操作系统原理的实现,加深对操作系统工作原理和操作系统实现方法的理解。

通过模拟操作系统原理的实现练习编程。

1.3 任务和要求

模拟采用多道程序设计方法的单用户操作系统,本系统要求实现文件管理和用户接口,存储管理,设备管理,进程管理。

1.4 意义

通过模拟操作系统原理的实现,加深对操作系统工作原理和操作系统实现方法的理解,掌握了初步分析实际问题的能力,为其今后在相关领域开展工作打下坚实的基础。同时使学生系统科学地受到分析问题和解决问题的训练,提高运用理论知识解决实际问题的能力。

1.5 论文结构安排

本论文主要阐述四部分内容,引言部分,主要说明本次操作系统课程设计的性质、设计目的、任务和要求以及意义;系统分析与设计部分,主要阐述系统的主要功能模块以及每个模块计划采用的实现方法和原理;系统实现部分,主要通过流程图等工具描述主要模块的实现流程;程序截图部分,主要是程序的截图;结束语部分,主要书写已经实现的本系统存在的不足、改进方案和在课程设计中的实际感受。

二 系统分析与设计

2.1 系统要求

本系统要求实现文件管理和用户接口。

2.2 实现方法和原理

此次课程设计中文件系统采用显式链接文件结构、FAT表。

磁盘模拟:磁盘是断电后内容不丢失的,因此用文件模拟磁盘。要求模拟系统存在两块硬盘:用一个文件disk1模拟磁盘c,用一个文件disk2模拟磁盘d,磁盘的每个盘块64字节,模拟磁盘共有128块。第0、1块存放文件分配表,第2块存放根目录,其余存放子目录和文件。

文件的逻辑结构:文件的逻辑结构采用流式结构;文件的内容:文件的内容均采用文本文件。

系统中有两种文件:一种是存放任意字符的文件;一种是可执行文件:可执行文件的内容就是系统内进程的程序体。文件中要有一种特定命令的“可执行”文件,文件中的命令非常简单,仅仅包括以下几种指令:

i=?:给i赋值一位数 i++:i加1 i--:i减1

!??;第一个?为A,B,C中某个设备,第二个?为一位数,表示使用设备的时间(由于没有实际设备,所以无法知道设备何时工作完成,所以假定一个数,这个数随着系统时间增加而递减,减到0时,认为是设备工作完成);

end.表示文件结束,同时将结果写入文件out,其中包括文件路径名和i的值。 目录结构:目录结构采用树型目录结构。目录项内容(8个字节):目录名、文件名:3个字节;扩展名:1个字节(可执行文件扩展名为e,目录没有扩展名);目录、文件属性:1字节;起始盘块号:1个字节;文件长度:2字节(目录没有长度)。

根目录:根目录位置固定,为磁盘第2块,大小固定,共8项,占用模拟磁盘第2块; 子目录:位置不固定,大小不固定(至少建立一级子目录,最好支持多级子目录)。

磁盘分配:磁盘的分配采用链接结构(显式链接)的分配方式。系统采用文件分配表

方式记录磁盘空间的使用情况和链接结构的指针。因为磁盘有占用磁盘有128块,所以文件分配表中一项需要1字节,因而需要128项,所以模拟磁盘空间中的第0、1块被用来存放文件分配表。

用户接口:用户接口提供用户命令接口,要求文件名中既可以支持相对路径的文件名,也可支持绝对路径的路径名。要求实现以下命令:

创建文件:create 文件名

建立新文件,如果原来存在同名文件要提示是否覆盖。 拷贝文件:copy 源文件名 目标文件名 拷贝文件可同名拷贝,也可更名拷贝 删除文件:delete文件名

移动文件:move 源文件名 目标文件名

注意:磁盘内和磁盘间文件移动的不同,磁盘内的移动实际只是目录的改变,并不需要真的移动文件;磁盘间的文件移动实际上是先拷贝文件到目标磁盘,然后再删除源文件。

显示文件:type 文件名 仅仅是显示文件内容。 编辑文件:edit 文件名

要求此命令完成对文件的编辑,注意只读文件不可以修改。 改变文件属性:change 文件名 属性

将文件在只读和非只读、隐藏和非隐藏之间转换。 磁盘格式化命令 format 盘符 建立目录:makdir 目录

建立目录,若同名目录存在则建立失败。 改变目录路径:chadir目录 改变当前目录。 删除空目录:rdir 目录

当前目录、非空目录、根目录不能删除。 删除目录:deldir 目录

既可删除空目录又可删除非空目录,对于非空目录,首先要删除其下文件和目录然后才能删除其本身。

运行可执行文件:可执行文件的文件名(可创建创建进程)。

上述命令在实际系统中都是需要建立进程才可以实现的,这里由于模拟系统的能力达不到,所以除运行可执行文件需要建立进程外,其他指令执行不必在模拟系统中建立进程。注意打开文件表。

屏幕显示要求包括:用户命令接口,用于系统运行时用户输入命令;磁盘目录显示,要求显示磁盘的树型目录结构;磁盘使用情况,显示磁盘每一个磁盘块的空间是否空闲。

三 系统实现

3.1 程序代码(C#语言)

public class FCB //目录结构(文件控制块) {

byte [] name=new byte[3]; //文件名或目录名

byte type; //文件类型(扩展名) 0代表exe文件,1代表txt文件, byte attribute; //文件属性

byte address; //文件起始盘块号 char length; //文件长度

#region 构造函数 public FCB() { }

public FCB(byte[]nam,byte typ,byte att,byte add,char len) {

name = nam; type = typ; attribute = att; address = add; length = len; }

#endregion

#region 属性

public byte[] Name {

get { return name; } set { name = value; } }

public char Length {

get { return length; } set {length=value;} }

public byte Type {

get { return type; } set { type = value; } }

public byte Attribute {

get { return attribute; } set { attribute = value; } }

public byte Address {

get { return address;} set { address = value; } }

#endregion }

#endregion

public class FileFunction {

#region FindNullItem(判断是否为空目录项) public int FindNullItem(int dnum,string harddisk) {

FileStream Disk = new FileStream(harddisk, FileMode.Open); int n = 0; int flag=0;

for (int i = 0; i < 8; i++) {

Disk.Seek(64 * (dnum - 1) + 4 + n, SeekOrigin.Begin); //读fcb中的attribute if (Disk.ReadByte() == 0) {

flag = i+1; break; }

n = n + 8; }

Disk.Close(); return flag; }

#endregion

#region FindFAT(查找FAT)

public int FindFAT(string harddisk) {

FileStream Disk = new FileStream( harddisk, FileMode.Open); byte[] FAT = new byte[128]; Disk.Seek(0, SeekOrigin.Begin); Disk.Read(FAT, 0, FAT.Length); int disknum=0;

for (int i = 3; i < 128; i++) {

if (FAT[i] == 0) {

disknum = i+1; break; } }

Disk.Close(); return disknum; }

#endregion

#region WriteFile(向磁盘写入FCB)

public void WriteFile(int disknumber, int Itemnumber, FCB buffer, string harddisk) {

FileStream Disk = new FileStream(harddisk, FileMode.Open); if(disknumber >0&&Itemnumber>0) {

Disk.Seek(64 * (disknumber - 1) + 8 * (Itemnumber - 1), SeekOrigin.Begin); Disk.Write(buffer.Name, 0, buffer.Name.Length); Disk.Seek(0, SeekOrigin.Current); Disk.WriteByte(buffer.Type);

Disk.Seek(0, SeekOrigin.Current); Disk.WriteByte(buffer.Attribute); Disk.Seek(0, SeekOrigin.Current); Disk.WriteByte(buffer.Address); Disk.Seek(0, SeekOrigin.Current);

Disk.WriteByte(Convert.ToByte(buffer.Length)); }

Disk.Close(); }

#endregion

#region CreateFCB(创建FCB)

public FCB CreateFCB(byte[] name,byte type,byte attribute,byte address,char length) {

FCB buffer = new FCB(); buffer.Name=name; buffer.Type = type;

buffer.Attribute = attribute; buffer.Address = address; buffer.Length = length; return buffer; }

#endregion

#region SearchMenu(查找目录路径)

public int SearchMenu(string pathname,string harddisk) {

FileStream Disk = new FileStream(harddisk, FileMode.Open);

string[] pnames = pathname.Split(new char[] { '\\\\', '.' }); //分割路径 char[] chardata = new char[3]; byte[] bydata = new byte[3]; int attribute; int address; int n, flag;

int disknum = 3;

Decoder d = Encoding.UTF8.GetDecoder();

int i = 1;

while (i <= pnames.Length - 1) {

n = 0;

for (int j = 0; j < 8; j++) {

Disk.Seek(64 * (disknum - 1) + n, SeekOrigin.Begin); Disk.Read(bydata, 0, 3);

Disk.Seek(1, SeekOrigin.Current); attribute = Disk.ReadByte(); address = Disk.ReadByte();

d.GetChars(bydata, 0, bydata.Length, chardata, 0); flag = 0;

for (int k = 0; k < chardata.Length; k++) {

if (!chardata[k].Equals(pnames[i].ToCharArray()[k]))

{

break; }

flag = k+1; }

if (flag == chardata.Length && attribute == 8) {

disknum = address; goto found; }

n = n + 8; }

Disk.Close();

return 0; //未找到 found: i++; }

Disk.Close();

return disknum; //找到,返回最后一级目录的盘块号 }

#endregion

#region SearchFile(查找文件)

public int SearchFile(string pathname, int disknum, string harddisk) {

FileStream Disk = new FileStream(harddisk, FileMode.Open);

string[] pnames = pathname.Split(new char[] { '\\\\', '.' }); //分割路径

string halfpathname = pathname.Remove(pathname.Length - 6); //去掉文件名和扩展名

char[] chardata = new char[3]; byte[] bydata = new byte[3]; int attribute; int address;

Decoder d = Encoding.UTF8.GetDecoder(); int n = 0; int flag;

char typew, typer;

for (int i = 0; i < 8; i++) {

Disk.Seek(64 * (disknum - 1) + n, SeekOrigin.Begin); Disk.Read(bydata, 0, 3);

Disk.Seek(1, SeekOrigin.Current);

attribute = Disk.ReadByte(); address = Disk.ReadByte();

d.GetChars(bydata, 0, bydata.Length, chardata, 0); typew = Convert.ToChar(pnames[pnames.Length - 1]);

switch (attribute) {

case 2: case 3:

typer = 'e'; break; case 4: case 5:

typer = 't'; break; default:

goto tag; //文件既不是exe也不是txt }

flag = 0;

for (int k = 0; k < chardata.Length; k++) {

if (!chardata[k].Equals(pnames[pnames.Length - 2].ToCharArray()[k])) {

break; }

flag = k+1; }

if (flag == chardata.Length && typer == typew) {

Disk.Close();

return 2; //文件已经存在 } tag:

n = n + 8; }

Disk.Close();

return disknum; //返回上一级目录的盘块号 }

#endregion

#region Search

public int Search(string pathname, string harddisk)

{

string[] pnames = pathname.Split(new char[] { '\\\\', '.' }); //分割路径 int searchresult; int result; int disknum;

if (pnames[pnames.Length - 1].Length != 1) //查找目录 {

string halfpathname = pathname.Remove(pathname.Length - 4); if (halfpathname.Length != 2) {

searchresult = SearchMenu(halfpathname,harddisk);

if (searchresult == 0) //最后一级目录路径之前的路径不存在 {

return 1; //最后一级目录之前的路径不存在 } else {

result = SearchMenu(pathname,harddisk); return result; //0表示目录不存在,返回一个disknum表示目录存在且返回最后一级目录的盘块号 } } else {

searchresult = SearchMenu(pathname,harddisk); return searchresult; } }

else //查找文件 {

string halfpathname = pathname.Remove(pathname.Length - 6); //去掉文件名和扩展名

if (halfpathname.Length != 2) {

searchresult = SearchMenu(halfpathname,harddisk); if (searchresult == 0) //文件路径不存在 {

return 1; //文件之前的路径不存在 } else {

disknum = searchresult;

result = SearchFile(pathname, disknum,harddisk);

return result; //返回2表示文件存在,返回一个disknum(上一级目录的盘块号)表示文件不存在 } } else {

disknum = 3;

result = SearchFile(pathname, disknum,harddisk); return result; } } }

#endregion

#region CreateFile(建立文件)

public void CreateFile(string pathname, byte attribute, byte address, char length, string harddisk) {

if (attribute == 3 || attribute == 5) {

MessageBox.Show(\只读性质,建立失败!\\注意\MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; }

int searchresult = Search(pathname,harddisk);

if (searchresult==1) {

MessageBox.Show(\文件路径不存在!\注意\ return; }

else if (searchresult == 2) {

MessageBox.Show(\文件存在!\\注意\MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; }

else //写FCB {

string[] pnames = pathname.Split(new char[] { '\\\\', '.' }); //分割路径

string halfpathname = pathname.Remove(pathname.Length - 6); //去掉文件名和扩展名

UTF8Encoding utf = new UTF8Encoding();

char chtype = Convert.ToChar(pnames[pnames.Length - 1]); //扩展名转换为char byte bytype = Convert.ToByte(chtype); //char再转换成byte

if (FindNullItem(searchresult,harddisk) == 0) //没有空目录项 {

MessageBox.Show(\目录已满!\ return; }

WriteFile(searchresult, FindNullItem(searchresult,harddisk), CreateFCB(utf.GetBytes(pnames[pnames.Length - 2]), bytype, attribute, address, length),harddisk); } }

#endregion

#region RecordMenuFAT(记录目录的FAT表项)

public void RecordMenuFAT(int disknum, string harddisk) {

FileStream Disk = new FileStream(harddisk, FileMode.Open); Disk.Seek(disknum - 1, SeekOrigin.Begin); Disk.WriteByte(254); Disk.Close(); }

#endregion

#region CreateMenu(建立目录)

public void CreateMenu(string pathname,string harddisk) {

int searchresult = Search(pathname,harddisk);

if (searchresult == 1) {

MessageBox.Show(\文件路径不存在!\注意\ return; }

else if (searchresult == 0) {

string[] pnames = pathname.Split(new char[] { '\\\\' }); //分割路径

string halfpathname = pathname.Remove(pathname.Length - 4); //去掉最后一个目录名

UTF8Encoding utf = new UTF8Encoding();

int disknum = FindFAT(harddisk);

byte disknumber = Convert.ToByte(disknum); if (halfpathname.Length != 2) {

if (FindNullItem(Search(halfpathname,harddisk),harddisk) == 0) //没有空目录项

{

MessageBox.Show(\目录已满!\ return; }

WriteFile(Search(halfpathname,harddisk),

FindNullItem(Search(halfpathname,harddisk),harddisk), CreateFCB(utf.GetBytes(pnames[pnames.Length - 1]), 0, 8, disknumber, Convert.ToChar(0)),harddisk);

RecordMenuFAT(disknum,harddisk); } else {

if (FindNullItem(3,harddisk) == 0) //没有空目录项 {

MessageBox.Show(\目录已满!\ return; }

WriteFile(3, FindNullItem(3,harddisk), CreateFCB(utf.GetBytes(pnames[pnames.Length - 1]), 0, 8, disknumber, Convert.ToChar(0)),harddisk); RecordMenuFAT(disknum,harddisk); } } else {

MessageBox.Show(\文件存在!\\注意\MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } }

#endregion

#region FindItem(找文件的目录项)

public int[] FindItem(int disknum, byte[] name, char attribute, string harddisk) {

FileStream Disk = new FileStream(harddisk, FileMode.Open); byte[] filename = new byte[3]; byte attr; int address;

int n = 0; int flag = 0; char type;

int[] Item_Address = { 0,0}; for (int i = 0; i < 8; i++) {

Disk.Seek(64 * (disknum - 1) + n, SeekOrigin.Begin); //fcb中的attribute Disk.Read(filename, 0, 3);

Disk.Seek(1, SeekOrigin.Current);

attr=Convert.ToByte(Disk.ReadByte()); address= Disk.ReadByte(); if (attr == 8) {

for (int k = 0; k < 3; k++) {

if (name[k] != filename[k]) {

break; }

flag = k + 1; }

if (flag == 3) {

Item_Address[0] = i + 1; Item_Address[1] = address; Disk.Close();

return Item_Address; } } else {

switch (attr) {

case 2: case 3:

type = 'e'; break; case 4: case 5:

type = 't'; break; default:

type = 'x'; break;

}

for (int k = 0; k < 3; k++) {

if (name[k] != filename[k]) {

break; }

flag = k + 1; }

if (flag == 3 && type == attribute) {

Item_Address[0] = i + 1; Item_Address[1] = address; Disk.Close();

return Item_Address; } }

n = n + 8; }

Disk.Close();

return Item_Address; }

#endregion

#region DeleteFCB(撤销FCB)

public void DeleteFCB(int disknum, int item, string harddisk) {

FileStream Disk = new FileStream(harddisk, FileMode.Open); byte[] bydata = new byte[8];

Disk.Seek(64*(disknum-1)+8*(item-1),SeekOrigin.Begin); Disk.Write(bydata, 0, 8); Disk.Close(); }

#endregion

#region DeleteFile(删除文件)

public void DeleteFile(string pathname, string harddisk) {

if(Search(pathname,harddisk)==1) {

MessageBox.Show(\文件路径不正确!\\注意\MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

return; }

else if (Search(pathname,harddisk) == 2) //文件存在 {

string[] pnames = pathname.Split(new char[] { '\\\\', '.' });

string halfpathname = pathname.Remove(pathname.Length - 6); char attribute= Convert.ToChar(pnames[pnames.Length-1]); UTF8Encoding utf = new UTF8Encoding();

byte[] name = utf.GetBytes(pnames[pnames.Length - 2]); int disknum;

if (pnames.Length == 3) //c:\\aaa.t {

disknum = 3; } else {

disknum = Search(halfpathname,harddisk); }

int item = FindItem(disknum, name, attribute,harddisk)[0]; int address = FindItem(disknum, name, attribute,harddisk)[1]; byte addr = Convert.ToByte(address);

DeleteFCB(disknum, item,harddisk); //删除FCB

if(addr==0) {

return; } else {

byte[] FAT = new byte[128];

FileStream Disk = new FileStream(harddisk, FileMode.Open); Disk.Read(FAT, 0, 128); int count = 1;

while (FAT[addr - 1] != 253) {

addr = FAT[addr - 1]; count++; }

byte[] dnums = new byte[count]; int i = 1;

addr = Convert.ToByte(address); while (FAT[addr-1] != 253) {

dnums[i] = FAT[addr-1];

addr =FAT[addr-1]; i++; }

dnums[0] = Convert.ToByte(address); byte[] delcontent = new byte[64]; for (int k = 0; k < 64; k++) {

delcontent[k] = 0; }

for (int j = 0; j < dnums.Length; j++) {

Disk.Seek(64 * (dnums[j] - 1), SeekOrigin.Begin);

Disk.Write(delcontent, 0, 64); //删除文件的内容 }

//将FAT表中文件占用的记为0 for (int t = 0; t < dnums.Length; t++) {

Disk.Seek(dnums[t] - 1, SeekOrigin.Begin); Disk.WriteByte(0); }

Disk.Close(); } } else {

MessageBox.Show(\文件不存在!\\注意\MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } }

#endregion

#region DeleteMenu(删除目录)

public void DeleteMenu(string pathname, string harddisk) {

if (Search(pathname,harddisk) == 1) {

MessageBox.Show(\文件路径不正确!\\注意\MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; }

else if (Search(pathname,harddisk) == 0)

{

MessageBox.Show(\文件不存在!\\注意\MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } else {

string[] pnames = pathname.Split(new char[] { '\\\\', '.' });

string halfpathname = pathname.Remove(pathname.Length - 4); int lastdnum=Search(pathname,harddisk);

int attribute;

byte[] bytename = new byte[3];

UTF8Encoding utf8 = new UTF8Encoding(); int n=0;

for(int i=0;i<8;i++) {

FileStream Disk = new FileStream(harddisk, FileMode.Open); Disk.Seek(64 * (lastdnum - 1) + n, SeekOrigin.Begin); Disk.Read(bytename, 0, 3);

Disk.Seek(1,SeekOrigin.Current); attribute = Disk.ReadByte(); if (attribute == 8) {

pathname = pathname + '\\\\' + utf8.GetString(bytename); Disk.Close();

DeleteMenu(pathname,harddisk); }

else if (attribute == 2 || attribute == 3 || attribute == 4 || attribute == 5) {

if (attribute == 2 || attribute == 3) {

pathname = pathname + '\\\\' + utf8.GetString(bytename) + \ Disk.Close();

DeleteFile(pathname,harddisk); } else {

pathname = pathname + '\\\\' + utf8.GetString(bytename) + \ Disk.Close();

DeleteFile(pathname,harddisk); } }

else {

Disk.Close(); break; }

n=n+8; } int disknum;

if (pnames.Length == 2) //c:\\aaa {

disknum = 3; } else {

disknum = Search(halfpathname,harddisk); }

UTF8Encoding utf = new UTF8Encoding();

byte[] name = utf.GetBytes(pnames[pnames.Length - 1]);

int item = FindItem(disknum, name, Convert.ToChar(8),harddisk)[0]; //目录项 int address = FindItem(disknum, name, Convert.ToChar(8),harddisk)[1]; //目录起始盘块号

//byte addr = Convert.ToByte(address);

DeleteFCB(disknum, item,harddisk); //删除FCB

byte[] delcontent = new byte[64]; for (int k = 0; k < 64; k++) {

delcontent[k] = 0; }

FileStream Disk1 = new FileStream(harddisk, FileMode.Open); Disk1.Seek(64 * ( address- 1), SeekOrigin.Begin); Disk1.Write(delcontent, 0, 64);

Disk1.Seek(address - 1, SeekOrigin.Begin); //记录FAT为0 Disk1.WriteByte(0); Disk1.Close(); } }

#endregion

#region ReadFCB(获取文件的FCB信息)

public FCB ReadFCB(int disknum, int item, string harddisk)

{

FileStream Disk = new FileStream(harddisk, FileMode.Open); FCB buffer = new FCB();

Disk.Seek(64 * (disknum - 1) + 8 * (item - 1), SeekOrigin.Begin); Disk.Read(buffer.Name, 0, 3);

buffer.Type = Convert.ToByte(Disk.ReadByte()); buffer.Attribute =Convert.ToByte(Disk.ReadByte()); buffer.Address = Convert.ToByte(Disk.ReadByte()); buffer.Length=Convert.ToChar(Disk.ReadByte()); Disk.Close(); return buffer; }

#endregion

#region CopyFile(复制文件,只复制FCB)

public void CopyFile(string pathname1, string pathname2, string harddisk) {

string[] pnames = pathname1.Split(new char[] { '\\\\', '.' });

string halfpathname = pathname1.Remove(pathname1.Length - 6); char attribute = Convert.ToChar(pnames[pnames.Length - 1]); UTF8Encoding utf = new UTF8Encoding();

byte[] name = utf.GetBytes(pnames[pnames.Length - 2]); int disknum;

if (pnames.Length == 3) //c:\\aaa.t {

disknum = 3; } else {

disknum = Search(halfpathname,harddisk); }

int item = FindItem(disknum, name, attribute,harddisk)[0]; //int address = FindItem(disknum, name, attribute)[1]; FCB buffer = ReadFCB(disknum, item,harddisk);

pathname2 = pathname2 +'\\\\'+ pnames[pnames.Length-2] +'.'+pnames[pnames.Length - 1];

CreateFile(pathname2, buffer.Attribute, buffer.Address, buffer.Length,harddisk); }

#endregion

#region CutFile(移动文件)

public void CutFile(string pathname1, string pathname2, string harddisk) {

CopyFile(pathname1, pathname2,harddisk); //复制FCB到新目录下

string[] pnames = pathname1.Split(new char[] { '\\\\', '.' });

string halfpathname = pathname1.Remove(pathname1.Length - 6); char attribute = Convert.ToChar(pnames[pnames.Length - 1]); UTF8Encoding utf = new UTF8Encoding();

byte[] name = utf.GetBytes(pnames[pnames.Length - 2]); int disknum;

if (pnames.Length == 3) //c:\\aaa.t {

disknum = 3; } else {

disknum = Search(halfpathname,harddisk); }

int item = FindItem(disknum, name, attribute,harddisk)[0];

DeleteFCB(disknum, item,harddisk); //删除FCB }

#endregion

#region DeepCopyFile(深度复制)

public void DeepCopyFile(string pathname1, string pathname2, string harddisk1,string harddisk2) {

string[] pnames = pathname1.Split(new char[] { '\\\\', '.' });

string halfpathname = pathname1.Remove(pathname1.Length - 6); char attribute = Convert.ToChar(pnames[pnames.Length - 1]); UTF8Encoding utf = new UTF8Encoding();

byte[] name = utf.GetBytes(pnames[pnames.Length - 2]); int disknum;

if (pnames.Length == 3) //c:\\aaa.t {

disknum = 3; } else {

disknum = Search(halfpathname,harddisk1); }

int item = FindItem(disknum, name, attribute,harddisk1)[0]; //获取文件在目录的第几项 FCB buffer = ReadFCB(disknum, item,harddisk1);

Form1 form = new Form1();

int [] dnums = form.FindDiskNumber(buffer.Address,harddisk1); //获取文件占用的所有盘块号

//读取文件的内容

FileStream Disk = new FileStream(harddisk1, FileMode.Open); byte[] content = new byte[64 * dnums.Length]; for (int i = 0; i < dnums.Length; i++) {

Disk.Seek(64 * (dnums[i] - 1), SeekOrigin.Begin); Disk.Read(content, 64 * i, 64); }

Disk.Close();

pathname2 = pathname2 + '\\\\' + pnames[pnames.Length - 2] + '.' + pnames[pnames.Length - 1];

DialogResult result = new DialogResult(); if (Search(pathname2, harddisk2) == 2) {

result = MessageBox.Show(\文件存在,是否覆盖?\\注意\MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation); if (result == DialogResult.OK) {

DeleteFile(pathname2, harddisk2);

int[] nums = form.SearchFAT(dnums.Length, harddisk2); //获取空盘块 form.RecordFileFAT(nums, harddisk2); //记录文件FAT form.WriteContent(nums, content, harddisk2); //写入文件内容

CreateFile(pathname2, buffer.Attribute, Convert.ToByte(nums[0]), buffer.Length, harddisk2); //FCB写入新目录内 }

if (result == DialogResult.Cancel) {

return; } } else {

int[] nums = form.SearchFAT(dnums.Length, harddisk2); //获取空盘块 form.RecordFileFAT(nums, harddisk2); //记录文件FAT form.WriteContent(nums, content, harddisk2); //写入文件内容

CreateFile(pathname2, buffer.Attribute, Convert.ToByte(nums[0]), buffer.Length, harddisk2); //FCB写入新目录内 } }

#endregion

#region ReadFile(读文件画节点)

public void ReadFile(TreeView treeView, ContextMenuStrip contextMenuStrip,ImageList imageList) {

treeView.Nodes.Clear(); //删除集合中所有树节点 //重新添加树节点

treeView.ImageList = imageList;

TreeNode root = new TreeNode(\计算机\

TreeNode node_C = new TreeNode(\本地磁盘C\ TreeNode node_D = new TreeNode(\本地磁盘D\ node_C.ContextMenuStrip = contextMenuStrip; node_D.ContextMenuStrip = contextMenuStrip; treeView.Nodes.Add(root); root.Nodes.Add(node_C); root.Nodes.Add(node_D);

DrawTree(node_C, 3,\ DrawTree(node_D, 3, \ treeView.ExpandAll(); }

#endregion

#region DrawTree

public void DrawTree(TreeNode node, int disknum,string harddisk,ContextMenuStrip contextmenustrip) {

char[] charname = new char[3]; byte[] bytename = new byte[3]; int n = 0;

for (int i = 0; i < 8; i++) {

FileStream Disk = new FileStream(harddisk, FileMode.Open); Disk.Seek(64 * (disknum - 1) + n, SeekOrigin.Begin);

Disk.Read(bytename, 0, 3); //读文件名

string name = UTF8Encoding.UTF8.GetString(bytename); //文件名转换为string类型

Disk.Seek(1, SeekOrigin.Current); int attr = Disk.ReadByte(); Disk.Close();

if (attr == 8) //目录 {

FileStream Disk1 = new FileStream(harddisk, FileMode.Open); TreeNode m_childnode = new TreeNode(name, 1, 1); m_childnode.ContextMenuStrip = contextmenustrip; node.Nodes.Add(m_childnode);

Disk1.Seek(64*(disknum-1)+5+n, SeekOrigin.Begin); int disknumber = Disk1.ReadByte(); Disk1.Close();

DrawTree(m_childnode, disknumber, harddisk,contextmenustrip); n = n + 8; continue; }

else if (attr == 2 || attr == 3) //exe文件 {

name += \

TreeNode e_childnode = new TreeNode(name, 2, 2); e_childnode.ContextMenuStrip = contextmenustrip; node.Nodes.Add(e_childnode); n = n + 8; continue; }

else if (attr == 4 || attr == 5) //txt文件 {

name += \

TreeNode t_childnode = new TreeNode(name, 3, 3); t_childnode.ContextMenuStrip = contextmenustrip; node.Nodes.Add(t_childnode); n = n + 8; continue; } else {

n = n + 8; continue; } } }

#endregion

#region DrawDisk(读FAT画磁盘)

public void DrawDisk(GroupBox groupbox,string harddisk) {

groupbox.Controls.Clear();

FileStream Disk = new FileStream(harddisk, FileMode.Open);

byte[] FAT = new byte[128]; Disk.Seek(0, SeekOrigin.Begin); Disk.Read(FAT, 0, 128); Disk.Close();

PictureBox[] PB = new PictureBox[128]; for (int i = 0; i < 3; i++) {

PB[i] = new PictureBox(); //实例化 PB[i].BorderStyle = BorderStyle.Fixed3D; PB[i].BackColor = Color.GreenYellow;

PB[i].Size = new System.Drawing.Size(15, 15); }

for (int i = 3; i < 128; i++) {

PB[i] = new PictureBox(); //实例化 PB[i].BorderStyle = BorderStyle.Fixed3D;

PB[i].Size = new System.Drawing.Size(15, 15); }

//初始化picturebox的位置 int j = 0; int k; int n = 0;

for (int i = 0; i < 8; i++) {

k = 0;

while (j != 16 * (i + 1)) {

PB[j].Location = new System.Drawing.Point(17 + 16* k, 21 + 16 * n); j++; k++; } n++; }

for (int i = 3; i < 128;i++ ) {

if (FAT[i] != 0) {

PB[i].BackColor = Color.Blue; }

if (FAT[i] == 0)

{

PB[i].BackColor = Color.MediumOrchid; } }

for (int i = 0; i < 128; i++) {

groupbox.Controls.Add(PB[i]); } }

#endregion

} }

3.2 存储管理

文件管理系统

查看e.exe文件内容

复制e.exe到文件夹aa

删除原来的e.exe

四 结束语

通过这次课程设计,我模拟了操作系统原理的实现,加深对操作系统工作原理和操作系统实现方法的理解,并且练习了C#编程。

在课程设计的过程中我也遇到了不少的问题,使我意识到了自己的不足之处,并且在解决问题的过程中,我的能力获得了提高。

总之,这次课程设计的收获是巨大的。

参考文献

[1]操作系统习题解答与实验指导. 王煜,张明,刘振鹏. 中国铁道出版社. 2010 [2]操作系统实验指导. 任爱华. 清华大学出版社. 2004

[3]操作系统实验教程(Windows版). 姚卫华. 清华大学出版社. 2005

本文来源:https://www.bwwdw.com/article/s8ot.html

Top