您的当前位置:首页正文

文件的分割与合并

2020-10-01 来源:客趣旅游网
文件的分割与合并

摘 要:随着软件行业的快速发展,各种类型的应用软件层出不穷,同时文件的复杂度也越来越大,需要占用越来越多的空间。但是在多种多样的软件和文件给我们带来了方便的同时在其它方面则给我们带来了新的难题,同时给我们带来了新的要求。本软件是利用 Visual Basic 作为工具开发的名为文件的分割与合并的应用软件,是用来完成将文件进行分割与合并的操作。主要是利用了Visual Basic语句的循环功能完成文件的分割与合并。利用本软件可以节省软件使用者的时间并带来便利。

关键词:文件;分割;合并;Visual Basic

1 绪论

1.1 课题背景

随着软件行业的快速发展,各种类型的应用软件层出不穷,同时文件的复杂度也越来越大,需要占用越来越多的空间。但是在多种多样的软件和文件给我们带来了巨大的方便的同时在其它方面则给我们带来了新的难题,与此同时给我们带来了新的要求去解决这些问题。例如在文件越来越大型化的今天,大型文件的存储和传送(例如上传到邮箱中)就给我们带来了一系列的难题。因为在存储和传送文件的时候,传送工具往往对传输文件的大小提出比较具体的要求。或者在传输的过程中,往往会因为传输网络的不稳定性而出现传输中断或者传输暂时停止的现象。这种情况的出现对于用户来说是很麻烦的事情。如何解决这一系列的难题,使得在文件的传输或者上传过程中将大型化的文件变成若干相对比较小的文件。使得其满足在上传中的大小要求以及将大型文件小型化。这就是我这次毕业设计所要解决的问题。 也就是我这次的课题《文件的分割与合并》。 1.2 总体设计方案

这次的毕业设计名称为《文件的分割与合并》。是利用VB程序设计对文件进行分割与合并。

Visual Basic 即“可视化Basic”。它有两个方面的含义:其一,“可视化”意思是当创建图形用户界面元素时,不用编写大量的程序代码行来描述和控制界面元素的位置、大小等属性,只需简单的在屏幕上增加已经建立好的对象。其二,Basic(Beginner All-Purpose Symbolic Instruction Code)的意思是“对初学者来

说可以实现任何目标的符号化指令代码”,相对于C/C++或Pascal等语言是很基本和简单的。VB是以Basic为基础,同时也保留了Basic好学易懂的优点,又因为是“可视化”,所以比原来的老式Basic更好用,成为一种专业化的开发语言。用户可以用它快速开发Windows程序,也可以开发企业级的客户机/服务器程序以及强大的数据库系统。VB使得非计算机专业人员从不敢问津的Internet, ActiveX, Active DLL编程变得易如反掌。因此,我选择VB 6.0作为实现该控件的开发工具。

总体设计方案就是在设计的界面上有分割与合并两个主要的选项,以对文件实行分割与合并的功能。在分割上还要有对文件的选择,分割大小的选择,以及分割后文件存放位置的选择。在分割的时候,对文件按照所要求分割的大小把文件分成若干部分。如果最后的一部分被分割的文件小于所要求分割的大小,则全部保存在最后一个分割的文件中.在所有分割后的文件的最后面要形成一个.cut的文件。里面用于保存所分割的文件的格式、大小、文件名等信息。在“合并”选项上则要有选择所要合并的“文件选择”以及合并后文件存储位置“选择文件夹”的选择。在合并选择文件的时候,只出现所要合并文件的.cut的文件,所有合并信息在.cut文件中查找,使之可以合并成原来的文件。设计方案中的主要工作是分割与合并的选项。此外还有在选择“分割”文件的时候,“合并”的选项不可以选择,同样在选择“合并”的时候,“分割”的选项不可选择等等。

2 系统总体方案设计

在系统实现以前对系统进行具体的分析是一个非常重要的阶段。下面我对我所做的系统分析报告介绍如下: 2.1 项目定义

计算机系统工程是指与构造基于计算机系统有关的过程、方法和技术。它是一种问题求解活动。计算机系统工程师从用户定义的目标和约束条件出发,给出系统功能、性能、接口、设计约束条件和信息结构的描述,并将它们分配到各系统要素予以实现。

在开始构造一个基于计算机的新系统时,系统工程师必须做大量的调查、研究和论证工作,建造系统或系统某一部分的原型,以便尽早确定系统的功能和性能。然后,系统工程师将系统功能和性能分配到系统各要素之中,如软件、硬件、人,等等。多数场合,一个功能可用多种方法实现。系统工程师必须善于根据系统设计目标和约束条件设计并选择最佳方案,为系统各要素指派功能和性能。方案的选择和指派必须按照一定的原则进行。例如,在成本、时间、软硬件支撑环境、人员的技术水平和经验、方案的复杂性、系统的安全性和可靠性、系统的可重用性、使用的方便性和人员培训

2

的难易程度等方面进行取舍和折中。

问题定义是整个软件开发的第一步,在这个阶段主要问题是:“要解决的项目问题是什么?”只有弄懂了要解决问题,才能够合理地分析和解决问题,并为以后的总体设计和详细设计打下坚实的基础。根据软件工程,前期的问题定义占软件开发很大部分,是很重要的环节。

软件项目定义阶段的任务有四项:

制定软件项目规划包括:描述软件的工作范围、进行风险分析、提出开发软件所需资源清单、估算软件项目的成本和进度,并以成本和进度估算为基础对软件项目进行可行性论证。最后,生成经过项目管理组织评审的软件项目规划。

软件需求分析和定义。确定软件的功能和性能,详细定义软件系统要素。定义软件需求有两种方法。一种是采用形式化的信息分析方法。建立信息流和信息结构模型,然后将这些模型扩展为软件规格说明。另一种是为软件开发原型,软件工程师和用户一起对原型进行评审和修改,从而获得用户满意的需求定义信息。

