搜索
您的当前位置:首页正文

.NET程序设计期末大作业实验报告

来源:爱够旅游网
.NET程序设计实验报告

班级: 物联1302 学号: 姓名: 高华 成绩:_________

一、 实验名称:

多功能文件助手(包含文件分割、合并、压缩、解压等功能)

二、 实验目的:

1、 设计并实现一个多功能文件助手的软件。该软件拥有文件分割、文件合并、文件压缩、文件解压缩的功能。

2、 文件分割与文件合并功能可以根据用户指定的文件大小将大文件分

割为若干个容量相同的小文件并可将这些小文件合并为原始文件。 3、 文件压缩和文件解压缩功能可以使用文件的GZip压缩的方法进行文

件的压缩和解压操作。

4、 代码易读,软件界面友好,使用合适的控件,操作简便。

三、 实验过程和算法描述

程序功能简述 1、用户界面设计

界面使用选项卡控件即TabControl控件分为分割、合并、GZip压缩、Gzip解压四部分(截图如下)

1

(1)主界面窗体属性如下表: 属性 Name Text MaxmizeBox AutoSizeMode StartPosition 属性值 MainFrm 文件分割与合并 False GrowAndSrink CenterScreen 说明 主窗体的Name属性 将系统最大化按钮设置为不可用 不能手动调整窗体的大小 窗体第一次出现的位置为屏幕中央 (2)选项卡控件即TabControl控件的Name属性设置为tabSel。Appearance属性设置为Normal。然后设置TabPages属性,单击该属性弹出“TabPage集合编辑器”对话框,设置连个选项卡。Name属性分别为pageSplit和pageMerge;Text属性分别为“文件分割”和“文件合并”。 (3)“文件分割”选项卡界面控件属性设置 控件类型 Lable Lable3 Lable4 TextBox txtDesDir Button ComboBox btnSource btnDes btnOK cboSize Items ProgressBar ProgBarSplit 1,5,10 ReadOnly Text Text Text True 浏览 浏览 开始分割 Text Text 控件名称 Lable1 Lable2 属性 Text Text 属性值 源文件存放目录 分割后的文件存放目录 请选择分割单位 (单位:M) True 显示用户选择的源文件路径 显示用户选择的目的文件路径 不允许用户输入分割单位 分割单位选项 显示分割进度 说明 txtSourceDir ReadOnly DropDownStyle DropDownList (注:另外三个选项卡的主要控件及其主要属性设置与本页遵循相同的规则,此处不再加以罗列。)

2、算法设计 1) 文件分割

2

定义用来存放数据的字段在第一个浏览按钮的单击事件中,实例化一个OpenFileDialog的实例并在用户选定路径后记录原文件的存储路径在第二个浏览按钮的单击时间中实例化一个FolderBrowserDlg的一个实例并在用户选定的存放路径编写代码处理文件分割提示用户分割完成,释放系统资源 上流程图中编写代码处理文件分割为核心代码区,程序确定徐分割的原文件及分割的单位后,计算得出该原文件分割后应得到的文件数目,并以源文件的名链接小文件序号作为小文件的名称。然后,通过创建BinaryReader实例从源文件以小文件的大小读取数据,并通过创建BinaryWriter实例想创建的小文件中写入数据,循环此操作,最终实现把源文件分割成多个小文件。 2) 文件合并

定义MainFrm类的字段在属性为btnMergeSrc的按钮的单击事件中编写代码接受源文件存储路径在Name属性为btnMergDes的按钮的单击事件中编写代码接受合并后文件的存放路径为“开始合并”按钮编写文件合并的代码提示合并成功并释放系统资源 文件合并操作中,用户需选择分割文件中编号为“0001”的小文件,通过Directory类的GetFiles找到源文件所在目录中文件名汁编号不同的所有文件,计算得出该类型文件的数目,通过循环按此目录文件名称的顺序读取文件形成数据流,并使用BinaryWriter不断追加,循环结束即合并文件完成。

3) GZip文件压缩

3

通过用户指定,找到并记录源文件的存储路径打开文件并使用StreamReader的ReadToEnd方法将数据读入string类型的data中用data.length将文件的大小通过listBox控件显示给用户通过用户指定,找到并记录文件的输出路径通过创建FileStream的实例创建压缩文件创建GZipStream和流写入器StreamWrite的实例将压缩后的数据写入上一步创建的压缩文件中提示压缩成功,显示压缩文件大小,释放系统资源 本功能主要利用GZipStream类型来对文本文件内容进行GZip压缩。首先将需要压缩的文件数据以只读方式读出,然后创建GZipStream类型对象CompressionStream,最后通过流写入器对象writer向压缩流

compressionStream中写入需要压缩的文件数据,此时compressionStream已将文件数据进行压缩并写入了新的文件中。 4) Gzip文件解压缩

