一引言1.1实验的性质、目的和任务1.1.1性质操作系统是计算机专业的核心系统,此课程设计用于模拟操作系统的实现。
操作系统对计算机系统资源实施管理,是所有其他软件与计算机硬件的唯一接口,所有用户在使用计算机时都要得到操作系统提供的服务。
要掌握操作系统的基本概念、基本原理、设计方法和实现技术,具有初步分析实际操作系统的能力,为其今后在相关领域开展工作打下坚实的基础。
1.1.2任务模拟采用多道程序设计方法的单用户操作系统,该操作系统包括四部分内容:文件管理和用户接口、存储管理、设备管理、进程管理。
1.1.3目的通过模拟操作系统原理的实现,加深对操作系统工作原理和操作系统实现方法的理解;通过模拟操作系统原理的实现练习编程,进一步了解操作系统的实现方法;练习合作完成系统的团队精神和提高程序设计能力。
1.2实验要求和实验意义实现对操作系统的模拟,具体是在采用文件分配表的基础上实现单用户的磁盘文件管理部分和用户接口;加深对操作系统的工作原理和实现方式的理解,提高动手实践的能力。
1.3论文结构安排本论文主要内容:引言、系统分析与设计、系统实现、结束语、参考文献。
二系统分析与设计2.1系统要求模拟采用多道程序设计方法的单用户操作系统,该操作系统包括四部分内容:文件管理和用户接口、存储管理、设备管理、进程管理。
2.2主要模块2.2.1文件模块2.2.1.1文件模块的定义文件是在逻辑上具有完整意义的信息组合,它有一个名字做标识符。
一个文件必须要有一个文件名,用户利用文件名来访问文件。
文件名通常由一串字符构成,名字的长度因系统而异。
文件系统具有5大功能:完成文件存储空间的管理,实现文件名到物理地址的映射,实现文件和目录的操作管理,提供文件共享能力和安全可靠措施,文件系统向用户提供了有关文件和目录操作的接口。
2.2.1.2文件的逻辑结构文件的逻辑结构采用流式结构,流式文件指文件内的数据不再组成记录,只是一串的信息组合,字符是构成文件的基本单位,这种文件常常按长度来读取所需信息。
文件的内容均采用文本文件,系统中有两种文件:一种是存放任意字符的文件;一种是可执行文件:可执行文件的内容就是系统内进程的程序体。
2.2.1.3文件的物理结构实验中采用显示链接的物理文件结构,把磁盘中每一块的指针部分提出来,组织在一起,形成文件分配表(FAT表)。
一个磁盘仅设置一张文件分配表,磁盘有多少块,文件分配表就有多少项,若文件的一个磁盘块号为i,则这个文件的下一个磁盘的块号应该记录在文件分配表的第i项。
2.2.1.4磁盘模拟用一个文件C模拟磁盘,磁盘的每个盘块64字节,模拟磁盘共有128块。
第0,1块存放文件分配表,第2块存放根目录,其余存放子目录和文件。
2.2.1.5目录结构目录结构采用树形目录结构。
目录项内容(8个字节)目录名,文件名:2个字节;扩展名:2个字节(目录没有扩展名)。
目录,文件属性:1字节;起始盘块号:1个字节;文件长度:2个字节;●根目录根目录位置固定,为磁盘第2块;大小固定,共8项,占用模拟磁盘第2块。
●子目录位置不固定,大小不固定。
2.2.2用户接口●创建文件:create 文件名建立新文件,如果原来存在同名文件要提示是否覆盖。
●拷贝文件:copy 源文件名目标文件名当用户需要拷贝一些文件时,首先要先找到该文件,可同名拷贝,也可更名拷贝。
●删除文件: delete 文件名●显示文件: type 文件名仅显示文件内容。
●编辑文件: edit 文件名此命令完成对文件的编辑,只读文件不可以修改。
●改变文件属性: change 文件名属性将文件在只读和非只读、隐藏和非隐藏之间转换。
●磁盘格式化: format 盘符●建立目录: makdir 目录建立目录,若同名目录存在则建立失败。
●改变目录路径: chadir目录改变当前目录。
●删除空目录: rdir 目录当前目录、非空目录、根目录不能删除。
●删除目录: deldir 目录既可删除空目录又可删除非空目录,对于非空目录,首先要删除其下文件和目录然后才能删除其本身。
2.2.3屏幕显示屏幕显示要求包括:●用户命令接口,用于系统运行时用户输入命令;●磁盘目录显示,要求显示磁盘的树型目录结构;●磁盘使用情况,显示磁盘每一个磁盘块的空间是否空闲。
第三章系统实现3.1文件模块3.1.1创建FAT表这一部分主要实现FAT表的定义和初始化,代码如下:public class FAT{public byte[] fblock = new byte[128]; //FAT一共128项public byte leave = 125; //剩余空闲盘块数量public FAT() //构造函数{fblock[0] = fblock[1] = fblock[2] = 255;for (int i = 3; i < 128; i++)fblock[i] = 0;}public byte allempty() //空闲盘块数量{byte num = new byte();for (int i = 0; i < 128; i++)if (fblock[i] == 0)num++;return num;}public byte former(byte num) //查找第一个盘块{if (fblock[num] == 0)return 0; //此盘块为空byte pir = pirorblock(num);for (; pir != num; pir = pirorblock(pir)) //若num的前一个块号为它本身,则num为首块号num = pir;return num;}public byte last(byte num) //查找该块的最后一个块号{byte next = nextblock(num);for (; next != num; next = nextblock(next)) //无后续盘块时返回为0num = next;return num;}public byte pirorblock(byte num) //查找该块的前一个块号{if (fblock[num] == 0)return 0; //此盘块为空else if (fblock[num] == 255)return num; //单独存放一个盘块,为第一个盘块for (byte i = 3; i < 128; i++)if (fblock[i] == num)return i;return 255; //没找到}public byte nextblock(byte num) //查找该块的下一个块号{if (fblock[num] != 255)return fblock[num];elsereturn num; //该块为最后一块}public byte numall(byte num){byte i = 1;byte next = nextblock(num);for (; next != num; num = next, next = nextblock(next))i++;return i;}public bool add(byte block){byte b = last(block);byte n;if (findempty() == 0){MessageBox.Show("磁盘空间不够");return false;}else{n = findempty();fblock[b] = n;fblock[n] = 255;return true;}}public byte dirshenqing(){if (leave == 0){MessageBox.Show("磁盘空间不够");return 255; //剩余数目不够}byte b = findempty();fblock[b] = 255;leave--;return b;}public byte shenqing(int length) //根据文件长度申请盘块{byte n = Convert.ToByte(Math.Ceiling((double)(length / (double)64))); //共需多少盘块if (n > leave){MessageBox.Show("磁盘空间不够");return 255; //剩余数目不够}else{byte b = new byte();byte bb = new byte();b = findempty();fblock[b] = 255;for (int i = 0; i < n - 1; i++){bb = findempty();fblock[bb] = b;b = bb;}leave = Convert.ToByte(leave - n);return b; //首块号}}public bool huishou(byte block) //回收盘块{if (block > 2 && block <= 127){byte b = block;byte bb = block;byte i = 0;while (fblock[b] != 255){bb = fblock[b];fblock[b] = 0;b = bb;i++;}fblock[b] = 0;leave = Convert.ToByte(leave + i + 1); //剩余盘块量增加return true;}else{return false;}}}3.1.2磁盘模拟这一部分主要实现磁盘的组织情况,代码如下public void initdisk(){for (int i = 0; i < 128; i++){picture[i] = new PictureBox();picture[i].Location = new Point(6 + 22 * (i % 16), 20 + 18 * (i / 16));picture[i].Size = new Size(16, 12);if (file1.disk.fat.fblock[i] != 0)picture[i].BackColor = Color.Lime;elsepicture[i].BackColor = Color.White;this.groupBox3.Controls.Add(picture[i]);}}public void showdisk(){for (int i = 0; i < 128; i++){picture[i].Location = new Point(6 + 22 * (i % 16), 20 + 18 * (i / 16));picture[i].Size = new Size(16, 12);if (file1.disk.fat.fblock[i] != 0)picture[i].BackColor = Color.Lime;elsepicture[i].BackColor = Color.White;this.groupBox3.Controls.Add(picture[i]);}}3.1.3利用窗体实现文件的操作●创建txt文件private void文件ToolStripMenuItem_Click(object sender, EventArgs e) {creatnamelen cnl = new creatnamelen();cnl.ShowDialog();string str = ;byte len = Convert.ToByte(str.Length);if (len == 0)return;if (len > 3){MessageBox.Show("输入长度超过三个字符,只取前三个");str = str.Remove(3, len - 3);}string fullname = treeView1.SelectedNode.FullPath;str += "." + "tx";fullname += "\\" + str;bool a = file1.create(fullname);if (a == true){TreeNode now = treeView1.SelectedNode;TreeNode newnode = new TreeNode();newnode.Text = str;newnode.SelectedImageIndex = 3;newnode.ImageIndex = 3;now.Nodes.Add(newnode);showdisk();}●创建可执行文件private void可执行文件ToolStripMenuItem_Click(object sender, EventArgs e) {creatnamelen cnl = new creatnamelen();cnl.ShowDialog();string str = ;byte len = Convert.ToByte(str.Length);if (len == 0)return;if (len > 3){MessageBox.Show("输入长度超过三个字符,只取前三个");str = str.Remove(3, len - 3);}string fullname = treeView1.SelectedNode.FullPath;str += "." + "ex";fullname += "\\" + str + "." + "ex";bool a = file1.create(fullname);if (a == true){TreeNode now = treeView1.SelectedNode;TreeNode newnode = new TreeNode();newnode.Text = str;newnode.SelectedImageIndex = 1;newnode.ImageIndex = 1;now.Nodes.Add(newnode);}showdisk();}●显示文件private void显示文件ToolStripMenuItem_Click(object sender, EventArgs e) {string fullname = treeView1.SelectedNode.FullPath;TreeNode now = treeView1.SelectedNode;if (now.ImageIndex != 1 && now.ImageIndex != 3){MessageBox.Show("不是文件,不能显示");return;}file1.show(fullname, 0);showdisk();}●编辑文件private void编辑文件ToolStripMenuItem_Click(object sender, EventArgs e) {string fullname = treeView1.SelectedNode.FullPath;TreeNode now = treeView1.SelectedNode;if (now.ImageIndex != 1 && now.ImageIndex != 3){MessageBox.Show("不是文件,不能编辑");return;}file1.edit(fullname);showdisk();}●改变属性private void改变属性ToolStripMenuItem_Click(object sender, EventArgs e) {string fullname = treeView1.SelectedNode.FullPath;TreeNode now = treeView1.SelectedNode;if (now.ImageIndex != 1 && now.ImageIndex != 3){MessageBox.Show("不是文件,不能改变");return;}changeexten ct = new changeexten();ct.ShowDialog();string ex = ct.extension;bool a = file1.changefile(fullname, ex);if (a == true){string name = now.Text;now.Text = name.Substring(0, 4) + ex;if (ex == "ex"){now.ImageIndex = 1;now.SelectedImageIndex = 1;}else{now.ImageIndex = 3;now.SelectedImageIndex = 3;}}showdisk();}●运行可执行文件private void运行ToolStripMenuItem_Click(object sender, EventArgs e) {TreeNode now = treeView1.SelectedNode;if (now.ImageIndex != 1){MessageBox.Show("不是可执行文件,不能运行");return;}string fullname = now.FullPath;string str = file1.show(fullname, 0);creat(str.Length ,str );}●删除文件private void文件ToolStripMenuItem1_Click(object sender, EventArgs e) {TreeNode del = treeView1.SelectedNode;string fullname = "";fullname = del.FullPath;string str = "";for (int i = 0; i < del.Text.Length; i++){char[] nchar = del.Text.ToCharArray();if (nchar[i] != '\0')str += nchar[i].ToString();elsebreak;}treeView1.Nodes.Remove(del);file1.dirdelete(fullname);showdisk();}●拷贝文件private void复制ToolStripMenuItem_Click(object sender, EventArgs e) {fufrom = treeView1.SelectedNode;if (fufrom.ImageIndex != 1 && fufrom.ImageIndex != 3){MessageBox.Show("不是文件,不能复制");return;}fuzhi = fufrom.FullPath;}private void粘贴ToolStripMenuItem_Click(object sender, EventArgs e) {TreeNode now = treeView1.SelectedNode;string b = now.FullPath;string to = "";for (int i = 0; i < b.Length; i++){char[] nchar = b.ToCharArray();if (nchar[i] != '\0')to += nchar[i].ToString();elsebreak;}if (fuzhi != " "){bool a = file1.copyfile(fuzhi, to);if (a == true){TreeNode newnode = new TreeNode();newnode.Text = fufrom.Text;newnode.ImageIndex = fufrom.ImageIndex;newnode.SelectedImageIndex = fufrom.SelectedImageIndex;now.Nodes.Add(newnode);}}else if (cut != " "){if (cutnode == now)return;bool a = file1.copyfile(cut, to);file1.filedelete(cut);if (a == true){TreeNode newnode = new TreeNode();newnode.Text = cutnode.Text;newnode.ImageIndex = cutnode.ImageIndex;newnode.SelectedImageIndex = cutnode.SelectedImageIndex;now.Nodes.Add(newnode);}cut = " ";}showdisk();}3.2用户接口模块3.2.1创建文件图3-1创建文件的流程图public bool create(string fullname){byte d;byte m;byte cur;int len; //文件长度string filecontent; //文件内容byte num = 0; //文件所需块数byte[] nbyte;byte[] buffer1 = new byte[64]; //存放一个盘块中内容byte b = finddir(fullname); //文件所在根目录string[] strpat = splitfullname(fullname);string pathname = "";for (int i = 0; i < strpat.Length - 2; i++)pathname += strpat[i] + "\\";pathname += strpat[strpat.Length - 2];string[] str = splitfullname(fullname); // 文件路径名分段byte roadlen = Convert.ToByte(str.Length); //路径名长度string[] name = str[roadlen - 1].Split('.')//划分文件名和扩展名if (pare(name[1], "ex") != 0 && pare(name[1], "tx") != 0) {MessageBox.Show("文件扩展名错误");return false;}char[] nchar = new char[3]; //存放文件名char[] nchar1 = new char[2]; //存放扩展名byte[] f = empty(b); //根目录是否已满if (filechongming(fullname) != 255){MessageBox.Show("文件重名");return false;}if (f[0] == 255 && b == 2) //在根目录中插入{MessageBox.Show("根目录中已满,不能创建文件");return false;}else if (f[0] != 255) //255为此块盘已满,disk.readblock(f[0], 64);disk.rootdir.set(disk.buffer); //文件存放根目录内容nchar = name[0].ToCharArray(); //存放文件名nchar1 = name[1].ToCharArray();for (int i = 0; i < nchar.Length; i++)disk.rootdir.root[f[1]].filename[i] = Convert.ToByte(nchar[i]);for (int i = 0; i < 2; i++)disk.rootdir.root[f[1]].extension[i] = Convert.ToByte(nchar1[i]);if (name[1] == "ex")disk.rootdir.root[f[1]].dirORfile = 1;elsedisk.rootdir.root[f[1]].dirORfile = 2;createfile cf = new createfile();cf.ShowDialog();len = cf.length;filecontent = cf.str;num = Convert.ToByte(Math.Ceiling((double)(len / (double)64)));//文件所需盘块数m = disk.fat.shenqing(len);disk.writefat();if (m == 255) //磁盘空间不够,放不下此文件{return false;}disk.rootdir.root[f[1]].startblock = m;disk.rootdir.root[f[1]].length = Convert.ToByte(len);disk.buffer = disk.rootdir.get();disk.writein(f[0], 64);nbyte = disk.fat.findall(m); //所有盘块string str1;char[] fileneirong = new char[64];for (byte i = 0; i < num; i++){if (i == num - 1){str1 = filecontent.Substring(i * 64, len - 64 * (num - 1));fileneirong = str1.ToCharArray();for (int j = 0; j < fileneirong.Length; j++)disk.buffer[j] = Convert.ToByte(fileneirong[j]);disk.writein(nbyte[i], Convert.ToByte(len - 64 * (num - 1)));}else{str1 = filecontent.Substring(i * 64, 64);fileneirong = str1.ToCharArray();for (int j = 0; j < 64; j++)disk.buffer[j] = Convert.ToByte(fileneirong[j]);disk.writein(nbyte[i], 64);}}return true;}}3.2.2拷贝文件public bool copyfile(string from, string to){string[] fromstr = splitfullname(from); //源文件路径分解byte strlen = Convert.ToByte(fromstr.Length); //路径名长度string[] fromname = fromstr[strlen - 1].Split('.'); //划分文件名和扩展名string[] tostr = splitfullname(to); //复制文件路径分解;string toroot = tostr[tostr.Length - 1];byte dirstart = dirchongming(to); //目标目录所在盘块disk.readblock(dirstart, 64); //文件目录所在盘块disk.rootdir.set(disk.buffer);dirstart = disk.rootdir.filefindfat(toroot, 0);string strfull = show(from, 1); //源文件内容int len = strfull.Length; //文件长度string filecontent = strfull; //文件内容byte num = Convert.ToByte(Math.Ceiling((double)(len / (double)64)));//文件所需盘块数byte[] nbyte;byte[] buffer1 = new byte[64]; //存放一个盘块中内容byte m; //申请到的首盘块byte d;if (dirstart == 255){MessageBox.Show("路径错误");return false;}string tofullname = to + "\\" + fromstr[strlen - 1];byte tochong = filechongming(tofullname);if (tochong != 255){DialogResult r = MessageBox.Show("已存在此文件,是否覆盖", "粘贴", MessageBoxButtons.YesNo);if (r == DialogResult.No) //已存在此文件,不覆盖,不做操作{return false;}else//覆盖,将原来的删除,再新建filedelete(tofullname);}char[] nchar = fromname[0].ToCharArray(); //存放文件名char[] nchar1 = fromname[1].ToCharArray(); //存放扩展名byte[] f = empty(dirstart); //根目录是否已满,若满,则链接一个新盘块disk.readblock(f[0], 64);disk.rootdir.set(disk.buffer); //文件存放根目录内容if (f[0] == 255 && dirstart == 2) //在根目录中插入{MessageBox.Show("根目录中已满,不能创建文件");return false;}else if (f[0] != 255) //255为此块盘已满{for (int i = 0; i < 3; i++)disk.rootdir.root[f[1]].filename[i] = Convert.ToByte(nchar[i]);for (int i = 0; i < 2; i++)disk.rootdir.root[f[1]].extension[i] = Convert.ToByte(nchar1[i]);if (fromname[1] == "ex")disk.rootdir.root[f[1]].dirORfile = 1;elsedisk.rootdir.root[f[1]].dirORfile = 2;m = disk.fat.shenqing(len);disk.writefat();if (m == 255) //磁盘空间不够,放不下此文件{return false;}disk.rootdir.root[f[1]].startblock = m;disk.rootdir.root[f[1]].length = Convert.ToByte(len);disk.buffer = disk.rootdir.get();disk.writein(f[0], 64);nbyte = disk.fat.findall(m); //所有盘块string str1;char[] fileneirong = new char[64];for (byte i = 0; i < num; i++){if (i == num - 1){str1 = filecontent.Substring(i * 64, len - 64 * (num - 1));fileneirong = str1.ToCharArray();for (int j = 0; j < fileneirong.Length; j++)disk.buffer[j] = Convert.ToByte(fileneirong[j]);disk.writein(nbyte[i], Convert.ToByte(len - 64 * (num - 1)));}else{str1 = filecontent.Substring(i * 64, 64);fileneirong = str1.ToCharArray();for (int j = 0; j < 64; j++)disk.buffer[j] = Convert.ToByte(fileneirong[j]);disk.writein(nbyte[i], 64);}}return true;}3.2.3删除文件图3-3删除文件的流程图public bool filedelete(string fullname){byte b = filechongming(fullname);if (b == 255)return false;disk.readblock(b, 64);disk.rootdir.set(disk.buffer);string[] str = splitfullname(fullname); // 文件路径名分段byte strlen = Convert.ToByte(str.Length); //路径名长度string[] name = str[strlen - 1].Split('.')//划分文件名和扩展名byte attribute = new byte();if (name[1] == "ex")attribute = 1;elseattribute = 2;if (name[1] != "ex" && name[1] != "tx"){MessageBox.Show("文件扩展名错误");return false;}byte start = disk.rootdir.filefindfat(name[0], attribute);byte site = disk.rootdir.filesite(name[0], attribute);disk.fat.huishou(start);disk.rootdir.root[site].dirORfile = 3;for (int i = 0; i < 3; i++)disk.rootdir.root[site].filename[i] = 0;for (int i = 0; i < 2; i++)disk.rootdir.root[site].extension[i] = 0;disk.rootdir.root[site].startblock = disk.rootdir.root[site].length = 0;disk.writefat();disk.buffer = disk.rootdir.get();disk.writein(b, 64);return true;}3.2.4磁盘格式化图3-4 磁盘格式化是的流程图这一部分实现磁盘格式化,代码如下:public void format(){DialogResult r = MessageBox.Show("确实要格式化吗?", "格式化", MessageBoxButtons.YesNo);byte[] nbyte = new byte[64];if (r == DialogResult.Yes){nbyte[0] = nbyte[1] = nbyte[2] = 255;for (int i = 3; i < 64; i++)nbyte[i] = 0;disk.buffer = nbyte;disk.writein(0, 64);for (int i = 0; i < 64; i++)nbyte[i] = 0;disk.buffer = nbyte;disk.writein(1, 64);for (byte i = 2; i < 128; i++){for (int j = 0; j < 64; j++)nbyte[j] = 0;for (int j = 5; j < 64; j = j + 8)nbyte[j] = 3;disk.buffer = nbyte;disk.writein(i, 64);}setfat();}}3.2.5改变文件属性图3-5 改变文件属性的流程图这一部分实现改变文件属性,主要代码如下:public bool changefile(string fullname, string extention){byte b = filechongming(fullname);if (b == 255)return false;string[] str = splitfullname(fullname);byte roadlen = Convert.ToByte(str.Length); //路径名长度string[] name = str[roadlen - 1].Split('.');//划分文件名和扩展名disk.readblock(b, 64);disk.rootdir.set(disk.buffer);byte attribute;if (extention == "ex" || extention == "tx"){if (name[1] == "ex")attribute = 1;elseattribute = 2;char[] nc = new char[2];nc = extention.ToCharArray();byte site = disk.rootdir.filesite(name[0], attribute);for (int i = 0; i < 2; i++)disk.rootdir.root[site].extension[i] = Convert.ToByte(nc[i]);if (extention == "ex")disk.rootdir.root[site].dirORfile = 1;elsedisk.rootdir.root[site].dirORfile = 2;disk.buffer = disk.rootdir.get();disk.writein(b, 64);return true;}return false;}}3.2.6显示文件图3-6 显示文件的流程图这一部分主要实现文件的显示,代码如下:public string show(string fullname, int m){ string[] str = splitfullname(fullname);byte strlen = Convert.ToByte(str.Length); //路径名长度string[] name = str[strlen - 1].Split('.'); //划分文件名和扩展名string fileneirong = "";if (name[1] != "ex" && name[1] != "tx"){MessageBox.Show("不能显示");return fileneirong;}byte b = filechongming(fullname);if (b == 255){MessageBox.Show("不存在此文件,不能显示");return fileneirong;}disk.readblock(b, 64);disk.rootdir.set(disk.buffer);byte attribute = new byte();if (name[1] == "ex")attribute = 1;elseattribute = 2;byte start = disk.rootdir.filefindfat(name[0], attribute);byte site = disk.rootdir.filesite(name[0], attribute);byte len = disk.rootdir.root[site].length;byte[] nbyte = disk.fat.findall(start);for (int i = 0; i < nbyte.Length; i++){UTF8Encoding nnn = new UTF8Encoding();if (i != nbyte.Length - 1){disk.readblock(nbyte[i], 64);fileneirong += nnn.GetString(disk.buffer);}else{disk.readblock(nbyte[i], Convert.ToByte(len - 64 * i));fileneirong += nnn.GetString(disk.buffer);}}if (m == 0){showfile ss = new showfile(name[0], fileneirong);ss.ShowDialog();}return fileneirong;}3.2.7创建目录图3-7 创建目录的流程图这一部分主要实现创建目录,代码如下:public bool createdir(string fullname){setfat();byte d; //文件所在根目录不够时新增盘块号b yte cur;byte[] buffer1 = new byte[64]; //存放一个盘块中内容byte b = finddir(fullname); //文件所在根目录string[]str = splitfullname(fullname); // 文件路径名分段string name = str[str.Length - 1]; //划分目录名string pathname = "";for (int i = 0; i < str.Length - 2; i++)pathname += str[i] + "\\";pathname += str[str.Length - 1];if (b == 255){MessageBox.Show("路径错误");return false;}char[] nchar = new char[3]; //存放文件名byte[] f = empty(b); //根目录是否已满if(dirchongming(fullname) != 255){MessageBox.Show("文件重名");return false;}if (f[0] == 255 && b == 2) //在根目录中插入{MessageBox.Show("根目录中已满,不能创建文件");return false;}else if (f[0] != 255) //255为此块盘已满disk.readblock(f[0], 64);disk.rootdir.set(disk.buffer); //文件存放根目录内容nchar = name.ToCharArray();//存放文件名for (int i = 0; i < 3; i++)disk.rootdir.root[f[1]].filename[i] = Convert.ToByte(nchar[i]);for (int i = 0; i < 2; i++)disk.rootdir.root[f[1]].dirORfile = 0;disk.rootdir.root[f[1]].startblock = disk.fat.dirshenqing();disk.writefat();disk.rootdir.root[f[1]].length = 0;disk.buffer =disk.rootdir.get();disk.writein(f[0], 64);}else{cur = finddir(pathname);disk.readblock(cur, 64);disk.rootdir.set(disk.buffer); //文件存放根目录内容cur = disk.rootdir.filesite(pathname, 0);disk.buffer = disk.rootdir.get();disk.writein(finddir(pathname), 64);disk.fat.add(b);d = st(b);disk.readblock(d, 64);disk.rootdir.set(disk.buffer); //文件存放根目录内容nchar = name.ToCharArray(); //存放文件名for (int i = 0; i < 3; i++)disk.rootdir.root[0].filename[i] = Convert.ToByte(nchar[i]);for (int i = 0; i < 2; i++)disk.rootdir.root[0].extension[i] = 0;disk.rootdir.root[0].dirORfile = 0;disk.rootdir.root[0].startblock = disk.fat.dirshenqing();disk.rootdir.root[0].length = 0;disk.writefat();disk.buffer = disk.rootdir.get();disk.writein(d, 64);}return true;}3.2.8删除目录图3-8 删除目录的流程图这一部分主要实现删除目录,代码如下:public bool dirdelete(string fullname){byte b = dirchongming(fullname); //得到此路径目录所在盘块号if (b == 255)return false;disk.readblock(b, 64);disk.rootdir.set(disk.buffer);string[] str = splitfullname(fullname); // 文件路径名分段string name = str[str.Length - 1];byte start = disk.rootdir.filefindfat(name, 0);byte[] fatall =disk.fat.findall(start);byte site = disk.rootdir.filesite(name, 0);for (int i = 0; i < fatall.Length; i++){disk.readblock(fatall[i], 64);disk.rootdir.set(disk.buffer);for (int j = 0; j < 8; j++){if (disk.rootdir.root[j].dirORfile == 0) //仍为目录{UTF8Encoding nnn = new UTF8Encoding();dirdelete(fullname + "\\" +nnn.GetString(disk.rootdir.root[j].filename));}else if (disk.rootdir.root[j].dirORfile == 1) //文件{UTF8Encoding nnn = new UTF8Encoding();filedelete(fullname + "\\" +nnn.GetString(disk.rootdir.root[j].filename) + ".tx");}else if (disk.rootdir.root[j].dirORfile == 2){UTF8Encoding nnn = new UTF8Encoding();filedelete(fullname + "\\" +nnn.GetString(disk.rootdir.root[j].filename) + ".ex");}else if (disk.rootdir.root[j].dirORfile == 3) //空目录项continue;}disk.writefat();disk.buffer = disk.rootdir.get();disk.writein(fatall[i], 64);}//回收此目录在fat和此目录中位置信息disk.fat.huishou(start);disk.readblock(b, 64);disk.rootdir.set(disk.buffer);disk.rootdir.root[site].dirORfile = 3;for (int i = 0; i < 3; i++)disk.rootdir.root[site].filename[i] = 0;for (int i = 0; i < 2; i++)disk.rootdir.root[site].extension[i] = 0;disk.rootdir.root[site].startblock = disk.rootdir.root[site].length = 0;disk.writefat();disk.buffer = disk.rootdir.get();disk.writein(b, 64);return true;}3.3屏幕显示总体界面:图3-9 总体界面用户命令接口显示:图3-10 用户接口磁盘目录显示public void treeshow(byte block){file1.disk.readblock(block, 64);file1.disk.rootdir.set(file1.disk.buffer);for (int i = 0; i < 8; i++){if (file1.disk.rootdir.root[i].dirORfile != 3){string str = "";UTF8Encoding nnn = new UTF8Encoding();if (file1.disk.rootdir.root[i].dirORfile == 0)str = "C:\\" + nnn.GetString(file1.disk.rootdir.root[i].filename);elsestr = "C:\\" + nnn.GetString(file1.disk.rootdir.root[i].filename) + "." + nnn.GetString(file1.disk.rootdir.root[i].extension);diskdis.Nodes.Add(makenode(str));}}}图3-11 磁盘目录显示磁盘使用情况:显示磁盘使用情况的函数:public void showdisk(){for (int i = 0; i < 128; i++){picture[i].Location = new Point(6 + 22 * (i % 16), 20 + 18 * (i / 16));picture[i].Size = new Size(16, 12);if (file1.disk.fat.fblock[i] != 0)picture[i].BackColor = Color.Lime;elsepicture[i].BackColor = Color.White;this.groupBox3.Controls.Add(picture[i]);}}图3-12 磁盘使用情况四结束语通过做操作系统课程设计,我对操作系统的工作原理和实现方式有了更新更全面的认识,我所做的操作系统模拟程序文件管理部分基本实现了课程设计所要求的操作系统模拟的内容,但是由于水平有限仍有部分功能没有实现,尚需改善,以后需要改进和不断学习。