确定软件性能和资源约束,这对软件设计特性会产生直接的影响。 为软件要素定义验收标准,它也是制定软件测试计划的基础。 2.2 系统可行性分析

因为系统运行的环境是动态多变的,为了避免在开发过程中项目因不可行而不得不终止开发,系统的可行性分析是必要的。下面从经济可行性、技术可行性、操作可行性三方面来进行可行性分析。 2.2.1 技术可行性

我选用VB 6.0作为软件开发工具来实现文件的分割与合并。选用VB 6.0作为软件开发工具是因为它便于技术开发人员上手。同时,Visual Basic是目前众多Windows软件开发工具中效率较高的一个,它作为一种开发工具广泛地应用在各个领域,从数学计算、数据库的管理、客户/服务器软件、通信软件、多媒体软件及Internet/Intranet软件的设计,都可以用它来开发完成,而且,Visual Basic提供了大量的控件,也促进了它在各个领域的使用。总之,在文件的分割与合并软件的开发过程中,用VB作软件开发工具可以极大地方便和加快软件的开发速度。

VB是功能非常强大的数据库前台开发工具,现在已被广泛应用于管理信息系统的开发。在此系统的开发过程中,它完全能够满足系统开发需求、能够适应系统发展,广为用户所接受,此系统具有技术可行性。 2.2.2 经济可行性

此系统若开发后投入使用,将使在文件的储存和传送的过程中解决很大的实际困难,并且因为文件的分割与合并的实现可以令使用此软件的用户很轻松地解决实际中的问题,

3

大大减轻工作人员的操作并节省劳动力。比较开发此软件系统的总费用和总收益,可以得到此系统具有经济可行性。 2.2.3 操作使用可行性

该语言环境下能够有效地从事文件的分割与合并,并被用户方便使用,因为它具有以下特点:

(1) 控件专业化程度强。

(2) 控件对用户的使用要求不高,全部操作都是用鼠标操作完成。用户只要具

有Windows的操作能力都可使用。 (3) 控件界面友好、操作方便。 分析可得,此控件具有操作使用可行性。 2.3 系统运行环境分析 (1) 硬件环境

Pentium III处理器,32M或者以上内存,4G硬盘

(2) 软件环境

Windows 2000,Visual Basic 6.0

2.4 系统需求分析 2.4.1 总目标

需求分析是介于系统分析和软件设计阶段之间的重要桥梁。一方面,需求分析以系统规格说明和项目规划作为分析活动的基本出发点,并从软件角度对他们进行检查和调整。另一方面,需求规格说明又是软件设计、实现、测试,直至维护的主要基础。

需求分析是在可行性研究的基础上进行的,可行性研究实质上是一次完整的分析和设计过程,只不过是在抽象的层次上进行的大大压缩和简化的分析和设计过程。

需求分析的结果是造出目标系统的原型,供用户试用以取得实践。良好的分析活动有助于避免或尽早剔除早期错误,从而提高软件生产率,降低开发成本,改进软件质量。

需求分析的基本任务是确定目标系统必须具备那些功能,准确完整地体现用

户的要求,必须仔细验证它的正确性,开发人员必须和用户取得完全一致的意见,需求分析的文档应该被用户所确认。

本系统的需求分析: (1) 采用VB 6.0开发工具;

(2) 系统能完成文件的选择分割或者合并,如果选择了分割,可以给出所要分割的大小选择,如果选择里面没有用户所需要的大小,用户还可以自己定义文件分割的

4

大小,当完成以上操作的时候,开始选择文件的原始存储路径和文件分割或合并之后的目标文件夹。主要的功能是通过代码来实现的。

(3)用户运行环境实现文件的分割与合并。 2.4.2 功能目标

所要分割文件的选择和分割大小的选择。 所要合并文件的选择。 2.4.3 性能目标

处理效率比手工方式大大提高。

只要通过简单介绍就可以使用户顺利使用此软件工具。 具有较高的可靠性和冗错能力。 2.5 程序代码编写

Visual Basic 作为一种高级编程语言,它也有着不可避免的缺点——开发出的应用程序运行速度慢。如果我们能够在程序上做一些优化,那么情况将会大大改善。在编写程序代码时,要在保证实现要求功能的基础上优化算法,通常我们应该注意一下三点:

首先尽量避免使用“Variant”变量。由于VB不能确定“Variant”变量的具体类型,所以它会给该类型变量分配16个字节的空间,而且在用变量进行运算时还要考虑到数据类型的转换。这既占用内存,又影响了速度,会使涉及到复杂运算的程序速度变慢。

其次在遇到整型数据时尽量使用“Long”变量。因为“Long”变量是32位CPU的本机数据类型,所以处理速度会很快,尤其是在循环体中。

最后要注意的是将控件的常用属性保存在变量中。一般控件存在于DLL或OCX这类的外部程序中。众所周知,调用DLL远比访问内存慢。所以对于那些放在循环体中的常用属性,如果将它们保存在变量中,那么速度将会有成百上千倍提升。

我们在编写程序时应注意到,在进行长时间等待操作时,可以做一些动画之类的效果,好让用户知道程序运行正常。下面是几个常用优化方法:

使用“Splash”屏幕。也就是我们常见的欢迎窗口。大的应用程序在启动时,往往会主动或被动地载入一大堆DLL,这要花费很长时间。所以我们在启动时可以先显示一个简单的窗口,上面只放一些作者、版权之类的信息,在这个窗口的Form_Load事件中用Load方法读入那些最常用的窗体模块。这样,虽然实际等待的时间延长了,但用户所看到的屏幕总是变化的,所以感觉程序启动加快了。而且由于常用窗体模块事先已载入内存,以后只需用Show方法来显示它,跳过了载入过程,在程序运行过程中也会很快的。

5

使用Timer控件。由于Timer控件的出现,使得后台作业有了可能。我们可以在每次Timer事件中完成小部分任务。这样,由于Timer中的事件能够在很短的时间内完成,用户一般察觉不到速度的变化。使用进度条。要使用进度条,需要事先知道数据量,所以它很适合用于对已知数据的操作,如数据库的排序。