通过用户指定,找到并记录待解压文件的存储路径通过用户指定,找到并记录解压后文件的存放路径创建GZipStream和流读取器StreamReader的实例读取并显示原文件大小根据用户指定的路径创建解压后文件并用StreamWriter将解压后的数据写入释放系统资源 本功能利用GZipStream类型对象对GZip压缩的文件进行解压缩。首先读取压缩文件中的数据,然后创建GZip类型对象compressionStream,通过文本流读取器从compressionStream中读取解压缩后的文件数据,最后将加压缩后的数据写入新的文件中。 四、 实验结果及分析

4

1、未实现的功能及分析

(1) 其实我之所以把它命名为“多功能文件助手”,是因为除了现有功能之外

还有文件加密和文件解密的功能。但是在实际制作的时候始终找不到DESCryptoServiceProvider所需要的引用,

System.Security.Cryptography命名空间直接添加无效。MSDN上说所需的程序集:mscorlib(在 mscorlib.dll 中),可是从网上下载又放到相应位置添加时引用依旧找不到,最后放弃了。

(2) GZip压缩和GZip解压缩选项卡中的进度条并不能真正的显示压缩和解压

的进度。那个地方真的废了好大的劲,可惜最后还是没做出来。由于陈旭是单线程的,文件的写入过程都是从开始写入到写入完成才能干其他的事,所以无法一边写入一边照应进度条的进度。于是我想到了多线程,但是当我用到多线程的时候由于需要跨线程访问写入进度又出现了安全性问题(两个线程可能同时访问同一对象)。于是我又试着使用Invoke方法,不幸的是可能我没看懂,还是失败了。所以现在的进度条虽然有效果,但是其实是写入完成后进度条才开始动的,并不能实时显示进度。 2、实现了但是有缺陷的功能

(1)FileStream fileCompress = File.OpenRead(srcDaiJieFilename);//打开压缩文件

listBoxUnzip.Items.Add(\"压缩文件大小: \" + fileCompress.Length / 1024 + \" KB\");//

在listBoxUnzip控件中显示压缩文件大小

fileCompress.Close();

文件解压缩时为了在用户选定源文件路径后就能显示源文件的大小,我就在用户选定后就立即打开文件,并显示大小。为了防止影响下面的操作和即使释放系统资源,显示大小后就立即关闭。我认为这种做法不是一种好的方法,但是并没有想到其他方法。 (2)解压文件

解压文件时,在listbox中返回的解压后文件大小事正常的,和压缩前的源文件大小一致,但是当我实际找到解压后的文件时发现他的大小事压缩前的源文件的两倍多接近三倍,目前还没有找到原因。 3、发现并解决了的问题

按照书中代码做好文件合并后,发现文件合并操作虽然提示成功实际上并没有合并而仅仅是把分割后的小文件的第一个文件复制的一遍。后来发现书中文件合并部分的代码有误。 原代码为:

filename = fileName + \"*.\" + fileExtra; //得到所有需合并的小文件的名称 //使用GetFile方法获取率小文件所在目录中所有需合并的小文件 arrFileNames = Directory.GetFiles(srcMerFilename, filename); iFileCount = arrFileNames.Length;

//获得合并后的文件名(删除小文件名尾部的编号)

filename = fileName.Substring(0, fileName.Length - 4);

5

progBarMerge.Maximum = iFileCount;

//以合并后的文件名称和打开方式来创建并初始化FileStream文件流

desMergeStream = new FileStream(txtMergDes.Text + \"\\\\\" + fileName + \".\" + fileExtra, FileMode.OpenOrCreate);

更正后为:

//获得合并后的文件名(删除小文件名尾部的编号)

fileName = fileName.Substring(0, fileName.Length - 4);

filename = fileName + \"*.\" + fileExtra; //得到所有需合并的小文件的名称 //使用GetFile方法获取率小文件所在目录中所有需合并的小文件 arrFileNames = Directory.GetFiles(srcMerFilename, filename); iFileCount = arrFileNames.Length;

//获得合并后的文件名(删除小文件名尾部的编号)

//filename = fileName.Substring(0, fileName.Length - 4); progBarMerge.Maximum = iFileCount;

//以合并后的文件名称和打开方式来创建并初始化FileStream文件流

desMergeStream = new FileStream(txtMergDes.Text + \"\\\\\" + fileName + \".\" + fileExtra, FileMode.OpenOrCreate);

a、原代码中变量名混淆

由于编者定义了fileName又定义了filename。终于还是把自己弄混了 b、原代码中顺序错误

原代码中还没有为fileName赋新值就使用了,导致fileName中的数据可能还是上次操作中的甚至是不可预测的,导致文件合并失败。

五、 总结

匆匆忙忙的这门课就要结束了,由于我在这门课上花的时间不多所以,学到的东西也不多,但是在做大作业的这几天里,我收获很大,最主要的是获得了一些感悟和启示。这门课让我对编程有了进一步的了解,相信在以后的学习中一定能起到很好的推进作用。

6

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

Top