大连理工大学软件学院课程设计.docx
《大连理工大学软件学院课程设计.docx》由会员分享,可在线阅读,更多相关《大连理工大学软件学院课程设计.docx(57页珍藏版)》请在冰豆网上搜索。
大连理工大学软件学院课程设计
大连理工大学
软件学院
课程设计报告
设计名称:
网络安全设计与编程
数据库课程设计
设计题目:
linux下基于内存的虚拟文件系统设计与实现
学生学号:
专业班级:
网络1001班
学生成绩:
指导教师:
课题时间:
2013.6.18至2013.7.19
摘要
近几年来,计算机的CPU、内存和显卡等主要配件的性能都提升得很快,而与之相对应的磁盘系统性能正越来越严重地成为整个电脑系统性能提升的瓶颈。
故将一部分内存拿出做虚拟磁盘,并在虚拟磁盘上实施文件管理系统,以加快文件的管理速度,并方便用户进行各种用户操作。
基于内存的文件管理系统,顾名思义,就是将一部分内存拿出来当硬盘用,可以极大的提高在其上进行的文件访问的速度。
。
关键词:
虚拟内存磁盘文件管理系统linux/qt/C++
第一章课题背景
1.1课题实现的背景及意义
第二章项目总体设计
2.1基本功能
2.2目的和要求
第3章详细设计
3.1程序整体框架和主要算法
3.2类的设计与声明
3.3程序流程图
第四章实验内容
4.1运行环境
4.2运行要求
4.3核心代码
第5章设计结果与分析
总结
参考文献
第一章课题背景:
1,需求概述
近年来,随着操作系统内存容量的不断地增加,然而相当一部分的操作系统内存却是浪费了。
为此出现了虚拟硬盘的概念,希望能借此实现不同情况的磁盘转储和合理利用内存。
由于操作系统的虚拟内存很大,因此可以利用这些内存开辟一块空间作为虚拟磁盘。
在此虚拟硬盘上,进行模拟Windows文件管理系统的对系统之中的真实的文件的管理。
我们采用linux/qt作为我们的开发环境,并实现了可视化界面,所有操作无需输入命令,而是通过点击按钮实现相应的功能。
2,需求分析
2.1需求理解与模块图
对用户需求的理解:
该模拟文件系统包括四大模块:
磁盘状态显示模块、存储模块、读取模块、文件管理模块。
一:
磁盘状态显示模块:
通过点击查看磁盘信息按钮可以查看磁盘的信息,其中包括显示磁盘总容量,剩余空间大小以及当中的文件总个数。
通过饼图图示,显示所用空间和剩余空间的比例,帮助用户方便的了解磁盘空间的使用情况。
二:
存储模块:
用户点击导入文件按钮,弹出导入文件对话框,可将指定路径的文件导入到内存磁盘中。
三:
读取模块:
用户点击导出文件按钮,弹出导出文件对话框,可将内存磁盘中的文件导出到指定路径的真实的物理磁盘上。
四:
文件管理模块:
对文件进行各种操作,包括查看,备份,重命名,删除等操作。
用户只需点击相应的按钮即可进行操作,无需以命令行的方式输入命令,方便快捷。
2.2用例分析
通过对在上面进行测试的主机的硬件参数的考察和测试,因为是在虚拟机下ubuntu系统进行代码编写和运行的,收集到系统的内存大小只有512M,发现当为虚拟内存磁盘分配大小为256M的空间时,测试效果比较好。
因此,在程序中,我们没有再允许用户输入所要分配的虚拟磁盘的大小,而是在程序初始化的时候就为其分配大小为256M的空间,每个内存块的大小设定为16K,然后程序初始化。
之后用户可以进行各种模拟真实磁盘的操作,当用户点击退出程序按钮后,内存信息以及一些程序运行的一些参数都将保存到外部磁盘上,程序退出。
第二章项目总体设计:
程序大致划分为四个模块:
磁盘状态显示模块、存储模块、读取模块、文件管理模块等。
磁盘状态显示模块:
显示磁盘当前的信息,包括磁盘总容量大小,剩余可用空间大小,磁盘中包含的文件个数。
存储模块:
当用户导入新文件或者对文件进行备份的时候,其中的数据都是要存储在内存虚拟磁盘中的。
该模块的功能就是把用户导入或备份的数据通过一种合理(保证该文件数据不会被破坏掉)的方式分配到内存中。
读取模块:
把内存磁盘中的文件导出到用户指定路径的真实物理磁盘上,功能和创建文件类似。
文件管理模块:
实现对文件的查看,备份,重命名,删除等操作,因为我们建立的目录系统是一级目录,所以不提供创建文件夹的操作,而关于创建文件的操作实质上和从硬盘上导入文件的操作是一样的,因此我们把创建文件并入到文件读取模块里。
2.1基本功能:
1.显示磁盘信息(总容量,剩余可用空间,文件个数)
2.导入文件(支持把指定路径的物理磁盘中的文件导入到内存中)
3.导出文件(支持把内存中选定的文件导出到物理磁盘上指定路径的位置)
4.文件查看、备份、重命名、删除操作
5.文件搜索
6.关机备份,开机加载
2.2目的和要求:
本课程设计的目的是设计一个基于内存的文件管理。
以加强对内存系统和文件管理系统和理解,同时也可加深对linux操作系统的了解以及熟悉linux下的各种命令,并对linux下QT可视化编程有进一步了解和掌握。
3.详细设计
3.1程序整体框架和主要算法
在qt自动生成的窗口下通过添加控件并赋予每个控件一个实现方法来实现可视化操作,其中用到的一些算法主要有:
1.文件和内存空间分块解决外部碎片问题并实现空间的高效利用
2.在block类里定义一个标记用来进行对内存的分配和回收
3.使用一个带有指向每个文件头结点的链表来定位文件
4.用重写回的方法实现文件的修改操作
3.2类的设计与声明
//内存存储信息的块类的声明
classblock
{
public:
block(intblocknum);//块的初始化
block(block&temp);//复制构造函数
voidwritedatain(chardata[]);//往块里写数据
intgetblocknum();//获得当前块的标识号
boolgetisoccupied();//获得当前块是否被占用的标识
voidsetisoccupied(boolflag);//设置当前块的占用标识
voidsetblocknum(inti);//设置当前块的标识号
voidsetnextblock(intnextblock);//设置当前块指向的下一块
intgetnextblock();//获得当前块指向的下一块号
public:
chardata[blocksize];//数组用于存放数据
private:
boolisoccupied;//块是否被占用的标识
intblocknum;//块号
intnetxblock;//当前块指向的下一块
};
//目录类的声明
classdir
{
public:
dir();//目录类的构造函数
dir(QStringparentId,QStringfileId,QStringchildId);//带参数的目录类的构造函数
QStringgetfileId();//获得文件Id
QStringgetparentId();//获得当前文件目录的上一级目录ID
QStringgetchildId();//获得当前文件目录的下一级目录ID
voidsetfileId(QStringfileId);//设置文件ID
voidsetfirstblock(intfirstblock);//设置文件所占块的第一块地址
intgetfirstblock();//获得文件所占块的第一块
voidsetparentId(QStringparentId);//设置当前文件目录的上一级目录
voidsetchildId(QStringchildId);//设置当前文件目录的下一级目录
voidsetoccupyblocks(intblocks);//设置该文件所占的总块数
intgetoccupyblocks();//获得文件所占的总块数
private:
QStringparentId;//当前文件目录的上一级目录
QStringchildId;//当前文件目录的下一级目录
QStringfileId;//当前文件目录的标识
intfirstblock;//当前文件数据所存放的第一块
intoccupyblocks;//当前文件所占的总块数
};
//窗口类,里面包含了一个用于存储文件数据的数组,和一个用于记录当前文件目录的数组,所有有关文件的操作的方法接口都是在这个类中实现的
classWidget:
publicQWidget
{
Q_OBJECT
public:
explicitWidget(QWidget*parent=0);//构造函数
voidpaintEvent(QPaintEvent*);//画图函数
voidpaint(QImage&image);//画图函数
QStringgetfilename(QStringfilename);//获取文件名
voidsetfilename();//设置当前每个Button控件对应的文件号和名字
voidsetfileIconButton();//设置每个Button控件的图标
voidhidefilenamelabel();//隐藏标识文件名的label图标
voidshowfilenamelabel();//显示标识文件名的label图标
voidhidefileIconButton();//隐藏标识文件名的Button图标
voidshowfileIconButton();//显示标识文件爱你名的Button图标
voidshowfileOpButton();//显示各种文件操作的Button控件
voidhidefileOpButton();//隐藏各种文件操作的Button控件
voidclearlabeltext();//清除标识文件名的label图标
voidhidefileIconAtI(inti);//
voidsavadata();//存储数据
~Widget();
privateslots:
voidon_fileInButton_clicked();//导入文件Button控件点击时执行的操作
voidon_HInfoButton_clicked();//显示文件信息Button控件点击时执行的操作
voidon_enterHButton_clicked();//进入H盘
voidon_exitButton_clicked();//退出该系统
voidon_fileOutButton_clicked();//导出文件
//绑定文件的Button按钮点击时执行的操作
voidon_fileIconButton1_clicked();//
voidon_fileIconButton2_clicked();//
voidon_fileIconButton3_clicked();//
voidon_fileIconButton4_clicked();//
voidon_fileIconButton5_clicked();//
voidon_fileIconButton6_clicked();//
voidon_fileIconButton7_clicked();//
voidon_fileIconButton8_clicked();//
voidon_fileIconButton9_clicked();//
//对文件进行查看,备份,重命名,删除时执行的操作
voidon_filemodifyButton_clicked();//
voidon_filecopyButton_clicked();//
voidon_filedeleteButton_clicked();//
voidon_filerenameButton_clicked();//
voidon_surefilerenameButton_clicked();//
voidon_cancelfilerenameButton_clicked();//
//所搜文件和取消搜索文件
voidon_searchSureButton_clicked();//
voidon_searchCancelButton_clicked();//
private:
Ui:
:
Widget*ui;//
block*memory[1024*16];//该程序的用于真是存放数据的内存,用char型数据来存放数据
dir*root[1024];//目录类数据
floattotaldmem;////当前内存磁盘的总大小
floatfreemem;//当前内存磁盘可用大小
intoccupyblocknum;//内存数据中被占用的块数
QImageimage;//
intfilenum;//记录当前内存磁盘的文件个数
QStringcurrentPath;//当前目录路径
QPixmap*fileImg;//
QStringchosefile;//当前选择的文件
intclickButtonId;//
public:
QStringDialogfilename;//
QStringDialogfilesize;//
QStringDialogfirstblock;//
};
3.3程序流程图
1.主程序流程图
2.导入文件流程图
3.导出文件流程图
4.查看、修改文件流程图
5.备份文件流程图
第四章实验内容:
4.1实验环境:
操作系统:
linux
编译软件:
qtcreator
Qtcreator简介:
QtCreator是跨平台的QtIDE,QtCreator是Qt被Nokia收购后推出的一款新的轻量级集成开发环境(IDE)。
此IDE能够跨平台运行,支持的系统包括Linux(32位及64位)、MacOSX以及Windows。
根据官方描述,QtCreator的设计目标是使开发人员能够利用Qt这个应用程序框架更加快速及轻易的完成开发任务。
功能和优势:
QtCreator主要是为了帮助新Qt用户更快速入门并运行项目,还可提高有经验的Qt开发人员的工作效率。
使用强大的C++代码编辑器可快速编写代码;语法标识和代码完成功能输入时进行静态代码检验以及提示样式上下文相关的帮助代码折叠括号匹配和括号选择模式高级编辑功能;使用浏览工具管理源代码;集成了领先的版本控制软件,包括Git、Perforce和Subversion开放式文件,无须知晓确切的名称或位置搜索类和文件跨不同位置或文件沿用符号在头文件和源文件,或在声明和定义之间切换;为Qt跨平台开发人员的需求而量身定制;集成了特定于Qt的功能,如信号与槽(Signals&Slots)图示调试器,对Qt类结构可一目了然集成了QtDesigner可视化布局和格式构建器只需单击一下就可生成和运行Qt项目。
基于qt的这些优点,我们选择它作为我们在linux下编写程序的一个平台。
4.2运行要求:
程序是建立在linux/qt环境下的,要求有一定量的可支配内存空间,以保证程序能正常运行。
4.3核心代码:
//block.cpp
#include"block.h"
#include
block:
:
block(intblocknum)
{
this->isoccupied=false;
for(inti=0;ithis->data[i]='\0';
this->blocknum=blocknum;
this->netxblock=-1;
}
intblock:
:
getnextblock()
{
returnthis->netxblock;
}
voidblock:
:
setblocknum(inti)
{
this->blocknum=i;
}
block:
:
block(block&temp)
{
this->blocknum=temp.blocknum;
this->isoccupied=temp.isoccupied;
this->netxblock=xblock;
this->writedatain(temp.data);
}
voidblock:
:
setisoccupied(boolflag)
{
this->isoccupied=flag;
}
voidblock:
:
setnextblock(intnextblock)
{
this->netxblock=nextblock;
}
intblock:
:
getblocknum()
{
returnblocknum;
}
boolblock:
:
getisoccupied()
{
returnthis->isoccupied;
}
voidblock:
:
writedatain(chardata[])
{
strcpy(this->data,data);
}
//dir.cpp
#include"dir.h"
dir:
:
dir()
{
this->parentId="H:
/";
this->childId="-1";
this->fileId="-1";
this->firstblock=-1;
this->occupyblocks=0;
}
intdir:
:
getfirstblock()
{
returnthis->firstblock;
}
voiddir:
:
setparentId(QStringparentId)
{
this->parentId=parentId;
}
voiddir:
:
setchildId(QStringchildId)
{
this->childId=childId;
}
voiddir:
:
setoccupyblocks(intblocks)
{
this->occupyblocks=blocks;
}
intdir:
:
getoccupyblocks()
{
returnthis->occupyblocks;
}
dir:
:
dir(QStringparentId,QStringfileId,QStringchildId)
{
this->parentId=parentId;
this->childId=childId;
this->fileId=fileId;
}
voiddir:
:
setfirstblock(intfirstblock)
{
this->firstblock=firstblock;
}
QStringdir:
:
getfileId()
{
returnthis->fileId;
}
QStringdir:
:
getparentId()
{
returnthis->parentId;
}
QStringdir:
:
getchildId()
{
returnthis->childId;
}
voiddir:
:
setfileId(QStringfileId)
{
this->fileId=fileId;
}
////Widget.cpp文件,里面包含了所有可视化操作的实现方法
#include"widget.h"
#include"ui_widget.h"
#include
#include
#include
#include
#include
#include
#include
#include"fileinfodialog.h"
#include
#include
Widget:
:
Widget(QWidget*parent):
QWidget(parent),
ui(newUi:
:
Widget)
{
QTextCodec:
:
setCodecForLocale(QTextCodec:
:
codecForName("utf8"));
QTextCodec:
:
setCodecForCStrings(QTextCodec:
:
codecForName("utf8"));
QTextCodec:
:
setCodecForTr(QTextCodec:
:
codecForName("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_filename9->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->filerenameButton->hide();
ui->surefilerenameButton->hide();
ui->cancelfilerenameButton->hide();
this->hidefileOpButton();
this->clickButtonId=-1;
ui->label_searchfile->hide();
ui->searchfileEdit->hide();
ui->searchSureButton->hide();
ui->searchCancelButton