总之,优化程序要从自己、从用户等多方面考虑,使程序开发周期短,且高效易用。

2.6 系统应用分析

对文件的选择以及所要分割大小的选择都设计得较为方便,使本软件工具具有良好的人机界面,最大限度减少工作量。

控件有良好的安全性和灵活性。 2.7 总体方案确定

根据前面的讨论,得出了以下的总体方案图。如图2.1所示。如图中所示

主界面 合并与分割的选择 所要分割的大小选择 选择源文件

图2.1 总体设计框图

选择目标文件 分割与合并的实现 2.8 具体方案确定

文件的分割和合并的具体实现方案如下。

(1)界面由两部分组成,一部分是选择分割,分割大小的选择,选择要分割的文件以及分割以后文件存放的位置;另一部分是选择合并,选择要合并的文件以及文件合并以后存放的位置。

(2) 设置2个选择选项,它们是

其主要功能是在进入本软件的时候选择是进行文件的分割操作还是合并操作,当进行分割操作时,合并的选项不可以选择。反之,进行合并选择的时候,分割的选项不可以选择。

(3) 设置大小选择的选项

6

使用者可以选择由本软件的开发者所提供的大小选项。当使用者有自己的要求时,则可以自己填写所要分割的大小。

(4) 设置一个选择源文件选项。

其功能是,当使用者选择分割或者合并文件的时候,选择所要分割或者合并的文件。

(5) 设置选择文件夹选项

并的时候,存放合并以后的文件存放位置。

(6)设置最终选择的选项作。

此功能是在进行完所需要分割或者合并的操作之后,对软件进行最后的确定工

此功能是在选择分割的时候,选择文件分割以后所要存放的位置。当选择文件合

3 开发环境及相关知识介绍

在开始软件开发前,先让我们了解一下该软件开发工具VB的一些相关知识以及它的开发环境。我们主要介绍的是本系统开发时的软件环境,只有我们深刻了解、掌握了所应用的软件环境,才能开发出适应要求的系统,对我们所开发系统的适用性有一个清楚的认识。

3.1 Visual Basic 6.0简介 3.1.1 VB的基本特点

Visual Basic(简称VB)是近年来得到迅速推广和应用的计算机高级语言,它适用于面向对象程序设计。人们可以在图形界面的Windows平台上开发应用程序。VB是在原有Basic语言基础上的进一步发展,它包含了数百条语句、函数和关键词,其中很多与Windows GUI有直接的关系。VB语言具有简单易学的特性,只要稍有语言基础就可以很快掌握并进而精通。可视化的用户界面设计功能,把程序设计人员从烦琐复杂的界面设计中解脱出来;可视化编程环境的“所见即所得”功能,使界面设计如积木游戏一般,从而使编程成为一种享受;强大的多媒体功能可轻而易举地开发出集声音、图画、图像和图片于一体的多媒体应用程序;新增的网络功能提供了编写Internet程序的能力。

此外,Visual Basic作为一种可视化程序设计的开发工具而不仅仅是一种语言,从数学计算、数据库管理、客户/服务器软件、通信软件、多媒体软件到Internet/Intranet软件,都可以用Visual Basic开发完成。对于开发Windows应用程序而言,Visual Basic是目前所有开发语言中最简单、最容易使用的语言。作

7

为程序设计语言,Visual Basic程序设计具有以下特点:

(1) 强大的数值和字符串处理功能。 (2) 丰富的图形指令。

(3) 提供静态和动态数组,有利于简化内存管理。 (4) 过程可递归调用。

(5) 支持随机文件和顺序文件访问。

(6) 提供了一个可供应用程序调用的包含多种类型的图标库。 (7) 具有完善的运行出错处理。

Visual Basic的集成开发环境或称IDE,由多个部分组成,包含了标题栏、菜单条、工具栏、控件箱以及窗体设计器窗口、工程管理器窗口、属性窗口、代码窗口和窗体布局窗口等,覆盖了开发应用程序的设计、编辑、编译和调试等所有功能。

在Visual Basic中,常用的对象有工具箱中的控件、菜单、窗体、应用程序的部件以及数据库等。从可视化编程的角度来看,这些对象都具有属性(数据)和行为方式(方法)。简单地说,属性用于描述对象的一组特征,方法为对象实施一些动作,对象的动作则常常要触发事件,而触发事件又可以修改属性。一个对象建立以后,其操作就通过与该对象有关的属性、事件和方法来描述。

对象是数据和代码的结合,可以把对象中的数据和代码当作一个整体来看待。因此,用现有的对象来组装应用程序将大大简化应用程序的开发过程和提高应用程序的开发效率,这正是Visual Basic最基本的思想之一。

在Visual Basic中,可以通过对象的属性、方法和事件三个基本要素来控制和操作对象。属性(Property)是对象的特性和数据,它定义了对象的外观和行为。方法(Method)是对象的操作过程,它使对象执行一定的动作和任务。事件(Event)是对象对外部变化的响应。可以在事件过程中编写代码,以指定在此事件发生后,要完成什么样的操作。每次当事件发生时,就会执行相应事件过程中的代码。 3.1.2 通用对话框

(1) 通用对话框的添加

图3.1 通用对话框的添加

在Windows系统中,一些常用的对话框是非常相似的,例如:打开、另存为、颜色、字体、打印机和帮助对话框,因此,这些对话框被集中到了一个称为Comdlg32.ocx

8

的Visual Basic控件中。

由于Comdlg32不是Visual Basic系统的标准控件,使用时需要手动添加到工具箱:

使用“工程”菜单或者在工具箱右键快捷菜单中选择“部件”命令,调出部件对话框。

在“部件”选项卡中选中“Microsoft Common Dialog Control 6.0”并单击“确定”按钮。

(2)通用对话框的基本属性和方法

通用对话框的属性既可以在“属性窗口”中设定,也可以在“属性页”中设定,在窗体上右键单击通用对话框控件可以调出“属性页”窗口。下面是对话框的一些基本属性。

