四.Visual C#实现合并文件的解决方法及其具体实现步骤:
Visual C#实现合并文件的思路是首先获得要合并文件所在的目录,然后确定所在目录的文件数目,最后通过循环按此目录文件名称的顺序读取文件,形成数据流,并使用BinaryWriter在不断追加,循环结束即合并文件完成。具体的实现方法请参考下面步骤中的第步。以下就是Visual C#实现合并文件的具体实现步骤:
1. 启动Visual Studio .Net。
2. 选择菜单【文件】|【新建】|【项目】后,弹出【新建项目】对话框。
3. 将【项目类型】设置为【Visual C#项目】。
4. 将【模板】设置为【Windows应用程序】。
5. 在【名称】文本框中输入【合并程序】。
6. 在【位置】的文本框中输入【E:\VS.NET项目】,然后单击【确定】按钮,这样在"E:\VS.NET项目"目录中就产生了名称为"合并程序"的文件夹,并在里面创建了名称为"合并程序"的项目文件。具体如图04所示:
图04:【合并程序】项目之【新建项目】对话框 |
7. 把Visual Studio .Net的当前窗口切换到【Form1.cs(设计)】窗口,并从【工具箱】中的【Windows窗体组件】选项卡中往Form1窗体中拖入下列组件,并执行相应的操作:
一个OpenFileDialog组件,用于选择一个合并文件。
一个ProgressBar组件,用以显示文件合并的进度。
二个TextBox组件,分别用以显示OpenFileDialog组件选择后的文件和输入合并后的大文件的名称。
二个Label组件。
二个Button组件,分别用以选择一个合并文件和对选定目录中的所有文件进行合并,并在这二个Button组件拖入Form1的设计窗体后,双击它们,则系统会在Form1.cs文件分别产生这二个组件的Click事件对应的处理代码。
13. 把Visual Studio .Net的当前窗口切换到【Form1.cs(设计)】窗口,并按照表06所示数值来调整组件的主要属性:
组件类型 | 组件名称 | 属性 | 设置结果 |
Button | button1 | FlatStyle | Flat |
button1 | Text | 执行 | |
button2 | FlatStyle | Popup | |
button2 | Text | ... | |
Form | Form1 | Text | 合并程序 |
Form1 | MaximizeBox | False | |
Form1 | MinimizeBox | True | |
Form1 | FormBorderStyle | FormBorderStyle.FixedSingle | |
Label | label1 | Text | 请选择大小: |
label2 | Text | 选择文件: | |
TextBox | TextBox1 | Text | |
TextBox2 | Text |
表06:【文件分割】项目中主要组件属性设定数值表
至此【合并程序】项目的界面设计和功能实现的准备工作就完成了,设计后的界面如图05所示:
图05:【合并程序】项目的设计后的界面 |
8. 在【解决方案资源管理器】窗口中,双击Form1.cs文件,进入Form1.cs文件的编辑界面。并在Form1.cs文件的开头,用下列导入命名空间代码替代系统缺省的导入命名空间代码。
using System ; using System.Drawing ; using System.Collections ; using System.ComponentModel ; using System.Windows.Forms ; using System.Data ; using System.IO ; using System.Text ; using System.Data.OleDb ; |
9. 在From1.cs的class代码区添加下列代码,下列代码是定义一个字符串全局变量,用以存放合并文件所在目录:
public string sDirectoryName = "" ; //定义一个全局变量,用以存放合并文件所在的目录 |
10. 用下列代码替换Form1.cs中的button2的Click事件对应的处理代码,下列代码功能是根据文件选择对话框获得文件所在的目录,为后面的文件合并做准备:
private void button2_Click ( object sender , System.EventArgs e ) { openFileDialog1.Title ="请选择要合并的第一个文件" ; System.Windows.Forms.DialogResult drTemp = openFileDialog1.ShowDialog ( ) ; if ( drTemp == DialogResult.OK && openFileDialog1.FileName != "" ) { textBox1.Text = openFileDialog1.FileName ; } string[ ] path = openFileDialog1.FileName .Split ( @"\".ToCharArray ( ) ) ; string sTemp = "" ; int i= 0 ; for ( i= 0 ; i < path.Length - 1 ; i++ ) { sTemp = sTemp + path[ i ] + @"\" ; } button1.Enabled = true ; sDirectoryName= sTemp ; //获得文件所在目录 } |
11. 用下列代码替换Form1.cs中的button1的Click事件对应的处理代码,下列代码功能是合并获得的文件所在目录里面的所有文件,并生成合并文件:
private void button1_Click ( object sender , System.EventArgs e ) { string[ ] arrFileNames = Directory.GetFiles ( sDirectoryName ) ; //获取存放分割后小文件所在目录所在的所有小文件 int iSumFile = arrFileNames.Length ; progressBar1.Maximum = iSumFile ; FileStream AddStream = new FileStream ( textBox2.Text , FileMode.OpenOrCreate ) ; //以合并后的文件名称和打开方式来创建、初始化FileStream文件流 BinaryWriter AddWriter = new BinaryWriter ( AddStream ) ; //以FileStream文件流来初始化BinaryWriter书写器,此用以合并分割的文件 /*循环合并小文件,并生成合并文件 */ for ( int i = 0 ; i < iSumFile ; i++ ) { FileStream TempStream = new FileStream ( arrFileNames[ i ] , FileMode.Open ) ; //以小文件所对应的文件名称和打开模式来初始化FileStream文件流,起读取分割作用 BinaryReader TempReader = new BinaryReader ( TempStream ) ; //用FileStream文件流来初始化BinaryReader文件阅读器,也起读取分割文件作用 AddWriter.Write ( TempReader.ReadBytes ( ( int ) TempStream.Length ) ) ; //读取分割文件中的数据,并生成合并后文件 TempReader.Close ( ) ; //关闭BinaryReader文件阅读器 TempStream.Close ( ) ; //关闭FileStream文件流 progressBar1.Value = i + 1 ; //显示合并进程 } AddWriter.Close ( ) ; //关闭BinaryWriter文件书写器 AddStream.Close ( ) ; //关闭FileStream文件流 MessageBox.Show ( "成功合并!" ) ; progressBar1.Value = 0 ; } |
12. 至此在上述步骤都正确完成后,【合并程序】项目的全部工作就基本完成了。此时单击快捷键F5运行程序,单击【…】按钮选择分割后文件所在目录的任一文件,再输入合并后文件的名称后,单击【执行】按钮,则程序就能够把合并选择目录中的所有文件,并查杀输入的合并文件。图06是【合并程序】项目的运行界面:
图06:【合并程序】项目的运行界面 |
五.总结:
Visual C#之所以拥有很强的文件处理能力是因为在.Net FrameWork SDK中提供了许多处理文件的类。实现分割大文件程序和合并小文件程序应该是文件编程中比较复杂的应用了,但通过本文的介绍,可见主要使用的是FileStream、BinaryReader和BinaryWriter三个类就基本完成了,并且代码量也不是很多。其实掌握Visual C#对文件的处理,这三个类是关键,也是重点和难点,因为其他处理文件的类要么和这三个类的用法相似,要么结构简单,容易掌握。最后希望本文能够对您掌握Visual C#,精通Visual C#的文件编程有所帮助。