C#多线程文件搜索软件设计毕业设计含源文件.docx
《C#多线程文件搜索软件设计毕业设计含源文件.docx》由会员分享,可在线阅读,更多相关《C#多线程文件搜索软件设计毕业设计含源文件.docx(60页珍藏版)》请在冰豆网上搜索。
![C#多线程文件搜索软件设计毕业设计含源文件.docx](https://file1.bdocx.com/fileroot1/2023-3/31/821051d1-7a19-4af6-bb15-d8901ab8dc4c/821051d1-7a19-4af6-bb15-d8901ab8dc4c1.gif)
C#多线程文件搜索软件设计毕业设计含源文件
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]="hello";
Console.WriteLine(listBox[0]);
代理和反馈:
一个代理对象包括了访问一个特定对象的特定方法所需的信息.只要把它当成一个聪明的方法指针就行了.代理对象可以被移动到另一个地方,然后可以通过访问它来对已存在的方法进行类型安全的调用.一个反馈方法是代理的特例.event关键字用在将在事件发生的时候被当成代理调用的方法声明.
2.1.3.NET和C#的重要性
为了理解.NET的重要性,考虑一下近10年来出现的许多Windows技术的本质会有一定的帮助。
尽管所有的Windows操作系统在表面上看来完全不同,但从Windows3.1(1992年)到WindowsServer2003,在内核上都有相同的WindowsAPI。
在我们转而使用Windows的新版本时,API中增加了非常多的新功能,但这是一个演化和扩展API的过程,并非替换它。
开发Windows软件所使用的许多技术和架构也是这样。
例如,COM(ComponentObjectModel,组件对象模型)是作为OLE(ObjectLinkingandEmbedding,对象链接和嵌入)开发出来的,那时,它在很大程度上仅是把不同类型的办公文档链接在一起,所以利用它可以把一个小Excel电子表格放在Word文档中。
之后,它逐步演化为COM、DCOM(DistributedCOM,分布式组件对象模型)和最终的COM+。
COM+是一种复杂的技术,它是几乎所有组件通信方式的基础,实现了事务处理、消息传输服务和对象池。
Microsoft选择这条道路的原因非常明显:
它关注向后的兼容性。
在过去的这些年中,第三方厂商编写了相当多的Windows软件,如果Microsoft每次都引入一项不遵循现有编码规则的新技术,Windows就不会获得今天的成功。
向后兼容性是Windows技术的极其重要的特性,也是Windows平台的一个长处。
但它有一个很大的缺点:
每次某项技术进行演化,增加了新功能后,都会比它以前更复杂。
很明显,对此必须进行改进。
Microsoft不可能一直扩展这些开发工具和语言,使它们越来越复杂,既要保证能跟上最新硬件的发展步伐,又要与20世纪90年代初开始流行的Windows产品向后兼容。
如果要得到一种简单而专业化的语言、环境和开发工具,让开发人员轻松地编写优秀的软件,就需要一种新的开端。
这就是C#和.NET的作用。
粗略地说,.NET是一种在Windows平台上编程的新架构——一种新API。
C#是一种全新的语言,它可以利用.NETFramework及其开发环境中的所有新特性,以及在最近20年来出现的面向对象的编程方法。
在继续介绍前,必须先说明,向后兼容性并没有在这个演化进程中失去。
现有的程序仍可以使用,.NET也兼容现有的软件。
软件组件在Windows上的通信,现在几乎都是使用COM实现的。
因此,.NET能够提供现有COM组件的包装器(wrapper),以便.NET组件与之通信。
我们不需要学习了C#才能给.NET编写代码,因为Microsoft已经扩展了C++,提供了一种新语言J#,还对VisualBaisc进行了很多改进,把它转变成为功能更强大的VisualBaisc.NET,并允许把用这些语言编写的代码用于.NET环境。
但这些语言都因有多年演化的痕迹,所以不能完全用现在的技术来编写。
本书将介绍C#编程技术,同时提供.NET体系结构工作原理的必要背景知识。
我们不仅会介绍C#语言的基础,还会给出使用各种相关技术的应用程序示例,包括数据库访问、动态的Web页面、先进的图形技术和目录访问等。
惟一的要求是用户至少熟悉一门在Windows上使用的高级语言,例如C++、VisualBaisc或J++。
.NET的优点
前面阐述了.NET的优点,但并没有说它会使开发人员的工作更易完成。
本节将简要讨论.NET的改进特性。
● 面向对象的编程:
.NETFramework和C#从一开始就完全是基于面向对象的。
● 优秀的设计:
一个基类库,它是以一种非常直观的方式设计出来的。
● 语言的无关性:
在.NET中,VisualBaisc.NET、C#、J#和ManagedC++等语言都可以编译为通用的中间语言(IntermediateLanguage)。
这说明,语言可以用以前没有的方式交互操作。
● 对动态Web页面的更好支持:
ASP具有很大的灵活性,但效率不是很高,这是因为它使用了解释性的脚本语言,且缺乏面向对象的设计,从而导致ASP代码比较凌乱。
.NET使用一种新技术ASP.NET,它为Web页面提供了一种集成式的支持。
使用ASP.NET,可以编译页面中的代码,这些代码还可以使用.NET高级语言来编写,例如C#、J#或VisualBaisc2005。
●高效的数据访问:
一组.NET组件,总称为ADO.NET,提供了对关系数据库和各种数据源的高效访问。
这些组件也可以访问文件系统和目录。
.NET内置了XML支持,可以处理从非Windows平台导入或导出的数据。
● 代码共享:
.NET引入了程序集的概念,替代了传统的DLL,可以完美无暇地修补代码在应用程序之间的共享方式。
程序集是解决版本冲突的正式系统,程序集的不同版本可以同时存在。
● 增强的安全性:
每个程序集还可以包含内置的安全信息,这些信息可以准确地指出谁或哪种类型的用户或进程可以调用什么类的哪些方法。
这样就可以非常准确地控制程序集的使用方式。
● 对安装没有任何影响:
有两种类型的程序集,分别是共享程序集和私有程序集。
共享程序集是可用于所有软件的公共库,私有程序集只用于某个软件。
私有程序集是完全自包含的,所以安装过程非常简单,没有注册表项,只需把相应的文件放在文件系统的相应文件夹中即可。
● Web服务的支持:
.NET集成了对开发Web服务的完全支持,用户可以开发出任何类型的应用程序。
● VisualStudio2005:
.NET附带了一个开发环境VisualStudio2005,它可以很好地利用C++、C#、J#、VisualBaisc2005和ASP.NET进行编码。
VisualStudio2005集成了VisualStudio.NET2002/2003和VisualStudio6环境中的各种语言专用的所有最佳功能。
● C#:
是使用.NET的一种面向对象的新语言。
2.2正则表达式和C#
2.2.1正则表达式简介
正则表达式(RegularExpression)起源于人类神经系统的早期研究。
神经生理学家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功能需求分析
本软件(多线程文件搜索软件)主要由以下功能模块构成:
搜索音频、视频、图片文件模块,搜索文档(文字处理、电子数据表等)模块,搜索文件和文件夹模块以及文件定位模块。
这些模块的功能描述如下:
搜索音频、视频、图片文件模块:
由用户输入搜索的条件(搜索范围、文件名称、访问日期、文件大小),然后根据用户设定的条件快速筛选出符合用户需求的音频、视频、图片文件。
搜索文档(文字处理、电子数据表等)模块:
由用户输入搜索的条件(搜索范围、文件名称、访问日期、文件大小),然后根据用户设定的条件快速筛选出符合用户需求的文档(文字处理、电子数据表等)。
搜索文件和文件夹模块:
由用户输入搜索的条件(搜索范围、文件名称、访问日期、文件大小),然后根据用户设定的条件快速筛选出符合用户需求的文件和文件夹。
文件定位