Dialog Tiltle

该属性是通过对话框显示时候的标题。

CancelError

该属性决定在用户按下“取消”按钮时是否产生错误信息。如果此项被设定为True,则当用户选择“取消”按钮时候,全局对象Err的Number属性被设置为32755,程序中可以判断此变量来进行对应的操作。 对话框种类的定制

CommonDialog控件组合了6种通用的对话框,具体使用哪种对话框可以调用控件的不同方法或者在程序中设置控件的Action属性来实现。其Action属性取值及对应的对话框如表所示:

表3.1 通用对话框的属性 Action取值 1 2 3 4 5 6 显示的对话框种类 显示“打开”对话框 显示“另存为”对话框 显示“颜色”对话框 显示“字体”对话框 显示“打印机”对话框 显示“帮助”对话框 ShowOpen:显示“打开”对话框。 ShowSave:显示“另存为”对话框。 ShowColor:显示“颜色”对话框。 ShowFont:显示“字体”对话框。 ShowPrinter:显示“打印机”对话框。 ShowHelp:显示“帮助”对话框。 (3)“打开”和“另存为”对话框

9

在文件的打开和保存两种动作中,通常用“打开”和“另存为”对话框来获得文件名。它们提供了树型目录结构来遍历整个磁盘系统,并显示出符合特定条件的文件。 除了通用对话框的基本属性需要设置外,在使用这两种对话框之前,还需要设置一些特有的属性。

FileName

该属性设置或返回用户需要操作的文件名称和路径。当用户选择一个文件或者用键盘输入一个文件名,并“关闭”对话框的时候,文件名称属性被设置为选定的文件名。

FileTile

该属性和FileName类似,只不过不包含文件路径,只有文件名。该属性运行时只读。

Filter

该属性用于指定在对话框的文件列表框中显示文件的类型。通常被称为过滤器。此属性应该在对话框被显示之前设定。

FilterIndex

当为一个对话框指定一个以上过滤器时,需要使用FilterIndex属性确定哪一个作为默认过滤器显示。 3.2 可视化编程的环境以及方法

启动Visual Basic 6.0后系统自动进入Visual Basic 6.0的集成开发环境,在这里集成了许多不同的功能,如设计、编辑、编译和调试等。用户可以在这个环境中一次完成几乎所有的开发工作而不必切换到其他地方。 3.2.1 Visual Basic 6.0的集成开发环境

图3.2 集成开发环境

(1) 菜单栏

Visual Basic 6.0菜单栏里列出了开发、调试、运行和保存的应用程序所需的

10

命令。主菜单共有13项:文件、编辑、视图、工程、格式、调试、运行、查询、图表、工具、外接程序、窗口和帮助。每个菜单项有若干个命令,可以执行不同的操作。

(2) 工具栏

默认情况下工具栏位于菜单栏的下方,它以工具按钮图标的形式提供常用的命令的快捷方式。用户只需要单击相应的按钮,即可激活某项任务。默认情况下Visual Basic 6.0启动后仅显示标准工具栏。其它附加的编辑、窗体设计和调试工具栏可以通过执行“视图”菜单中的“工具栏”命令进行添加和删除。

(3) 工具箱

图3.3 工具箱

Visual Basic 6.0标准工具箱包含了建立应用程序所需要的各种控件。默认情况下工具箱位于IDE环境的左边,用户可以根据需要将他拖放到任意需要的地方。

(4) 工程管理器

工程管理器窗口能够帮助用户同时管理多个工程,并且能将多个工程组织成一个工程组,将其保留在以.vbg为扩展名的工程组文件中。

工程管理器是一个有层次的树型结构,工作在树的根部,工程部件都是树的分支,与Windows资源管理器类似。双击其中的项目可以:“查看对象”,用鼠标右击某项目,可以在弹出的快捷菜单中选择更多的操作方式。

用户也可以直接单击工程管理器上方的工具按钮完成“查看代码”、“查看对象”和“切换文件夹”的操作。

(5) 属性窗口

图3.4 属性窗口

属性窗口是针对窗体和控件而设置的,一个工程中可以包含有很多控件对象,它

11

们各自都有一些特征,属性窗口中的属性值就描述了这些特征。在 Visual Basic 6.0中的窗体和控件的每个属性,在其创建时系统均赋有一个初始值,设计时只需要更改那些不符合要求的即可。

当一个工程包含有多个对象的时候,可以通过属性窗口上方的下拉列表框进行切换,以设置不同对象的属性值。

(6) 窗体设计器

窗体设计器用来创建应用程序的界面,具有所见即所得的特点。当一个工程被创建的时候系统会自动打开窗体设计器,并自动创建应用程序中的第一个控件窗体。可以通过向其中添加控件、图形和图片来创建所希望的外观。

窗体是应用程序中其他控件的容器,若默认窗体的大小不符合用户希望的时候,可以拖动窗体边沿上的控制点,来改变窗体的大小。

(7) 代码窗口

双击窗体或窗体中的控件,或者单击工程管理器窗口上的“查看代码”按钮,打开代码窗口。在代码窗口的上方有两个下拉列表框,左边显示了当前的控件,右边显示了该控件的事件过程名。例如希望编写当命令按钮Command1被单击时的事件代码,应该首先在左列表框中选择“Command1”,然后在右列表中选择“Click”事件。选择完毕后,代码窗口中自动出现该事件过程的代码框架,用户只需要向其中添加自己的内容即可。

(8) 窗体布局窗口

默认情况下窗体布局窗口出现在属性窗口的下方,它允许使用表示屏幕大小的图像来布置应用程序中窗体的位置。在窗体布局窗口中单击鼠标右键,将弹出快捷菜单。执行其中的“分辨率向导”命令,在屏幕上将出现表示分辨率右边界和下边界的指示线。

当鼠标指向窗体布局窗口的窗体图标时,鼠标指针将变成一个十字箭头样式,此时按下左键拖动鼠标可以将窗体移动到屏幕区域的任何位置,也就是程序运行的时候窗体出现的位置。

