《NET程序设计期末大作业实验报告.pdf》由会员分享,可在线阅读,更多相关《NET程序设计期末大作业实验报告.pdf(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、.NET.NET 程序设计实验报告程序设计实验报告班级:班级:物联物联13021302学号:学号:姓名:姓名:高华高华成绩:成绩:_一、一、实验名称:实验名称:多功能文件助手(包含文件分割、合并、压缩、解压等功能)二、二、实验目的:实验目的:1、设计并实现一个多功能文件助手的软件。该软件拥有文件分割、文件合并、文件压缩、文件解压缩的功能。2、文件分割与文件合并功能可以根据用户指定的文件大小将大文件分割为若干个容量相同的小文件并可将这些小文件合并为原始文件。3、文件压缩和文件解压缩功能可以使用文件的 GZip 压缩的方法进行文件的压缩和解压操作。4、代码易读,软件界面友好,使用合适的控件,操作简
2、便。三、实验过程和算法描述实验过程和算法描述程序功能简述程序功能简述1、用户界面设计界面使用选项卡控件即 TabControl 控件分为分割、合并、GZip 压缩、Gzip解压四部分(截图如下)1(1)主界面窗体属性如下表:属性属性NameNameTextTextMaxmizeBoxMaxmizeBoxAutoSizeModeAutoSizeModeStartPositionStartPosition属性值属性值MainFrm文件分割与合并FalseGrowAndSrinkCenterScreen说明说明主窗体的 Name 属性将系统最大化按钮设置为不可用不能手动调整窗体的大小窗体第一次出现的
3、位置为屏幕中央(2)选项卡控件即 TabControl 控件的 Name 属性设置为 tabSel。Appearance属性设置为 Normal。然后设置 TabPages 属性,单击该属性弹出“TabPage 集合编辑器”对话框,设置连个选项卡。Name 属性分别为 pageSplit 和 pageMerge;Text 属性分别为“文件分割”和“文件合并”。(3)“文件分割”选项卡界面控件属性设置控件类型控件类型LableLableLable3Lable4TextBoxTextBoxtxtDesDirButtonButtonComboBoxComboBoxbtnSourcebtnDesbtn
4、OKcboSizeItemsProgressBarProgressBarProgBarSplit1,5,10ReadOnlyTextTextTextTrue浏览浏览开始分割TextText控件名称控件名称Lable1Lable2属性属性TextText属性值属性值源文件存放目录分割后的文件存放目录请选择分割单位(单位:M)True显示用户选择的源文件路径显示用户选择的目的文件路径不允许用户输入分割单位分割单位选项显示分割进度说明说明txtSourceDirReadOnlyDropDownStyleDropDownList(注:另外三个选项卡的主要控件及其主要属性设置与本页遵循相同的规则,此处不
5、再加以罗列。)2、算法设计1)文件分割2定义用来存放数据的字段在第一个浏览按钮的单击事件中,实例化一个OpenFileDialog的实例并在用户选定路径后记录原文件的存储路径在第二个浏览按钮的单击时间中实例化一个FolderBrowserDlg的一个实例并在用户选定的存放路径编写代码处理文件分割提示用户分割完成,释放系统资源上流程图中编写代码处理文件分割为核心代码区,程序确定徐分割的原文件及分割的单位后,计算得出该原文件分割后应得到的文件数目,并以源文件的名链接小文件序号作为小文件的名称。然后,通过创建 BinaryReader实例从源文件以小文件的大小读取数据,并通过创建 BinaryWri
6、ter 实例想创建的小文件中写入数据,循环此操作,最终实现把源文件分割成多个小文件。2)文件合并定义MainFrm类的字段在属性为btnMergeSrc的按钮的单击事件中编写代码接受源文件存储路径在Name属性为btnMergDes的按钮的单击事件中编写代码接受合并后文件的存放路径为“开始合并”按钮编写文件合并的代码提示合并成功并释放系统资源文件合并操作中,用户需选择分割文件中编号为“0001”的小文件,通过 Directory 类的 GetFiles 找到源文件所在目录中文件名汁编号不同的所有文件,计算得出该类型文件的数目,通过循环按此目录文件名称的顺序读取文件形成数据流,并使用 Binar
7、yWriter 不断追加,循环结束即合并文件完成。3)GZip 文件压缩3通过用户指定,找到并记录源文件的存储路径打开文件并使用StreamReader的ReadToEnd方法将数据读入string类型的data中用data.length将文件的大小通过listBox控件显示给用户通过用户指定,找到并记录文件的输出路径通过创建FileStream的实例创建压缩文件创建GZipStream和流写入器StreamWrite的实例将压缩后的数据写入上一步创建的压缩文件中提示压缩成功,显示压缩文件大小,释放系统资源本功能主要利用 GZipStream 类型来对文本文件内容进行 GZip 压缩。首先将需
8、要压缩的文件数据以只读方式读出,然后创建 GZipStream 类型对象CompressionStream,最后通过流写入器对象 writer 向压缩流compressionStream 中写入需要压缩的文件数据,此时 compressionStream 已将文件数据进行压缩并写入了新的文件中。4)Gzip 文件解压缩通过用户指定,找到并记录待解压文件的存储路径通过用户指定,找到并记录解压后文件的存放路径创建GZipStream和流读取器StreamReader的实例读取并显示原文件大小根据用户指定的路径创建解压后文件并用StreamWriter将解压后的数据写入释放系统资源本功能利用 GZi
9、pStream 类型对象对 GZip 压缩的文件进行解压缩。首先读取压缩文件中的数据,然后创建 GZip 类型对象 compressionStream,通过文本流读取器从 compressionStream 中读取解压缩后的文件数据,最后将加压缩后的数据写入新的文件中。四、实验结果及分析41、未实现的功能及分析(1)其实我之所以把它命名为“多功能文件助手”,是因为除了现有功能之外还有文件加密和文件解密的功能。但是在实际制作的时候始终找不到DESCryptoServiceProvider 所需要的引用,System.Security.Cryptography 命名空间直接添加无效。MSDN 上说
10、所需的程序集:mscorlib(在 mscorlib.dll 中),可是从网上下载又放到相应位置添加时引用依旧找不到,最后放弃了。(2)GZip 压缩和 GZip 解压缩选项卡中的进度条并不能真正的显示压缩和解压的进度。那个地方真的废了好大的劲,可惜最后还是没做出来。由于陈旭是单线程的,文件的写入过程都是从开始写入到写入完成才能干其他的事,所以无法一边写入一边照应进度条的进度。于是我想到了多线程,但是当我用到多线程的时候由于需要跨线程访问写入进度又出现了安全性问题(两个线程可能同时访问同一对象)。于是我又试着使用 Invoke 方法,不幸的是可能我没看懂,还是失败了。所以现在的进度条虽然有效果
11、,但是其实是写入完成后进度条才开始动的,并不能实时显示进度。2、实现了但是有缺陷的功能(1)FileStream fileCompress=File.OpenRead(srcDaiJieFilename);/打开压缩文件 listBoxUnzip.Items.Add(压缩文件大小:+fileCompress.Length/1024+KB);/在listBoxUnzip控件中显示压缩文件大小 fileCompress.Close();文件解压缩时为了在用户选定源文件路径后就能显示源文件的大小,我就在用户选定后就立即打开文件,并显示大小。为了防止影响下面的操作和即使释放系统资源,显示大小后就立即关
12、闭。我认为这种做法不是一种好的方法,但是并没有想到其他方法。(2)解压文件解压文件时,在 listbox 中返回的解压后文件大小事正常的,和压缩前的源文件大小一致,但是当我实际找到解压后的文件时发现他的大小事压缩前的源文件的两倍多接近三倍,目前还没有找到原因。3、发现并解决了的问题按照书中代码做好文件合并后,发现文件合并操作虽然提示成功实际上并没有合并而仅仅是把分割后的小文件的第一个文件复制的一遍。后来发现书中文件合并部分的代码有误。原代码为:filename=fileName+*.+fileExtra;/得到所有需合并的小文件的名称/使用GetFile方法获取率小文件所在目录中所有需合并的小
13、文件arrFileNames=Directory.GetFiles(srcMerFilename,filename);iFileCount=arrFileNames.Length;/获得合并后的文件名(删除小文件名尾部的编号)filename=fileName.Substring(0,fileName.Length-4);5progBarMerge.Maximum=iFileCount;/以合并后的文件名称和打开方式来创建并初始化FileStream文件流desMergeStream=new FileStream(txtMergDes.Text+fileName+.+fileExtra,Fil
14、eMode.OpenOrCreate);更正后为:/获得合并后的文件名(删除小文件名尾部的编号)fileName=fileName.Substring(0,fileName.Length-4);filename=fileName+*.+fileExtra;/得到所有需合并的小文件的名称/使用GetFile方法获取率小文件所在目录中所有需合并的小文件arrFileNames=Directory.GetFiles(srcMerFilename,filename);iFileCount=arrFileNames.Length;/获得合并后的文件名(删除小文件名尾部的编号)/filename=file
15、Name.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
限制150内