程序和文件快速打开工具
Harbin Institute of Technology at Harbin Institute of Technology at Weihai Weihai
数据结构课程设计报告 数据结构课程设计报告
设计
目, 程序和文件快速打开工具
院 系, 计算机科学与技术学院
班 级, 0804102
学 号,080410227 080410228 080410206 080410226
设 计 者, 康龙彪 朱虹宇 连思思 刘宗仁
哈尔滨工业大学,威海,
II
前 言
数据结构是计算机专业的必修和主干课程之一,它旨在使学生学会分析研究数据对象的特性,学会数据的组织
,以便选择合适的数据逻辑结构和存储结构,以及相应的运算(操作),把现实世界中的问题转化为计算机内部的表示和处理,这是一个良好的程序设计技能训练的过程。在整个教学或学习过程中,解决实际问题的能力和技巧的训练是一个重要的环节。
本课题设计要求学生分组进行(每组2-4人),自行选题,选题的思想是根据实际需要进行调研,以组为单位提交课程设计任务书,给出所选项目的背景和意义,由导师确定选题的级别,主要是以实用性为主,开发一个具有实际价值的项目,经过2周的课程设计后接受课程设计组老师的结题验收。
教师评语:
I
成 绩:
哈尔滨工业大学(威海)数据结构课程设计任务
书
院(系): 计算机科学与技术学院 专 业:计算机科学技术
姓 名: 杨春程 肖福坤
学 号:090410311 090410315
课程设计题目:新型USB冗杂文件管理秘书
II
问题阐述与分析:
设计题目背景:
随着电脑在日常生活、工作中用到的越来越广泛,作用越来越大。电脑用多了,上网多了,看到有价值的文档,大家一般都会有保存下来的冲动,时间久了U盘里面一定充斥这各种各样曾今有价值或者至今仍有价值的文件。但是存储空间通常都是被一些不经常使用,或者一次性的新建文档所占据。为了清理空间我们在不知道文件使用频率的前提下,不得不对每个文件依次查看,确定是否这些文件是否有价值。这样白白的浪费了大量的宝贵时间。为了找到自己所需要的某一篇重要文档或者急需使用软件,我们不得不耗费大量的时间逐一查找。该课程设计所要开发的小工具就是帮助我们解决这些问题。
摆渡攻击的工具是摆渡木马,它是一种特殊的木马,其感染机制与u盘病毒的传播机制完全一样,只是感染目标计算
III
机后,它会尽量隐蔽自己的踪迹,不会出现普通 u盘病毒感染后的症状,如更改盘符图标,破坏系统数据,在弹出菜单中添加选项等,它唯一的动作就是扫描系统中的文件数据,利用关键字匹配等手段将敏感文件悄悄写回u盘中,一旦这个u盘再插入到连接互联网的计算机上,就会将这些敏感文件自动发送到互联网上指定的计算机中。摆渡木马是一种间谍人员定制的木马,隐蔽性、针对性很强,一般只感染特定的计算机, 普通杀毒软件和木马查杀工具难以及时发现,对用户的私密信息危害重大。
而当今尚未有特别有效的解决方法,大多解决措施为监控恶意进程来检查U盘是否感染摆渡木马,本软件则通过监控U盘文件的操作变化,通过查看监控记录,来判断是否感染摆渡木马。从而减少的用户电脑中私密文件的泄露。
设计实现意义:
IV
该软件能够让你快速查找定位并打开想使用的各种文件。可以人性化的帮助用户整理不经常使用的文件,使用该工具可以使你在电脑上的学习、工作更加有效率,有更好的使用体验。辅助杀毒软件,减少的用户电脑中私密文件的泄露。 解决的主要问题:
1、 在安装应用程序较多的情况下,通过输
入关键字实现特定程序的查找定位和快
速启动;
2、 在实现启动程序的同时,实现对
windows控制面板中系统功能的快速调
用;
3、 指定存放常用文档的目录和常用文档
类型,在文档较多的情况下,通过输入
关键字查找定位文档并快速打开; 4、 在此基础上,考虑拓展功能如下:
1) 通过预先输入常用网站列表或者扫
描网页收藏夹,在输入网站关键字时
快速打开网页;
2) 实现界面的换肤功能,具有更好的用
V
户体验;
3)将文件搜索功能实现的更完整,将桌面搜索功能融入进去。
VI
工作量:
该程序功能大致可划分为以下几个部分:
1、 程序、系统功能、文件和网页信息索
引列表的建立,以及对于以上四种类型
实现不同的调用启动方式。
2、 当输入关键字时,字符的精确匹配的
实现,考虑使用正则表达式。
3、 多个皮肤动态更换的实现。
4、 考虑将基本框架和功能实现相分离,
将第一项四种类别的启动用插件的方式
实现,使该工具功能具有更好的可扩展
性。
该工具实现后,运行时以简洁美观的对话框呈现,当输入关键字时,程序自动将匹配最好的结果以列表的方式呈现,用户可选择正确的项目快速打开。
VII
工作计划安排:
第16周:前半周小组成员将开发环境配置好,该软件使用VS2008开发,为了实现版本控制,使小组成员更好的协作开发,在google code 上
项目托管,使用SVN服务进行版本控制;后半周查找资料,并作出软件各个功能模块的详细设计和详细分工,并在周末正式开始代码编写。
第17周:并行开发基本框架各个模块,在该周最后几天基本完成基本框架和各个模块的编写,开始整合调试程序。
第18周:前半周做界面的优化和程序的调试及完善;后半周整理程序文档,准备课程设计的验收。
VIII
同组设计者及分工:
康龙彪:1、程序整体框架的设计和实现,如插件和皮肤的接口实现;
2、基本功能类的设计和实现,如索引建立和程序、文件打开;
3、组织小组开发和组员的详细分工,协调小组成员的开发工作;
朱虹宇:1、具体插件的实现,即程序、
系统功能、文件和网页打开功能
的插件开发;
2、负责模块的调试工作;
连思思:1、程序界面的设计和美化,皮
肤的设计和实现;
2、与康龙彪共同负责软件整体
的调试;
3、程序开发文档的管理;
刘宗仁:1、IE和火狐浏览器网页收藏夹
搜索插件的实现;
IX
2、插件的调试工作。
X
哈尔滨工业大学(威海)课程设计报告
1( 项目研究背景与意义
设计题目背景:
随着电脑在日常生活、工作中用到的越来越广泛,作用越来越大,各种应用软件的数量增越来越快。如今我们为了不同的需要常常在电脑上装了很多软件,为了使用方便,经常可见桌面上堆满了快捷方式,但是这却使我们经常为找到要用的软件而苦心寻找图标或程序菜单。相似的情况也发生在文件的使用和管理中,我们经常会为不能快速自己想听的一首歌或是文档而烦恼。该课程设计所要开发的小工具就是帮助我们解决这些问题。 设计实现意义:
该软件能够让你快速查找定位并打开想使用的应用程序和系统功能,并且可以指定存放文档的目录和文档类型,实现文档的快速查找和打开,以实现轻量级桌
1
哈尔滨工业大学(威海)课程设计报告
面搜素的功能。使用该工具可以使你在电脑上的学习、工作更加有效率,有更好的使用体验。
2( 需求分析
程序设计流程很简单(但每个环节都不简单):
搜索磁盘(建立全盘文件记录文件) 建立索引 搜索索引 搜索结果处理 各个流程简介并用上的数据结构知识: ?1搜索磁盘:遍历全盘所有文件夹与文件,将每个文件(夹)的相关信息写到文件记录文件AllFile.dat里;一开始是用上递归遍历的算法,其实效率已经不错了,但后来改进了算法,采用非递归遍历方法,使用堆栈去管理文件目录来实现遍历。
?2建立索引:对AllFile.dat文件里面
2
哈尔滨工业大学(威海)课程设计报告
的每个文件记录按其某种信息(如文件名索引就以其各部分文件名,文本内容索引就以分词后得到关键词处理后)插进倒排表,然后将倒排表写一个索引文件里。为了减小索引文件读取,对索引文件建立一个查询的索引文件。这部分用到的知识是倒排表,树(分词时用到),链表(插倒排表时用到),散列表(即hash,在分词得到的关键词后用来处理关键词)。
?3搜索索引:按索引取回文件相关记录,流程如此:OffsetIndex DataIndex
AllFile.dat,说简单点就用小索引去查大索引,取到大索引部分信息后去查AllFile.dat,拿到符合条件的文件记录。这部分其实也用上建立索引的知识,而且很考文件读写操作(在对索引文件的深刻理解上)
3
哈尔滨工业大学(威海)课程设计报告
?4结果处理:要处理好才能与界面接上,在关键词与搜索和或搜索时也用上链表还有Set(集合,处理重复)等数据结构。
本程序功能可分成4个模块:分别为选项设置模块,文件搜索模块,文件监控模块,文件整理模块。下面根据用户的实际需求,分别对每个部分的所要所要实现的功能的具体要求:
3( 概要设计
1?倒排表:
假设有3篇文章,file1,file2,file3,文件内容如下:
file1 (单词1,单词2,单词3,单词4....) file2 (单词a,单词b,单词c,单词d....) file3 (单词1,单词a,单词3,单词d....)
4
哈尔滨工业大学(威海)课程设计报告
建立的倒排索引就是这个样子: 单词1 (file1,file3) 单词2 (file1)
单词3 (file1,file3) 单词a (file2, file3) ....
这就是倒排索引。
2?文件偏移
举AllFile.dat为例子,它其实是一个文本文件,里面每一行记录着一个文件或文件夹的信息
然后用二进制方式打开
5
哈尔滨工业大学(威海)课程设计报告
然后黄色就是第一行(即第一条记录),其偏移(在AllFile里)是: 0x00 然后绿色就是第二行(即第二条记录),其偏移(在AllFile里)是: 0x27 然后蓝色就是第三行(即第三条记录),其偏移(在AllFile里)是: 0x27 同理…………………………
0x68
同理…………………………
0x8B
好了,有了上面两个概念,那么就可以开始介绍索引文件是怎样写出来的了。
6
哈尔滨工业大学(威海)课程设计报告
1.首先是建立文件名索引
首先拿一AllFile.dat里一行记录,取出其文件名字(有大写都将其变为小写,对减小倒排表体积),然后拆分出一个个字母,将其处理一下(只有用了其ASCII码),然后把文件偏移插到倒排表里面,如我拿出第二行记录,他在AllFile.dat里的偏移是0x27(由上面知)
拿出他的名字Boot,变成小写boot,拆出一个个单词b、o、 o、t
ASCII码值为0x62 0x6F 0x6F 0x74
然后插表:(注意是插偏移值,重复的不用插)
……
……
0x62
……
7
哈尔滨工业大学(威海)课程设计报告
……
……
0x6F
……
……
……
0x74
……
……
然后再取第三行记录
他在AllFile.dat里的偏移是0x43(由上面知)
拿出他的名字Boot,变成小写boot,拆出一个个单词b、o、 o、t
ASCII码值为0x62 0x6F 0x6F 0x74
然后插表:(注意是插偏移值,重复的不用插)
8
哈尔滨工业大学(威海)课程设计报告
……
……
0x62
……
……
……
0x6F
……
……
……
0x74
……
……
同理取出第四条记录与第五记录分别是
boot与bootfont,插表后
9
哈尔滨工业大学(威海)课程设计报告 0x66
……
…… 0x62
……
……
……
0x6E
0x6F
……
……
……
0x74
……
……
如此就建立起来单字符索引,即每个文件
名里每个字符都插入倒排表里,但这样可
能到时搜索出来的结果会很多,所以我还
10
哈尔滨工业大学(威海)课程设计报告
建立双字符倒排表,但只用于字母与数字,但首先要用
将其转换一下值(有点类似hash原理)
首先将字符‘0’—‘9’换成整数1-10,将‘a’—‘z’换成整数11-36,大写也换成11-36,然后计算
twoCharID = (Char1-1)*36 +(Char2);
如刚才boot,取bo,值为12、25,计算值为(12-1)*36+25=421=0x1A5;取oo,算值为889=0x379……
再将文件偏移也插到倒排表里面。 建立双字符索引是为了保证搜索顺序(因为搜索时先搜索双字符)
至于中文每个字用两个字符也差不多原理了,实现细节注意一下,就变成编程问题了
2.其次是建立文本内容索引
11
哈尔滨工业大学(威海)课程设计报告
原理是一样的,不过插倒表时就先经过hash
处理,如
Hashbucket = Hash(分词分出的关键词) 然后也是把关键词所在的文本所在
AllFile.dat里的偏移(太拗口了)插进倒排表里
…………
…………
…… Hashbucket
…………
…………
Hash函数其实就是能过一连串计算将本来聚合在一起的值分散开来,我用的hash函数是将传进的字符串hash成一个整型值
unsigned long CreateTextIndex ::
lh_strhash(void *str)
12
哈尔滨工业大学(威海)课程设计报告
{
int i,l;
unsigned long ret=0;
unsigned short *s;
if (str == NULL) return(0);
l=(strlen((char*)str)+1)/2;
s=(unsigned short *)str;
for (i=0; i