3.2.2 窗体的属性、时间以及方法

在Visual Basic 6.0中创建应用程序的第一步就是要创建用户界面。窗体是程序中所有其他控件的容器,用户可以根据自己的需要,将工具箱中的控件“画”到窗体上,形成程序界面。

(1) 窗体的属性

窗体的属性决定了窗体的外观和操作。窗体绝大多数属性都可以通过属性窗口或者在代码中设置,但也有一些属性只能在设计的时候设置,或者只能在运行的时候设置。

(2) 窗体的事件

12

窗体的时间比较多,最常用的有Click、DbClick、Initialize、Load和事件。单击、双击较为简单,这里主要介绍Loda事件和Initialize事件。

在Visual Basic 6.0应用程序中,程序的开始就是初始化窗体和启动窗体。只有当窗体显示到了屏幕上,用户才可以使用程序。

事件Initialize初始化Form、MDIForm或者类(Class)所用的数据。对于Form或MDIForm,该事件发生在Load事件发生之前。

(3) 窗体的常用方法

窗体上常用的方法有Print、Cls和Move方法的语法格式如下: [object].Move left,[[[top],width],height]

object:可选项,表示一个对象表达式,如果省略该项,则指当前活动窗体。 left:必选项,指示object左边的水平坐标。

top、width、height:均为可选项,分别表示对象左上角坐标、对象宽度和对象高度。

当代码书写完毕以后,按“F5”或者单击工具栏中的“运行”按钮运行程序。窗体出现在屏幕上,单击窗体出现信息框,单击“确定”按钮,窗体的大小以及出现的位置发生变化,同时出现信息框。单击“确定”按钮时窗体的位置和大小再次变化。单击窗体上的“关闭”按钮或者“停止”按钮,可以结束程序的运行。

在运行期间如果程序出现错误,系统会给出相应的提示,用户可以根据提示进行修改后再次运行程序直到通过。

经过测试运行无误的程序应当执行存盘操作,单击工具栏上的“保存”按钮打开“文件另存为”对话框,选择保存位置。

如果工程是曾经保存过的,本次只是修改。则单击“保存”按钮的时候不会出现“另存为”对话框,系统将按照原来的位置保存文件。

从以上可以看出来,设计一个简单的Visual Basic 程序一般要以下的步骤:

根据需要选择类型,建立一个Visual Basic工程。 向窗体上添加必要的控件,设计应用程序界面。 每个控件设计必要的事件,并编写代码。

运行以及调试程序,纠正错误,优化程序代码和界面。 保存工程。 生成可执行文件。

4 系统主要功能设计

该软件主要分为分割与合并两个方面,界面的功能是通过程序实现的。

13

4.1 界面的实现

以下是主要的界面设计:

图4.1 总体效果图

该界面由一个 Fram控件用来选择分割或者是合并;两个Radiobutton控件是对分割与合并分别进行选择;一个ComboBox用户控件是对按照已经设定好的大小进行分割以及用户自主选择大小进行分割;两个TextBox控件是对文件的选择以及文件分割与合并以后所存放的地址;“选择文件”按钮是对文件进行分割的时候选定要分割的源文件。当合并的时候选定需要合并的文件。“ 选择文件夹”是当分割文件的时候,选定分割以后的文件放到指定的位置。“分割”与“合并”按钮是最终进行操作的选择按钮。

4.2 文件的分割与合并的主体思想与设计

Private Declare Function SHBrowseForFolder _ Lib \"shell32.dll\" Alias \"SHBrowseForFolderA\" _ (lpBrowseInfo As BROWSEINFO) As Long Private Declare Function SHGetPathFromIDList _

14

Lib \"shell32.dll\" _ (ByVal pidl As Long, _ pszPath As String) As Long Private Type BROWSEINFO

hOwner As Long pidlRoot As Long pszDisplayName As String lpszTitle As String ulFlage As Long lpfn As Long lparam As Long iImage As Long End Type

首先声明了两个函数SHBrowseForFolder和SHGetPathFromIDList。它们的功能分别是在动态链接库shell32.dll中得到浏览文件夹的函数和获取文件夹的函数。后者中的函数定义为长整形。然后定义了一个结构体,结构体中定义了八个变量。分别是hOwner、pidlRoot、pszDisplayName、lpszTitle、ulFlage、lpfn、lparam、iImage。

Private fnum As Integer

