C#多线程文件搜索软件设计含源文件毕业设计.docx
《C#多线程文件搜索软件设计含源文件毕业设计.docx》由会员分享,可在线阅读,更多相关《C#多线程文件搜索软件设计含源文件毕业设计.docx(58页珍藏版)》请在冰豆网上搜索。
C#多线程文件搜索软件设计含源文件毕业设计
(此文档为word格式,下载后您可任意编辑修改!
)
以下文档格式全部为word格式,下载后您可以任意修改编辑。
1绪论1
1.1本课题的意义1
1.2问题定义1
1.3可行性分析1
1.3.1经济可行性分析1
1.3.2技术可行性分析1
1.3.3用户使用可行性分析2
1.3.4论文的章节安排2
2开发技术及工具3
2.1.net和C#编程语言3
2.1.1NET框架3
2.1.2C#编程语言3
2.1.3.NET和C#的重要性5
2.2正则表达式和C#7
2.2.1正则表达式简介7
2.2.2C#对正则表达式的支持8
3需求分析10
3.1功能需求分析10
3.2环境需求分析11
3.2.1硬件环境需求11
3.2.2软件环境需求11
3.3用户界面需求分析11
4系统设计13
4.1程序的工作流程13
4.2遍历文件文件和文件夹算法的流程图14
4.3系统的用例图:
15
4.4程序用到的类和类之间的关系15
4.5序列图17
4.5本章小节18
5系统实现19
5.1主程序的界面功能实现19
5.2文件定位功能实现23
6软件测试27
6.1测试方案27
6.1.1测试方法概述27
6.1.2测试用例选取原则29
6.2测试系统29
6.3测试结论36
第7章与widows自带的搜索程序的性能比较37
7.1比较方案37
7.2比较结果:
37
7.3结果分析38
结束语40
谢辞41
参考文献42
附录A外文翻译-原文部分43
附录B外文翻译-译文部分48
1绪论
1.1本课题的意义
当今时代是飞速发展的信息时代,如今个人电脑已经普及到了千家万户,可以说人们的日常生活都离不开电脑。
人们每天都可以使用电脑来下载各种电影、歌曲以及使用各种软件来创建各种文件。
这样随着时间的增长,在电脑的硬盘上就保存了许多不同的文件。
当人们想再次查找某个文件的时候,往往就由于文件太多而在查找的过程中花费大量的时间。
在这种情况下,如果有一个智能的可以根据人们的需要快速的从大量的文件中查找出人们所需的文件的软件,就可以为人们节省许多实际,提高工作效率。
基于windows操作系统实现的多线程搜索程序软件就可以解决上述的问题。
使人们可以快速的查找自己想要的文件,给大家带来方便。
1.2问题定义
基于windows操作系统实现的多线程搜索程序软件可以搜索图片、音乐、视频、文档(文字处理、电子数据表等)以及其他格式的文件。
在搜索的时候可以建立搜索的条件可以根据文件的名字或者名字的一部分来查找同时可以输入其他的查找条件,如文件的创建日期、最后的访问日期、文件类型等。
本软件还有一个关键功能,即在按照要求查找到文件后的文件的定位,使用户能够方便快速的打开所要查找的文件。
本软件采用图形化界面和用户交互。
1.3可行性分析
1.3.1经济可行性分析
经济可行性分析主要是进行开发成本的估算及可能取得效益的评估,以确定待开发系统是否值得投资开发。
在开发成本的估算方面,由于这次所要开发的软件的规模是很小,所以开发成本要求不高。
在可能取得的效益评估方面,本软件的使用人群是个人使用电脑的用户,所以使用人群的数量是相当巨大的。
本软件的开发是为了方便人们查找保存在个人电脑上的文件。
这是每个使用个人电脑的用户都用得上的功能。
因此,本软件在经济上是可行的。
1.3.2技术可行性分析
技术可行性分析主要是对待开发的系统进行功能、性能和限制条件下分析,确定在现有的资源的条件下,系统是否能够实现。
本多线程搜索软件是基于Microsoft的windows操作系统进行开发的,在系统功能要求上不是很高。
C#编程语言提供了许多与windows操作系统的函数,同时它也提供了许多的windows控件以及支持正则表达式,使用这些控件就可以快速的编写出图形化用户交互界面。
由于软件开发过程中所需要的软硬件资源都具备了,以及.net的开发经验。
因此,系统开发在技术上是可行的。
1.3.3用户使用可行性分析
用户使用可行性分析主要是系统前台用户、后台管理用户对整个系统的使用情况分析。
随着计算机的普及,拥有一台属于自己的个人电脑已经不是什么新鲜的事物。
并且人们几乎每天都遇到过在大量的文件中查找自己想要的文件的情况。
本软件就具有快速搜索的功能,操作简单方便,界面简洁、美观大方、通用性好。
因此,在操作上也是可行的。
综上所述,在对系统进行了以上一系列的可行性分析之后,发现已经具备了开发的基础,且所用的技术成熟、完备,因此系统开发可立即开始。
1.3.4论文的章节安排
搜索器的开发周期分为需求分析、系统设计、系统实现、软件测试这四个阶段,论文就是根据这条主线来撰写,对这四个流程进行描述和总结。
首先为了使读者能更好的理解论文的内容,在接下来的一章节中,花了一定的篇幅来介绍开发搜索器中所使用的开发技术和开发工具。
然后在第三、四、五、六章节中将分别介绍需求分析、系统设计、系统实现、软件测试这四个阶段的开发过程。
最后第七章中介绍了windows操作系统上自带的搜索器和本搜索器在搜索性能上的比较,使读者对本搜索器有一个大概的了解。
2开发技术及工具
2.1.net和C#编程语言
2.1.1NET框架
NET框架是一个多语言组件开发和执行环境,它由以下三个主要部分组成:
公共语言运行时。
此名称不能准确反映它的全部功能。
实际上,公共语言运行时在组件的开发及运行过程中,都扮演着非常重要的角色。
在组件运行过程中,运行时负责管理内存分配、启动或删除线程和进程、实施安全性策略、同时满足当前组件对其它组件的需求。
在开发阶段,运行时的作用有些变化:
与现今的COM相比,运行时的自动化程度大为提高(比如可自动执行内存管理),因而开发人员的工作变得非常轻松。
尤其是,映射功能将锐减开发人员将业务逻辑程序转化成可复用组件的代码编写量。
对编程语言而言,运行时这个概念并不新奇:
实际上每种编程语言都有自己的运行时。
VisualBasic开发系统具有最为明显的运行时(名为VBRUN),VisualC++®跟VisualFoxPro®、Jscript®、SmallTalk、Perl、Python和Java一样有一个运行时,即MSVCRT。
.NET框架的关键作用在于,它提供了一个跨编程语言的统一编程环境,这也是它能独树一帜的根本原因。
统一的编程类。
.NET框架为开发人员提供了一个统一、面向对象、层次化、可扩展的类库集(API)。
现今,C++开发人员使用的是Microsoft基类库,Java开发人员使用的是Windows®基类库,而VisualBasic用户使用的又是VisualBasicAPI集。
只是简单地一用,.NET框架就统一了微软当前的各种不同类框架。
这样,开发人员无需学习多种框架就能顺利编程。
远不止于此的是,通过创建跨编程语言的公共API集,.NET框架可实现跨语言继承性、错误处理功能和调试功能。
实际上,从JScript到C++的所有编程语言,都是相互等同的,开发人员可以自由选择理想的编程语言。
活动服务器页面(ASP+)。
ASP+是使用.NET框架提供的编程类库构建而成的,它提供了Web应用程序模型,该模型由一组控件和一个基本结构组成。
有了它,Web应用程序的构建变得非常容易。
开发人员可以直接使用ASP+控件集,该控件集封装了公共的、用于超文本标识语言(HTML)用户界面的各种小器件(诸如文本框、下拉菜单等等)。
实际上,这些控件运行在Web服务器上,它们将用户界面转换成HTML格式后再发送给浏览器。
在服务器上,控件负责将面向对象的编程模型提供给Web开发人员,这种编程模型能提供面向对象编程技术的丰富功能。
ASP+还提供一些基本结构服务(诸如会话状态管理和进程重启服务),这些服务大大减少了开发人员要编写的代码量,并使应用程序的可靠性得到大幅度提高。
ASP+还允许开发人员将软件作为一项服务来提供。
通过使用ASP+Web服务功能,ASP+开发人员只需进行简单的业务逻辑编程,而由ASP+基本结构负责通过简单对象访问协议(SOAP)来提供服务。
2.1.2C#编程语言
C#(读做"Csharp",中文译音“夏普”)是微软公司发布的一种面向对象的、运行于.NETFramework之上的高级程序设计语言,并定于在微软职业开发者论坛(PDC)上登台亮相.C#是微软公司研究员AndersHejlsberg的最新成果.C#看起来与Java有着惊人的相似;它包括了诸如单一继承,界面,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NETwindows网络框架的主角.
微软c#语言定义主要是从C和C++继承而来的,而且语言中的许多元素也反映了这一点.C#在设计者从C++继承的可选选项方面比Java要广泛一些(比如说structs),它还增加了自己新的特点(比方说源代码版本定义).但它还太不成熟,不可能挤垮Java.C#还需要进化成一种开发者能够接受和采用的语言.而微软当前为它的这种新语言大造声势也是值得注意的.目前大家的反应是:
"这是对Java的反击."
C#更象Java一些,虽然微软在这个问题上保持沉默.这也是意料中的事情,我觉得,因为Java近来很成功而使用Java的公司都报告说它们在生产效率上比C++获得了提高.
C#独有的特点有:
C#最引人入胜的地方是它和Java的不同,而不是相似的地方.下面是C#实现的和Java不同的地方或者Java根本没有的特点.中间代码:
微软在用户选择何时MSIL应该编译成机器码的时候是留了很大的余地.微软公司很小心的声称MSIL不是解释性的,而是被编译成了机器码.它也明白许多--如果不是大多数的话--程序员认为Java程序要不可避免的比C编写的任何东西都要慢.而这种实现方式决定了基于MSIL的程序(指的是用C#,VisualBasic,"ManagedC++"--C++的一个符合CLS的版本--等语言编写的程序)将在性能上超过"解释性的"Java代码.当然,这一点还需要得到事实证明,因为C#和其他生成MSIL的编译器还没有发布.但是JavaJIT编译器的普遍存在使得Java和C#在性能上相对相同.象"C#是编译语言而Java是解释性的,"之类的声明只是商业技巧.Java的中间代码和MSIL都是中间的汇编形式的语言,它们在运行时或其它的时候被编译成机器代码.
命名空间中的申明:
当你创建一个程序的时候,你在一个命名空间里创建了一个或多个类.同在这个命名空间里(在类的外面)你还有可能声明界面,枚举类型和结构体.必须使用using关键字来引用其他命名空间的内容.
基本的数据类型:
C#拥有比C,C++或者Java更广泛的数据类型.这些类型是bool,byte,ubyte,short,ushort,int,uint,long,ulong,float,double,和decimal.象Java一样,所有这些类型都有一个固定的大小.又象C和C++一样,每个数据类型都有有符号和无符号两种类型.与Java相同的是,一个字符变量包含的是一个16位的Unicode字符.C#新的数据类型是decimal数据类型,对于货币数据,它能存放28位10进制数字.
两个基本类:
一个名叫object的类是所有其他类的基类.而一个名叫string的类也象object一样是这个语言的一部分.作为语言的一部分存在意味着编译器有可能使用它--无论何时你在程序中写入一句带引号的字符串,编译器会创建一个string对象来保存它.
参数传递:
方法可以被声明接受可变数目的参数.缺省的参数传递方法是对基本数据类型进行值传递.ref关键字可以用来强迫一个变量通过引用传递,这使得一个变量可以接受一个返回值.out关键字也能声明引用传递过程,与ref不同的地方是,它指明这个参数并不需要初始值.
与COM的集成:
C#对Windows程序最大的卖点可能就是它与COM的无缝集成了,COM就是微软的Win32组件技术.实际上,最终有可能在任何.NET语言里编写COM客户和服务器端.C#编写的类可以子类化一个以存在的COM组件;生成的类也能被作为一个COM组件使用,然后又能使用,比方说,JScript语言子类化它从而得到第三个COM组件.这种现象的结果是导致了一个运行环境的产生,在这个环境里的组件是网络服务,可用用任何.NET语言子类化.
索引下标:
一个索引与属性除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用(就象用数组下标一样)以外是相似的.
publicclassListBox:
Control
{
privatestring[]items;
publicstringthis[intindex]
{
Get
{
returnitems[index];
}
Set
{
items[index]=value;
Repaint();
}
}
}
可以用一个循环器来匿名引用字符串内部数组成员,就象下面这样:
ListBoxlistBox=...;
listBox[0]=")起源于人类神经系统的早期研究。
神经生理学家WarrenMcCulloch和WalterPitts研究出一种使用数学方式描述神经网络的方法。
1956年,数学家StephenKleene发表了一篇标题为“神经网事件的表示法”的论文,并在该论文中引入了“正则表达式”这一个概念。
该论文称正则表达式是:
“正则集的代数”的表达式。
因此,采用“正则表达式”这个术语。
正则表达式的定义存在多种说法,具体如下:
正则表达式就是用某种模式去匹配一类字符串的公式,主要用来描述字符串匹配的工具。
正则表达式描述了一种字符串匹配的模式。
它可以用来检查字符串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
正则表达式是由普通字符(如字符a到z)以及特殊字符(称为元字符)组成的文字模式。
正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
正则表达式就是用于描述某些规则的工具。
这些规则经常用于处理字符串中的查找或替换字符串。
换句话说,正则表达式就是记录文本规则的代码。
正则表达式就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。
学过《编译原理》的人可能知道不确定有限自动机(Non-deterministicfiniteautomaton,简称NFA)和确定有限自动机(Deterministicfiniteautomaton,简称DFA)。
其实,正则表达式是一个不确定有限自动机。
NFA和DFA的最大区别在于它们的状态转换函数。
NFA可以对同一个字符串产生多种理解方式,而DFA则只有唯一的一种理解方式。
也正因为如此,NFA在匹配过程中可能会回溯,NFA的效率一般要低于DFA。
因此,在书写正则表达式时尽量减少回溯来提高正则表达式的效率。
如果你使用过Windows或DOS下用于文件查找的通配符*和?
,那么你不难理解正则表达式。
如果你需要查找所有Word文档,那么可能使用表达式*.doc。
其中,字符*是一个通配符,它可以代表任意字符串。
正则表达式和通配符具有相似性,它也可以使用一些字符(如字符.)表示任意字符。
然而,它比通配符更具有精确性。
在正则表达式中,匹配是最常用的一个词语,它描述了正则表达式动作结果。
给定一段文本或字符串,使用正则表达式从文本或字符串中查找出符合正则表达式的字符串。
有可能文本或字符存在不止一个部分满足给定的正则表达式,这时每一个这样的部分被称为一个匹配。
其中,匹配存在下面3种类型:
形容词性的匹配,即一个字符串匹配一个正则表达式。
动词性的匹配,即在文本或字符串里匹配正则表达式。
名词性的匹配,即字符串中满足给定的正则表达式的一部分。
正则表达式的应用非常广泛,特别是在字符串处理方面。
目前来说,正则表达式已经在很多软件中得到广泛了应用,如Linux、Unix、HP等操作系统,C#、PHP、Java等程序开发环境,以及很多的应用软件中,都可以看到正则表达式的这样或那样的应用。
正则表达式常见的应用如下:
验证字符串,即验证给定的字符串或子字符串是否符合指定特征,譬如验证是否是合法的邮件地址、验证是否为合法的HTTP地址等。
查找字符串,从给定的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。
替换字符串,即把给定的字符串中的符合指定特征的子字符串替换为其他字符串,比普通的替换更强大。
提取字符串,即从给定的字符串中提取符合指定特征的子字符串。
2.2.2C#对正则表达式的支持
正则表达式最常用的功能就是数据验证,例如验证电子邮件地址,电话号码等成为开发过程中经常用到的代码。
C#对正则表达式有很好的支持。
在System.Text..RegularExpressions命名空间下有一组相关,专门用于正则表达式应用。
Regex类----包含了正则表达式,以及使用正则表达式的各种方法。
MatchCollection:
包含了一个正则表达式找到的所有配置项。
Match:
包含了一次匹配中所有匹配的文本。
GroupCollection:
包含了一次匹配中的所有分组。
Group:
包含了一个分组集合中一个组的细节。
CaptureCollection:
包含一个组的所有Capture对象
Capture:
返回组内一次捕获所有匹配的字符串。
RegexCompliationInfo:
提供了把Regex类编译为了一个独立程序集所需要的细节。
3需求分析
3.1功能需求分析
本软件(多线程文件搜索软件)主要由以下功能模块构成:
搜索音频、视频、图片文件模块,搜索文档(文字处理、电子数据表等)模块,搜索文件和文件夹模块以及文件定位模块。
这些模块的功能描述如下:
搜索音频、视频、图片文件模块:
由用户输入搜索的条件(搜索范围、文件名称、访问日期、文件大小),然后根据用户设定的条件快速筛选出符合用户需求的音频、视频、图片文件。
搜索文档(文字处理、电子数据表等)模块:
由用户输入搜索的条件(搜索范围、文件名称、访问日期、文件大小),然后根据用户设定的条件快速筛选出符合用户需求的文档(文字处理、电子数据表等)。
搜索文件和文件夹模块:
由用户输入搜索的条件(搜索范围、文件名称、访问日期、文件大小),然后根据用户设定的条件快速筛选出符合用户需求的文件和文件夹。
文件定位模块:
当文件搜索完毕后,用户可以使用这个模块来快速的打开文件所在的目录。
系统结构如图3-1:
图3-1系统结构
3.2环境需求分析
3.2.1硬件环境需求
处理器:
IntelPentiunII以上;
内存:
128MB以上;
硬盘空间:
20GB以上;
光驱:
40X以上;
显卡:
TNT2显示适配器以上;
网络配置:
宽带网络。
3.2.2软件环境需求
客户端
操作系统:
WindowsXP2003;
软件:
.NET2.0安装包
3.3用户界面需求分析
软件与用户界面的友好性是用户能够方便有效愉快地使用该软件的关键之一。
从市场角度来看,具有友好用户界面的软件有很强的竞争力。
因此,必须在需求分析时,为用户界面细致地规定一些要求。
本软件采用大众化界面开发原则,力求界面的简洁、友好、美观大方、操作方便。
界面设计一般遵循以下一些基本原则:
(1)用户界面风格始终一致。
保证用户界面运作的一致性。
对于列表框来说,如果双击其中的项,使得某些事件发生,那么双击任何其它列表框中的项,都应该有同样的事件发生。
所有窗口按钮的位置要一致,标签和信息的措辞要一致,颜色方案要一致。
用户界面的—致性使得用户对于界面运作建立起精确的心理模型,提高软件的易用性。
(2)界面上的布局很重要。
人们是自左而右,从上而下阅读,基于人们的习惯,屏幕的组织也应当是自左而右,从上而下。
屏幕小部件的布局也应以用户熟悉的方式进行。
(3)信息和标签措辞要适当。
屏幕上显示的文本是用户主要的信息源。
如果文本措辞很糟,用户的理解就会很糟。
要使用完整的措辞和句子,而不要用缩写和代码,使文本易于理解。
信息措辞要积极,显示用户处于控制之中,并提示如何正确使用软件。
此外,信息措辞要一致,在屏幕上显示的位置要一致。
(4)颜色使用适当。
使用颜色要谨慎。
如果使用了,也要使用指示符。
问题就在于有些用户可能是色盲。
如果在屏幕上使用了颜色来突出显示某些东西,假若想让色盲的用户注意到,那么需要做些另外的工作来突出它,如在其旁边显示一个符号。
颜色的使用也得一致,以使整个应用软件有同样的观感。
此外,在不同平台上,色彩的表现不尽人意。
在一个系统上看上去很好,在另一个系统上常常看上去很糟。
(5)遵循对比原则。
打算在应用软件中使用颜色,要确保屏幕的可读性。
最好的方法是遵循对比原则:
在浅色背景上使用深色文字,在深色背景上使用浅色文字。
蓝色文字以白色为背景很容易读,但以红色为背景很难辨认。
问题出在蓝色与红色之间没有足够反差,而蓝色与白色之间则反差很大。
字体使用适当。
老式英语字体可能在莎士比亚的剧本封面看上去很合适,但在屏幕上却很难认。
要用那些可读性好的字体,如serif或TimesRoman。
此外,字体的使用要一致。
节俭、有效地使用两、三种字体的屏幕看上去远胜于使用五、六种字体的屏幕。
要记住每次改变了字体的大小、风格(粗体、斜体、下划线,……)、样式或颜色,都是在使用不同的字体。
4系统设计
4.1程序的工作流程
整个程序的工作流程,当运行了程序界面,系统就处于监听状态,当有按钮被按下时,系统就会去执行相应按钮所要实现的功能,如下图4-1:
图4-1工作流程
4.2遍历文件文件和文件夹算法的流程图
这是一个递归的算法,但第一次执行该程序的时候,文件读取要搜索目录的文件和文件夹,然后在判断读取的文件中有没有符合用户输入的搜索条件的,如果符合就显示出来。
如果不符合就跳过。
然后在用同样的方法去搜索读取的文件夹的内容,这样就形成了一个递归的过程。
具体流程如下图4-2
图4-2便利算法
4.3系统的用例图:
用例图是用图形的方式,直观的显示出系统所要实现的功能。
在本系统中用户可以根据自身的需要,输入不同的搜索条件来查找自己想要的文件。
在本软件中用户可以用到的主要搜索功能如下图4-3:
图4-3系统用例图
4.4程序用到的类和类之间的关系
程序中要用到的类有:
窗体类(SearchingWin)、查询文件类(SearchFile)、文件夹浏览类(FolderBrowserDialog)、文件目录类(Directory)、线程池类(ThreadPool)。
各个类主要实现的功能描述如下:
SearchingWin:
主要是显示windows控件和对事件的监听。
SearchFile:
负责文件的遍历和匹配工作。
FolderBrowserDialog:
显示文件夹浏览的对话框。
ThreadPool:
负责线程的创建。
Directory:
读取磁盘文件或目录。
在上述类中窗体类(SearchingWin)和查询文件类(SearchFile)是本搜索器的核心类,窗体类(SearchingWin)实现了搜索器