1、 摘 要 近几年来,计算机的CPU、内存和显卡等主要配件的性能都提升得很快,而与之相对应的磁盘系统性能正越来越严重地成为整个电脑系统性能提升的瓶颈。故将一部分内存拿出做虚拟磁盘,并在虚拟磁盘上实施文件管理系统,以加快文件的管理速度,并方便用户进行各种用户操作。基于内存的文件管理系统,顾名思义,就是将一部分内存拿出来当硬盘用,可以极大的提高在其上进行的文件访问的速度。关键词:虚拟内存磁盘 文件管理系统 linux/qt/C+目 录第一章 课题背景1.1课题实现的背景及意义第二章 项目总体设计2.1基本功能2.2目的和要求 第三章 详细设计3.1 程序整体框架和主要算法3.2类的设计与声明3.3程
2、序流程图第四章 实验内容 4.1 运行环境4.2 运行要求4.3 核心代码第五章 设计结果与分析总结参考文献第一章 课题背景: 1,需求概述近年来,随着操作系统内存容量的不断地增加,然而相当一部分的操作系统内存却是浪费了。为此出现了虚拟硬盘的概念,希望能借此实现不同情况的磁盘转储和合理利用内存。由于操作系统的虚拟内存很大,因此可以利用这些内存开辟一块空间作为虚拟磁盘。在此虚拟硬盘上,进行模拟Windows文件管理系统的对系统之中的真实的文件的管理。我们采用linux/qt 作为我们的开发环境,并实现了可视化界面,所有操作无需输入命令,而是通过点击按钮实现相应的功能。2,需求分析2.1需求理解与
3、模块图对用户需求的理解:该模拟文件系统包括四大模块:磁盘状态显示模块、存储模块、读取模块、文件管理模块。一:磁盘状态显示模块:通过点击查看磁盘信息按钮可以查看磁盘的信息,其中包括显示磁盘总容量,剩余空间大小以及当中的文件总个数。通过饼图图示,显示所用空间和剩余空间的比例,帮助用户方便的了解磁盘空间的使用情况。二:存储模块:用户点击导入文件按钮,弹出导入文件对话框,可将指定路径的文件导入到内存磁盘中。三:读取模块:用户点击导出文件按钮,弹出导出文件对话框,可将内存磁盘中的文件导出到指定路径的真实的物理磁盘上。四:文件管理模块:对文件进行各种操作,包括查看,备份,重命名,删除等操作。用户只需点击相
4、应的按钮即可进行操作,无需以命令行的方式输入命令,方便快捷。 2.2用例分析通过对在上面进行测试的主机的硬件参数的考察和测试,因为是在虚拟机下ubuntu系统进行代码编写和运行的,收集到系统的内存大小只有512M,发现当为虚拟内存磁盘分配大小为256M的空间时,测试效果比较好。因此,在程序中,我们没有再允许用户输入所要分配的虚拟磁盘的大小,而是在程序初始化的时候就为其分配大小为256M的空间,每个内存块的大小设定为16K,然后程序初始化。之后用户可以进行各种模拟真实磁盘的操作,当用户点击退出程序按钮后,内存信息以及一些程序运行的一些参数都将保存到外部磁盘上,程序退出。第二章 项目总体设计:程序
5、大致划分为四个模块:磁盘状态显示模块、存储模块、读取模块、文件管理模块等。磁盘状态显示模块:显示磁盘当前的信息,包括磁盘总容量大小,剩余可用空间大小,磁盘中包含的文件个数。存储模块:当用户导入新文件或者对文件进行备份的时候,其中的数据都是要存储在内存虚拟磁盘中的。该模块的功能就是把用户导入或备份的数据通过一种合理(保证该文件数据不会被破坏掉)的方式分配到内存中。读取模块:把内存磁盘中的文件导出到用户指定路径的真实物理磁盘上,功能和创建文件类似。文件管理模块:实现对文件的查看,备份,重命名,删除等操作,因为我们建立的目录系统是一级目录,所以不提供创建文件夹的操作,而关于创建文件的操作实质上和从硬
6、盘上导入文件的操作是一样的,因此我们把创建文件并入到文件读取模块里。2.1基本功能:1. 显示磁盘信息(总容量,剩余可用空间,文件个数)2. 导入文件(支持把指定路径的物理磁盘中的文件导入到内存中)3. 导出文件(支持把内存中选定的文件导出到物理磁盘上指定路径的位置)4. 文件查看、备份、重命名、删除操作5. 文件搜索6. 关机备份,开机加载2.2目的和要求: 本课程设计的目的是设计一个基于内存的文件管理。以加强对内存系统和文件管理系统和理解,同时也可加深对linux操作系统的了解以及熟悉linux下的各种命令,并对linux下QT可视化编程有进一步了解和掌握。3. 详细设计3.1 程序整体框
7、架和主要算法在qt自动生成的窗口下通过添加控件并赋予每个控件一个实现方法来实现可视化操作,其中用到的一些算法主要有:1. 文件和内存空间分块解决外部碎片问题并实现空间的高效利用2. 在block类里定义一个标记用来进行对内存的分配和回收3. 使用一个带有指向每个文件头结点的链表来定位文件4. 用重写回的方法实现文件的修改操作3.2类的设计与声明/内存存储信息的块类的声明class blockpublic: block(int blocknum);/块的初始化 block(block &temp);/复制构造函数 void writedatain(char data);/往块里写数据 int g
8、etblocknum();/获得当前块的标识号 bool getisoccupied();/获得当前块是否被占用的标识 void setisoccupied(bool flag);/设置当前块的占用标识 void setblocknum(int i);/设置当前块的标识号 void setnextblock(int nextblock);/设置当前块指向的下一块 int getnextblock();/获得当前块指向的下一块号public: char datablocksize;/数组用于存放数据private: bool isoccupied;/块是否被占用的标识 int blocknum;
9、/ 块号 int netxblock;/当前块指向的下一块;/目录类的声明class dirpublic: dir();/目录类的构造函数 dir(QString parentId,QString fileId,QString childId);/带参数的目录类的构造函数 QString getfileId();/获得文件Id QString getparentId();/获得当前文件目录的上一级目录ID QString getchildId();/获得当前文件目录的下一级目录ID void setfileId(QString fileId);/设置文件ID void setfirstbloc
10、k(int firstblock);/设置文件所占块的第一块地址 int getfirstblock();/获得文件所占块的第一块 void setparentId(QString parentId);/设置当前文件目录的上一级目录 void setchildId(QString childId);/设置当前文件目录的下一级目录 void setoccupyblocks(int blocks);/设置该文件所占的总块数 int getoccupyblocks();/获得文件所占的总块数private: QString parentId;/当前文件目录的上一级目录 QString childId
11、;/当前文件目录的下一级目录 QString fileId;/当前文件目录的标识 int firstblock;/当前文件数据所存放的第一块 int occupyblocks;/当前文件所占的总块数;/ 窗口类,里面包含了一个用于存储文件数据的数组,和一个用于记录当前文件目录的数组,所有有关文件的操作的方法接口都是在这个类中实现的class Widget : public QWidgetQ_OBJECTpublic: explicit Widget(QWidget *parent = 0);/构造函数 void paintEvent(QPaintEvent *);/画图函数 void pain
12、t(QImage &image);/画图函数 QString getfilename(QString filename);/获取文件名 void setfilename();/设置当前每个Button控件对应的文件号和名字 void setfileIconButton();/设置每个Button控件的图标 void hidefilenamelabel();/隐藏标识文件名的label图标 void showfilenamelabel();/显示标识文件名的label图标 void hidefileIconButton();/隐藏标识文件名的Button图标 void showfileIconB
13、utton();/显示标识文件爱你名的Button图标 void showfileOpButton();/显示各种文件操作的Button控件 void hidefileOpButton();/隐藏各种文件操作的Button控件 void clearlabeltext();/清除标识文件名的label 图标 void hidefileIconAtI(int i);/ void savadata();/存储数据 Widget();private slots: void on_fileInButton_clicked();/导入文件Button控件点击时执行的操作 void on_HInfoButt
14、on_clicked();/显示文件信息Button控件点击时执行的操作 void on_enterHButton_clicked();/进入H盘 void on_exitButton_clicked();/退出该系统 void on_fileOutButton_clicked();/导出文件/绑定文件的Button按钮点击时执行的操作 void on_fileIconButton1_clicked();/ void on_fileIconButton2_clicked();/ void on_fileIconButton3_clicked();/ void on_fileIconButton
15、4_clicked();/ void on_fileIconButton5_clicked();/ void on_fileIconButton6_clicked();/ void on_fileIconButton7_clicked();/ void on_fileIconButton8_clicked();/ void on_fileIconButton9_clicked();/对文件进行查看 ,备份,重命名,删除时执行的操作 void on_filemodifyButton_clicked();/ void on_filecopyButton_clicked();/ void on_fi
16、ledeleteButton_clicked();/ void on_filerenameButton_clicked();/ void on_surefilerenameButton_clicked();/ void on_cancelfilerenameButton_clicked();/所搜文件 和取消搜索文件 void on_searchSureButton_clicked();/ void on_searchCancelButton_clicked();/private: Ui:Widget *ui;/ block *memory1024*16;/该程序的用于真是存放数据的内存,用c
17、har型数据来存放数据 dir *root1024;/目录类数据 float totaldmem;/当前内存磁盘的总大小 float freemem;/当前内存磁盘可用大小 int occupyblocknum;/内存数据中被占用的块数 QImage image;/ int filenum;/记录当前内存磁盘的文件个数 QString currentPath;/当前目录路径 QPixmap *fileImg;/ QString chosefile;/当前选择的文件 int clickButtonId;/public: QString Dialogfilename;/ QString Dialo
18、gfilesize;/ QString Dialogfirstblock;/;3.3程序流程图 1.主程序流程图2.导入文件流程图3.导出文件流程图4.查看、修改文件流程图5.备份文件流程图第四章 实验内容:4.1实验环境:操作系统:linux 编译软件:qt creatorQt creator简介:Qt Creator是跨平台的 Qt IDE, Qt Creator 是 Qt 被 Nokia 收购后推出的一款新的轻量级集成开发环境(IDE)。此 IDE 能够跨平台运行,支持的系统包括 Linux(32 位及 64 位)、Mac OS X 以及 Windows。根据官方描述,Qt Creato
19、r 的设计目标是使开发人员能够利用 Qt 这个应用程序框架更加快速及轻易的完成开发任务。功能和优势:QtCreator 主要是为了帮助新 Qt 用户更快速入门并运行项目,还可提高有经验的 Qt 开发人员的工作效率。使用强大的 C+ 代码编辑器可快速编写代码;语法标识和代码完成功能输入时进行静态代码检验以及提示样式上下文相关的帮助代码折叠括号匹配和括号选择模式高级编辑功能 ;使用浏览工具管理源代码;集成了领先的版本控制软件,包括 Git、Perforce 和 Subversion开放式文件,无须知晓确切的名称或位置搜索类和文件跨不同位置或文件沿用符号在头文件和源文件,或在声明和定义之间切换;为
20、Qt跨平台开发人员的需求而量身定制;集成了特定于 Qt 的功能,如信号与槽 (Signals & Slots)图示调试器, 对 Qt 类结构可一目了然集成了 Qt Designer 可视化布局和格式构建器只需单击一下就可生成和运行 Qt 项目。基于qt的这些优点,我们选择它作为我们在linux下编写程序的一个平台。4.2运行要求: 程序是建立在linux/qt环境下的,要求有一定量的可支配内存空间,以保证程序能正常运行。4.3核心代码:/block.cpp#include block.h#includeblock:block(int blocknum) this-isoccupied = fa
21、lse; for(int i=0;idatai = 0; this-blocknum = blocknum; this-netxblock = -1;int block:getnextblock() return this-netxblock;void block:setblocknum(int i) this-blocknum = i;block:block(block &temp) this-blocknum = temp.blocknum; this-isoccupied = temp.isoccupied; this-netxblock = xblock; this-writedata
22、in(temp.data);void block:setisoccupied(bool flag) this-isoccupied = flag;void block:setnextblock(int nextblock) this-netxblock = nextblock;int block:getblocknum() return blocknum;bool block:getisoccupied() return this-isoccupied;void block:writedatain(char data) strcpy(this-data,data);/dir.cpp#inclu
23、de dir.hdir:dir() this-parentId = H:/; this-childId = -1; this-fileId = -1; this-firstblock = -1; this-occupyblocks = 0;int dir:getfirstblock() return this-firstblock;void dir:setparentId(QString parentId) this-parentId = parentId;void dir:setchildId(QString childId) this-childId = childId;void dir:
24、setoccupyblocks(int blocks) this-occupyblocks = blocks;int dir:getoccupyblocks() return this-occupyblocks;dir:dir(QString parentId, QString fileId, QString childId) this-parentId = parentId; this-childId = childId; this-fileId = fileId;void dir:setfirstblock(int firstblock) this-firstblock = firstbl
25、ock;QString dir:getfileId() return this-fileId;QString dir:getparentId() return this-parentId;QString dir:getchildId() return this-childId;void dir:setfileId(QString fileId) this-fileId = fileId;/ / Widget.cpp文件,里面包含了所有可视化操作的实现方法#include widget.h#include ui_widget.h#include#include#include#include#i
26、nclude#include#include#includefileinfodialog.h#include#includeWidget:Widget(QWidget *parent) : QWidget(parent), ui(new Ui:Widget) QTextCodec:setCodecForLocale(QTextCodec:codecForName(utf8); QTextCodec:setCodecForCStrings(QTextCodec:codecForName(utf8); QTextCodec:setCodecForTr(QTextCodec:codecForName
27、(utf8); ui-setupUi(this); this-currentPath = H:/; ui-label_filename1-setText(); ui-label_filename2-setText(); ui-label_filename3-setText(); ui-label_filename4-setText(); ui-label_filename5-setText(); ui-label_filename6-setText(); ui-label_filename7-setText(); ui-label_filename8-setText(); ui-label_f
28、ilename9-setText(); ui-fileIconButton1-hide(); ui-fileIconButton2-hide(); ui-fileIconButton3-hide(); ui-fileIconButton4-hide(); ui-fileIconButton5-hide(); ui-fileIconButton6-hide(); ui-fileIconButton7-hide(); ui-fileIconButton8-hide(); ui-fileIconButton9-hide(); ui-filenametextEdit-hide(); ui-filere
29、nameButton-hide(); ui-surefilerenameButton-hide(); ui-cancelfilerenameButton-hide(); this-hidefileOpButton(); this-clickButtonId = -1; ui-label_searchfile-hide(); ui-searchfileEdit-hide(); ui-searchSureButton-hide(); ui-searchCancelButton-hide(); for(int i = 0;imemoryi = new block(i); for(int i = 0;
30、irooti = new dir(); this-chosefile = ; this-fileImg = new QPixmap(:/Icon.JPG); FILE* fp; fp = fopen(system,rb); char data1024*16; if(fp != NULL) fread(&this-totaldmem,sizeof(float),1,fp); fread(&this-freemem,sizeof(float),1,fp); fread(&this-occupyblocknum,sizeof(int),1,fp); bool isoccupied; int bloc
31、knum; int nextblock; for(int i = 0;imemoryi-data,data); this-memoryi-setblocknum(blocknum); this-memoryi-setisoccupied(isoccupied); this-memoryi-setnextblock(nextblock); QFile dirfileId(dirfileId); dirfileId.open(QIODevice:ReadOnly | QIODevice:Text); QTextStream in(&dirfileId); QString fileId,parent
32、Id,childId; fp = fopen(dirintdata,rb); int firstblock; int occupyblocks; this-filenum = 0; for(int i = 0;i fileId; if(fileId != -1) filenum+; inparentId; inchildId; this-rooti-setfileId(fileId); this-rooti-setparentId(parentId); this-rooti-setchildId(childId); fread(&firstblock,sizeof(int),1,fp); fr
33、ead(&occupyblocks,sizeof(int),1,fp); this-rooti-setfirstblock(firstblock); this-rooti-setoccupyblocks(occupyblocks); else this-filenum = 0; this-totaldmem = 1024*256; this-freemem = this-totaldmem; this-occupyblocknum = 0; ui-label_filenum-setText(tr(%1).arg(filenum); ui-HInfoButton-hide(); ui-fileI
34、nButton-hide(); ui-fileOutButton-hide(); image =QImage(800,600,QImage:Format_ARGB32); image.fill(qRgb(255,255,255); paint(image);/存储数据函数,其中保存各个块以及目录数据中的各项数据void Widget:savadata() FILE *fp; fp = fopen(system,wb); fwrite(&this-totaldmem,sizeof(float),1,fp); fwrite(&this-freemem,sizeof(float),1,fp); fw
35、rite(&this-occupyblocknum,sizeof(int),1,fp); int blocknum,nextblock; bool isoccupied; for(int i = 0;imemoryi-getblocknum(); isoccupied = this-memoryi-getisoccupied(); nextblock = this-memoryi-getnextblock(); fwrite(&this-memoryi-data,1024*16*sizeof(char),1,fp); fwrite(&blocknum,sizeof(int),1,fp); fw
36、rite(&isoccupied,sizeof(bool),1,fp); fwrite(&nextblock,sizeof(int),1,fp); fp = fopen(dirintdata,wb); QFile dirfileId(dirfileId); if(!dirfileId.open(QIODevice:WriteOnly | QIODevice:Text) return; QTextStream in(&dirfileId); QString fileId,parentId,childId; int firstblock,occupyblocks; for(int i = 0; i
37、 rooti-getfileId(); parentId = this-rooti-getparentId(); childId = this-rooti-getchildId(); infileIdendl; inparentIdendl; inchildIdrooti-getfirstblock(); occupyblocks = this-rooti-getoccupyblocks(); fwrite(&firstblock,sizeof(int),1,fp); fwrite(&occupyblocks,sizeof(int),1,fp); /隐藏文件操作按钮void Widget:hi
38、defileOpButton() ui-filemodifyButton-hide(); ui-filecopyButton-hide();/ ui-filemoveButton-hide(); ui-filedeleteButton-hide(); ui-filerenameButton-hide();/显示各类文件操作按钮void Widget:showfileOpButton() ui-filemodifyButton-show(); ui-filecopyButton-show();/ ui-filemoveButton-show(); ui-filedeleteButton-show(); ui-filerenameButton-show();/画窗体的背景void Widget: