最近做了一个虚拟磁盘管理软件,其实也就是类似于在内存当中模仿一个dos对文件夹以及文件的管理功能,从做需求到设计到代码实现 前后在半个多月左右吧,今天刚搞完,这里写一下对这个玩意的一些心得。
这里给出以下简单的需求说明:
好,先说说 我最开始的数据结构设计吧,刚开始我用的双链表的数据结构,实际上在后期设计上就会感觉到,这个数据结构 虽然在单层操作上具有不错的能力,但是在层次遍历,以及层次删除添加上面 有一些捉襟见肘
然后在后期,我换成了组合模式,相信用过迭代器的同学应该会了解这个,这个设计结构具有很好的迭代浏览效果
然后在程序的总体架构上,我采用了命令模式的方式,并且在这上面给出了改进,因为这个我们是一个单命令执行的过程,在控制器上我把它构造成为了一个单例,在命令上面,用虚类继承的方式来实现了命令的多台执行问题,这样我们就可以吧命令的实现与控制器的执行解耦,相信了解面向对象的同学应该了解,这样的好处就让我们在未来添加新的命令的时候可以构建新的实现命令对象。
类图:
然后后面的具体每个命令的算法 可以查看我的相册里面 看到
这里我再给出一些具体的代码实现部分(这里我同时用了C++和C# 因为中途要求换了平台开发,这里大家看看具体算法流程就行了)
首先是自行构造的命令字符串的部分(因为我们需要将我们命令输入的字符串分割信息出来)
MyString
主要给出分割命令部分的代码
//函数将字符串分类出命令内容并且保存
void MyString::CheckAndMakecmd(void)
{
char* phead=m_date;
if(phead==NULL)
{
cout<<"您没有输入命令!"<<endl;
return;
}
if(ishascheck)
{
cout<<"您的命令行已经被分割过了!";
return;
}
int i=0;
command[0]='\0';
str1[0]='\0';
str2[0]='\0';
//检查字符串开头是否有空格
while(*phead==' ' && *phead!='\0')
{
phead++;
}
//搜索命令
while(*phead!=' ' && *phead!='\0')
{
command[i]=*phead;
i++;
phead++;
}
command[i]='\0';
// 搜索第一个参数
//跳过空格
while(*phead==' ' && *phead!='\0')
{
phead++;
}
i=0;
//搜索 如果遇到空格就停止
while(*phead!=' ' && *phead!='\0')
{
str1[i]=*phead;
i++;
phead++;
}
str1[i]='\0';
//搜索第二个参数
while(*phead==' ' && *phead!='\0')
{
phead++;
}
i=0;
while(*phead!=' ' && *phead!='\0')
{
str2[i]=*phead;
i++;
phead++;
}
str2[i]='\0';
ishascheck=true;
//设置命令模式(分为三种,只有命令,带一个参数,带两个参数)
if(str2[0]!='\0')
Command_Type=2;
else if(str1[0]!='\0')
Command_Type=1;
else if(command[0]!='\0')
Command_Type=0;
else
Command_Type=-1;
}
这里是命令控制器部分的
执行代码:
SimppleRemoteControl
cdCommand (cd命令跳转部分)
compareCommand(compare 命令)
比较文件字节流部分代码 输出不同部分的前16字节
copyCommand(copy硬盘中文本文件到虚拟磁盘中)
del命令(删除虚拟磁盘文件)
dir命令(dir显示目录)
mkdir命令(mkdir创建文件夹和文件)
rmdir删除文件夹
哈哈 OK 介绍完毕了 后面再附上一些 平时测试的功能的截图吧, 其实也就是类似一个DOS的命令管理磁盘系统
最后添加一个项目资源包:http://download.csdn.net/detail/langkexiaoyi/4969262 设计文档和完整代码都在里面
最后签个名
王静逸
2012年12月25日
QQ:283413152