Private Function ShowDir(MehWnd As Long, _ DirPath As String, _

Optional Title As String = \"请选择文件夹:\ Optional flage As Long = &H1, _ Optional DirID As Long) As Long Dim BI As BROWSEINFO Dim TempID As Long Dim TempStr As String

TempStr = String$(255, Chr$(0)) With BI

.hOwner = MehWnd .pidlRoot = 0

.lpszTitle = Title + Chr$(0) .ulFlage = flage End With

TempID = SHBrowseForFolder(BI) DirID = TempID

15

If SHGetPathFromIDList(ByVal TempID, ByVal TempStr) Then DirPath = Left$(TempStr, InStr(TempStr, Chr$(0)) - 1) ShowDir = -1 Else ShowDir = 0 End If End Function

定义fnum全局变量用来存放从系统中获取的文件号并定义为整型变量。定义了一个ShowDir函数为长整形。它有五个参数,分别为MehWnd、DirPath、Title、flage、DirID。其中MehWnd和DirPath用来传递控制浏览文件夹操作所需要的两个主要参数。Optional Title As String = \"请选择文件夹:\"-----表示提示用户操作的标题为\"请选择文件夹\"。Dim BI As BROWSEINFO-----为定义BI为结构体BROWSEINFO。然后再定义了两个存放文件字符串和文件所在存储单元的两个变量TempID和TempStr。TempStr = String$(255, Chr$(0)-----为将TempStr的初值设为长度为255数值为0的字符串。With BI的四个参数hOwner、pidlRoot、lpszTitle、ulFlage分别传递值。(其中四个参数前的点号表示的是With语句中点号前省略了With。其中lpszTitle = Title + Chr$(0)-----表示介于开始闭合的任何文本都将出现在浏览器标题栏上)。TempID = SHBrowseForFolder(BI)-----把结构体BI中各个参数传递给浏览文件夹函数SHBrowseForFolder当中的所要进行操作的一些参数。将TempID指定为这些函数值。进而将TempID传递于此函数ShowDir的参数值DirID。如果获取文件号SHGetPathFromIDList与其参数TempID和TempStr传递的结果值为真时,DirPath = Left$(TempStr, InStr(TempStr, Chr$(0)) - 1)-----表示路径名DirPath为TempID和TempStr传递的结果中从TempStr的左边数起,遇到0时结束,并减去一个字符串

此段程序完成了显示文件夹选择对话框并提供用户进行文件选择的操作。 Private Function OperateFile(ByVal vFile As String, _ ByVal vSplit As Boolean ) As Long Dim ItemSize As Long Dim FileSize As Long Dim ReadSize As Long Dim i As Long Dim vArr() As Byte Dim fnum2 As Integer Dim FileName As String Dim SplitFiles As Long

16

所得到的路径名。如果完成此操作则把-1传递给ShowDir,否则将0传递给ShowDir。

If vSplit Then

ItemSize = CLng(Combo1.Text * 1024 * 1024)

ReDim vArr(1 To ItemSize) As Byte

FileName = Right(vFile, InStr(StrReverse(vFile), \"\\\") - 1) fnum = FreeFile()

Open vFile For Binary As fnum FileSize = LOF(fnum) While FileSize > 0 ReadSize = ItemSize

If ReadSize > FileSize Then ReadSize = FileSize ReDim vArr(1 To ReadSize) End If

程序中Private Function OperateFile(ByVal vFile As String, ByVal vSplit As Boolean ) As Long-----表示为定义了一个OperateFile函数,其两个参数vFile和vSplit表示为传递文件的信息和分割与否。然后再定义了文件的大小的变量ItemSize表示为文件所要分割成的大小,FileSize表示为文件的实际大小,ReadSize表示为文件操作时所读取的大小,i表示操作次数,vArr()表示为分割后数组名。fnum2表示为文件操作当中对文件操作中所读取的文件号,FileName表示为文件的名称,SplitFiles表示所分割的文件。如果函数所传递的值vSplit为1则进行分割,否则,为0时进行合并。从控件名为Combo1的文本框中读取所要分割的文件大小,并将其大小乘以1024的平方。其含义为它的大小单位为M。然后取得其以M为单位的大小传递给ItemSize。

将数组定义为大小是1到ItemSize,也就是数组最大值为文件所要分割的大小。将该数组的值定义为Byte型。取得文件的文件名。FileName表示为文件的名称。打开文件取得的文件名是从右边读取,遇到第一个\"\\\"所得到的字符串- 1所得到的字符串就是该文件名。获取一个值为fnum的一个文件号,将这个文件号以二进制的代码打开,然后取得该文件号所表示文件的大小,该文件大小的值为FileSize。

如果所要分割的文件大小大于0的时候,文件的读取大小等于文件的分割大小。如果文件所剩余大小比当前选择的小,就使用剩余大小.。也就是将FileSize 传递给ReadSize。然后重新定义缓冲组为vArr(1 To ReadSize)-----也就是数组的最大值为剩余大小。

Get fnum, i * ItemSize + 1, vArr i = i + 1

fnum2 = FreeFile()

17

Open Trim(Txtobject.Text) & \"\\\" & Trim(Str(i)) & \"_\" & FileName For

Binary As fnum2

Put fnum2, , vArr Close fnum2

FileSize = FileSize – ReadSize Wend Close fnum hsend = FreeFile

Open Trim(Txtobject.Text) & \"\\\" & FileName & \".cut\" For Binary Access

Write As hsend

Put hsend, , FileName Close hsend

MsgBox \"分割成功.\提示信息\"

得到该文件号fnum,然后i加1。申请文件号为fnum2,将路径名为Txtobject.Text加反斜杠加Str(i)加下标再加文件名并以二进制打开并传递给fnum2。当文件总大小减少的时候,将文件的大小减去所读取的大小。并结束循环再关闭该文件号。

申请一个名为hsend的文件号。将路径名为Txtobject.Text加反斜杠加该文件名再加.cut以二进制的代码存储于hsend中。将文件名传递于hsend中。然后显示对话框为分割成功。

以下是合并代码:

Dim FindFile As Boolean

Dim FilePath As String FindFile = True

FileName = Right(vFile, InStr(StrReverse(vFile), \"\\\") - 1) FileName = Left(FileName, Len(FileName) - 4)

FilePath = Left(vFile, Len(vFile) - InStr(StrReverse(vFile), \"\\\") + 1)

vFile = FilePath & \"1\" & \"_\" & FileName fnum = FreeFile()

Open Trim(Txtobject.Text) & \"\\\" & FileName For Binary Access Write

As fnum

While FindFile fnum2 = FreeFile()

Open vFile For Binary As fnum2

18

FileSize = LOF(fnum2) If FileSize > 0 Then ReDim vArr(1 To FileSize) Get fnum2, 1, vArr Put fnum, , vArr Close fnum2 End If i = i + 1

If Dir(Trim(Str(i + 1)) & \"_\" & FileName) = \"\" Then FindFile = False

vFile = FilePath & Trim(Str(i)) & \"_\" & FileName Wend

Close fnum

MsgBox \"合并成功.\提示信息\" End If End Function

定义FindFile为布尔型,表示是不是找到所要分割的文件,定义FilePath为字符串型,表示文件存放的路径。首先将FindFile属性设为真,文件名为从vFile的右边数起遇到第一个反斜杠结束所得到的字符串减去一个字符串所得到该路径的文件为FileName,然后将该文件名从左数起遇到该文件长度的字符串减去四个字符串所得到的给路径的文件传递于FileName,该路径为从vFile的左边数起vFile的长度减去从vFile的左边遇到第一个反斜杠所得到的字符串加1,所的到的字符串为该路径FilePath,原始文件名为所得到的文件路径FilePath加1 再加下标再加该文件名FileName,其实就是分割的反操作。

申请文件号为fnum的文件,即就是分割文件时所用到的而且关闭的文件号,这里无需定义,然后以路径名Txtobject.Tex加反斜杠加文件名FileName的二进制代码存储于该文件中,当文件找到布尔值FindFile为真时,申请分件号为fnum2的文件,即就是文件分割是用到的分割之后的小文件的文件号,这里也无需定义,并将传递来的文件vFile以二进制代码打开,将该文件的大小传给FileSize,即就是小文件的大小,当小文件的大小大于0的时候重新定义缓冲组,该数组的最大值为该文件大小FileSize,重新以该数组的大小合并该文件。

以分割时的反操作小文件号fnum2和总文件号fnum,得到数组中相应文件,在循环语句中没每次i加1,当下一次循环为空时,即下次循环中Str(i + 1)加下标加该文件名为空时,FindFile的布尔值属性为假即False,文件vFile为文件路径FilePath,加Trim(Str(i)加下标加该文件名FileName,结束循环,关闭文件号,显

19

示对话框“合并成功”

4.3 文件分割与合并的具体实现步骤

图4.2 分开展示图1

如图4.2所示,选择文件的分割或合并的选择。 分割选择所实现的功能代码如下: Private Sub Optsplit_Click()

Combo1.Enabled = True cmdsplit.Enabled = True cmdunit.Enabled = False cmdselectfile.Enabled = True cmdfind.Enabled = True End Sub

这段代码的含义是当选择分割的时候,文件大小的选择控件Combo1可以使用,是可见的,可以选择的。分割的决定按钮控件Cmdsplit可以使用,当选择了分割大小以及文件的选择和目的地址之后即可以对文件进行分割。合并控件Cmdunit不可以使用,是不可见的,不可以选择,不允许使用。选择文件控件Cmdselectfile以及文件存放Cmdfind可见,可以使用。其中Enabled决定控件是否允许操作。True允许用户进行操作,False禁止用户进行操作,控件成暗淡色。

合并选择所实现的功能代码如下: Private Sub Optunit_Click()

20

Combo1.Enabled = False cmdsplit.Enabled = False cmdunit.Enabled = True cmdselectfile.Enabled = True cmdfind.Enabled = True End Sub

这段代码的含义是当选择合并的时候,文件大小的选择控件Combo1不可以使用,是不可见的,不可以选择的。分割的决定按钮控件Cmdsplit不可以使用,当选择了合并文件的选择和目的地址之后即可以对文件进行合并。合并控件Cmdunit可以使用,是可见的,可以选择,允许使用。选择文件控件Cmdselectfile以及文件存放Cmdfind可见,可以使用

文件分割大小选择所实现的功能代码如下: Private Sub Form_Load()

Combo1.List(0) = \"0.1\" Combo1.List(1) = \"0.5\" Combo1.List(2) = \"1.0\" Combo1.List(3) = \"1.2\" Combo1.List(4) = \"2.0\" Combo1.List(5) = \"10\" Combo1.List(6) = \"32\" Combo1.List(7) = \"64\" Combo1.List(8) = \"128\" End Sub

这段代码的含义是在选择分割大小的时候,可以选择本软件工具所设定的从0.1---128M的选项大小进行分割。分割大小的单位由于经常是以M为大小来进行分割的,所以本软件已经设定好以M为单位来进行分割。也可以用户自主按照自己所需要的大小来进行分割。 取得分割大小的代码:

ItemSize = CLng(Combo1.Text * 1024 * 1024)

这在4.2 节里已经介绍过了,在此就不再解释了。

如图4.3所示,文件的选择与文件夹的选择。 “选择文件”功能实现的程序代码: Private Sub cmdselectfile_Click()

If Optsplit.Value Then

cdgfindfile.Filter = \"全部文件(*.*)|*.*|文本文件(*.txt)|*.txt\"

21

Else

cdgfindfile.Filter = \"全部文件(*.cut)|*.cut\" End If

cdgfindfile.DialogTitle = \"选择要操作的文件\" cdgfindfile.ShowOpen

If Trim(cdgfindfile.FileName) <> \"\" Then Txtsourcefile.Text = cdgfindfile.FileName End If

End Sub

当选择分割的值为真时,选择文件所显示全部文件,否则就是合并,此时选择.cut文件,文件操作对话框名称为“选择要操作的文件”,如果该文件的文件名不为空,将该文件名写进选择文件框的文本框。

图4.3 分开展示图2

“选择文件夹”功能实现的程序代码:

Private Sub cmdfind_Click()

Dim TmpPath As String

ShowDir Me.hWnd, TmpPath If Trim(TmpPath) <> \"\" Then Txtobject.Text = Trim(TmpPath) End If

End Sub

传递参数MehWnd和TmpPath给ShowDir函数,如果该路径TmpPath不为空的时候,TmpPath的路径名写进选择目标文件夹的文本框。

22

如图4.4所示,文件的分割与合并的功能。 “分割”功能实现代码: Private Sub cmdsplit_Click()

If Trim(Txtsourcefile.Text) = \"\" Then MsgBox \"请选择要分割的文件.\" OperateFile Txtsourcefile.Text, True

End Sub

如果选择文件的文本框的内容为空,显示提示对话框“请选择要分割的文件”,操作分割文本框中所显示的文件。 “合并”功能实现代码: Private Sub cmdunit_Click()

OperateFile Txtsourcefile.Text, False

End Sub 操作合并目标文件文本框中显示的内容。

图4.4 分开展示图3

5 系统功能的实现

5.1 分割的实现

在文件的启动以后首先进入本软件的操作界面。操作界面主要由以下几部分组成:文件的分割与合并主选项、文件大小的选择选项、选择文件选项、选择文件夹选项、最后确定文件的合并与分割的选项。

当需要分割的时候从界面的选项中选定分割选项,并从分割文件包尺寸中选定需要选择的大小(本次功能实现选择的是1M),若软件提供的大小不满足用户的需要时,用户可以自主输入自己所需要的大小。

然后选择的是“选择文件”选项。当点击“选择文件”时,会出现选择文件的对

23

话框如图5.1所示。用鼠标点击所需要分割的文件选择,选择后点击打开按钮即可实现。

图5.1 选择文件对话框

本次的功能实现选择的是E:\\v\\赵洪\\一起吃苦的幸福.mp3。

在点击“选择文件夹”的时候出现图5.2的界面。本次功能实现选择的是E:\\v\\赵洪\\文件的分割。

再点击“分割”按钮时,当实现了分割的功能时,界面会出现“分割成功”的对话框。至此分割的功能就已经完全实现。

图5.2 浏览文件夹

再点击“分割”按钮时,当实现了分割的功能时,界面会出现“分割成功”的对话框。如图5.3所示。至此分割的功能就已经完全实现。

24

图5.3 分割成功显示界面

当分割的功能实现的时候,在文件夹E:\\v\\赵洪\\文件的分割中出现了如图5.4所示的界面。我们可以看到由于此mp3的大小是6.06M。所以分成了七份。其中前6份每份的大小是1M。第七个的大小是0.06M。最后形成了一个mp3.Cut的文件。此文件里面保留着文件的分割信息,以备合并的时候使用。这也是本软件的核心思想。

图5.4 分割后的文件界面

5.2 合并的实现

在文件的分割的时候首先进入本软件界面并打开所实现的文件的分割与合并的软件。当运行程序时,会出现本软件的开始界面。

25

当需要合并的时候从界面的上选项中选定合并选项。此时可以看到“分割文件包” 的功能成浅色,无法选择。

然后选择的是“选择文件”选项。当点击“选择文件”时,会出现选择文件的对话框。本次功能实现选择的是E:\\v\\赵洪\\文件的分割\\一起吃苦的幸福.mp3.cut。在这次的功能实现中由于保存信息的是.cut文件。所以在选择的界面中只出现.cut文件。

在点击“选择文件夹”的时候出现的界面。本次功能实现选择的是E:\\v\\赵洪\\文件的分割。

再点击“合并”按钮时,当实现了分割的功能时,界面会出现“合并成功”的对话框。至此分割的功能就已经完全实现。

当合并成功以后进入到E:\\v\\赵洪\\文件的分割 所看到的界面如图所示。在文件夹中显示了分割的七个文件和.cut文件和已经合并过了的原来的文件。至此,文件的合并功能也完全实现。

图5.5 合并成功的显示界面

26

图5.5 合并以后的文件界面

6 主要问题的解决过程

在本系统的设计过程中,我遇到了不少的难题。其中一些是因为没有清楚VB环境而出现的简单错误。而其中也有较为复杂的,通过老师的指导和自己的钻研得到绝大部分的解决,这对我的编程有一定的帮助,通过解决这些问题,积累了经验。

因为软件知识自己知道的不是很多。在设计之初对毕业设计的题目很迷惑,不知道如何下手。在老师的耐心指导下使我对毕业设计的思想有了大体上的理解。再加上通过一个多月的细心学习,在老师推荐的参考书的学习中使我对设计的细节也有了很多了解,逐步增加了我学习本软件的信心。

在设计的过程中出现了各种各样的问题,软件的调试不通等问题就不多说了,在设计过程中自己对VB的循环语句总是掌握不了,知道了总体的思想,但是在细节的编程上面还是无从下手。于是自己就不管对错,把自己想编写的程序都写下来,在逐步调试的过程中使自己得到了信心和收获。

7 结论

毕业设计是对一个大学生四年学习成绩的检查,也是对知识的再次提高。通过这次毕业设计,我各方面的能力都有很大提高:

对理论知识的提高:

27

通过这次毕业设计,不仅使我对以前学过的课程有了更进一步的学习提高,最主要的就是我又掌握了一种程序设计软件Visual Basic 6.0。

动手实践能力的提高:

以前对程序设计,软件制作几乎停留在理论的认识上,很少实践,通过这次毕业设计,对自己在软件界面的设计、程序代码编写和实际操作能力等方面都有了很大的提高。

学习方法及自学能力的提高:

通过这次毕业设计,我学到了不少的知识,熟悉了软件开发的全过程;基本掌握了用VB语言编写程序及如何用VB制作一个控件的方法;提高了我独立分析问题,解决问题的能力。使我通过亲自实践真正了解到软件开发的全部环节,及每个环节的主要任务和应注意的问题。

参考文献

[1] 史斌星,史佳. Visual Basic贯通教程[M].北京:清华大学出版社,2003.5 [2] 张宏林,孔艳,王哲. Visual Basic开发数据库[M].北京:人民邮电出版社,2000.8 [3] 王成春,潇雅云. 实战Access2003 VBA程序设计[M].北京:中国铁道出版社,2005.1 [4] 谭浩强,薛淑斌,袁玫.Visual BASIC 程序设计[M].北京:清华大学出版社,2000.3 [5] 袭沛曾,陆慰民,杨志强. Visual Basic程序设计教程[M].北京:高等教育出版社, 2000.8 [6] 张树兵,戴红.Microsoft Visual Basic 6.0入门与提高[M].北京:清华大学出版社,2001.5 [7] 李天启. Microsoft Visual Basic 6.0学习捷径[M].北京:清华大学出版社,1996.5 [8] 李楠,李志强. Microsoft Visual Basic 6.0入门与提高[M].北京:人民邮电出版社,1998.12 [9] 王成春,萧雅云. 实战Access程序设计[M].北京:中国铁道出版社,2005.1 [10]王成春. Microsoft Visual Basic 6.0入门[M].北京:人民邮电出版社,1998.12

28

因篇幅问题不能全部显示,请点此查看更多更全内容