public FileStream (
string path ,
FileMode mode
) ;
FileStream SplitFileStream = new FileStream ( "C:\\temp.avi" , FileMode.Open ) ;
public BinaryReader ( Stream ) ;
BinaryReader SplitFileReader = new BinaryReader ( SplitFileStream ) ;
public BinaryWriter ( Stream ) ;
BinaryWriter TempWriter = new BinaryWriter (SplitFileStream) ;
表04:BinaryWriter类常用方法及其说明
至此Visual C#实现分割合并程序时所主要使用的类就介绍完了,下面就来介绍Visual C#实现分割文件的解决方法及其具体实现步骤。
三.Visual C#实现分割文件的解决方法及其具体实现步骤:
分割文件其实思路比较简单,首先要确定要分割成小文件的大小,然后确定大文件以此大小分割后的文件数目,并确定小文件的名称,最后通过创建的BinaryReader实例从大文件以确定的小文件大小读取数据,并通过创建BinaryWriter实例向创建的小文件中写入数据,循环此操作,最终实现把大文件分割成的多个小文件。其具体的实现方法请参考下面实现步骤中的第十步。以下就是Visual C#实现分割大文件程序的具体实现步骤:
1. 启动Visual Studio .Net。
2. 选择菜单【文件】|【新建】|【项目】后,弹出【新建项目】对话框。
3. 将【项目类型】设置为【Visual C#项目】。
4. 将【模板】设置为【Windows应用程序】。
5. 在【名称】文本框中输入【文件分割】。
6. 在【位置】的文本框中输入【E:\VS.NET项目】,然后单击【确定】按钮,这样在"E:\VS.NET项目"目录中就产生了名称为"文件分割"的文件夹,并在里面创建了名称为"文件分割"的项目文件。具体如图01所示:
图01:【文件分割】项目之【新建项目】对话框
7. 把Visual Studio .Net的当前窗口切换到【Form1.cs(设计)】窗口,并从【工具箱】中的【Windows窗体组件】选项卡中往Form1窗体中拖入下列组件,并执行相应的操作:
一个OpenFileDialog组件,用于选择要分割的大文件。
一个ProgressBar组件,用以显示文件分割的进度。
一个ComboBox组件,用以选择文件分割的大小。
二个TextBox组件,分别用以显示OpenFileDialog组件选择后的文件和输入分割后小文件存放的目录。
四个Label组件。
二个Button组件,分别用以选择要分割的大文件和对选定文件进行分割,并在这二个Button组件拖入Form1的设计窗体后,双击它们,则系统会在Form1.cs文件分别产生这二个组件的Click事件对应的处理代码。
8. 把Visual Studio .Net的当前窗口切换到【Form1.cs(设计)】窗口,并按照表05所示数值来调整组件的主要属性:
组件类型
组件名称
属性
设置结果
Button
button1
FlatStyle
Flat
button1
Text
执行
button2
FlatStyle
Popup
button2
Text
...
Form
Form1
Text
文件分割
Form1
MaximizeBox
False
Form1
MinimizeBox
True
Form1
FormBorderStyle
FormBorderStyle.FixedSingle
ComboBox
comboBox1
Items
720
comboBox1
Items
1440
comboBox1
Items
2880
Label
label1
Text
请选择大小:
label2
Text
请选择文件:
label3
Text
输入存放目录:
label4
Text
(单位:K)
TextBox
TextBox1
Text
TextBox2
Text
表05:【文件分割】项目中组件主要属性设定数值表
至此【文件分割】项目的界面设计和功能实现的准备工作就完成了,设计后的界面如图02所示:
图02:【文件分割】项目的设计后的界面
9. 在【解决方案资源管理器】窗口中,双击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 ;
using System.Windows.Forms.Design ;
private void button2_Click ( object sender , System.EventArgs e )
{
openFileDialog1.Title = "请选择要分割的文件名称" ;
DialogResult drTemp = openFileDialog1.ShowDialog ( ) ;
if ( drTemp == DialogResult.OK && openFileDialog1.FileName != string.Empty )
{
textBox1.Text = openFileDialog1.FileName ;
button1.Enabled = true ;
}
}
private void button1_Click ( object sender , System.EventArgs e )
{
int iFileSize= Int32.Parse ( comboBox1.Text ) *1024 ;
//根据选择来设定分割的小文件的大小
if ( Directory.Exists ( textBox2.Text ) )
Directory.Delete ( textBox2.Text ,true ) ;
//如果计算机存在存放分割文件的目录,则全部删除此目录所有文件
else
Directory.CreateDirectory ( textBox2.Text ) ;
//反之则在计算机创建目录
FileStream SplitFileStream=new FileStream ( textBox1.Text , FileMode.Open ) ;
//以文件的全路对应的字符串和文件打开模式来初始化FileStream文件流实例
BinaryReader SplitFileReader=new BinaryReader ( SplitFileStream ) ;
//以FileStream文件流来初始化BinaryReader文件阅读器
byte [ ] TempBytes ;
//每次分割读取的最大数据
int iFileCount = ( int ) ( SplitFileStream.Length / iFileSize ) ;
//小文件总数
progressBar1.Maximum = iFileCount ;
if ( SplitFileStream.Length % iFileSize != 0 ) iFileCount++ ;
string [ ] TempExtra = textBox1.Text.Split ( ’.’ ) ;
/* 循环将大文件分割成多个小文件 */
for ( int i = 1 ; i <= iFileCount ; i++ )
{
string sTempFileName = textBox2.Text + @"\"+i.ToString ( ) .PadLeft ( 4 ,’0’ ) + "." + TempExtra[ TempExtra.Length - 1 ] ; //小文件名
//确定小文件的文件名称
FileStream TempStream = new FileStream ( sTempFileName , FileMode.OpenOrCreate ) ;
//根据文件名称和文件打开模式来初始化FileStream文件流实例
BinaryWriter TempWriter = new BinaryWriter ( TempStream ) ;
//以FileStream实例来创建、初始化BinaryWriter书写器实例
TempBytes = SplitFileReader.ReadBytes ( iFileSize ) ;
//从大文件中读取指定大小数据
TempWriter.Write ( TempBytes ) ;
//把此数据写入小文件
TempWriter.Close ( ) ;
//关闭书写器,形成小文件
TempStream.Close ( ) ;
//关闭文件流
progressBar1.Value = i - 1 ;
}
SplitFileReader.Close ( ) ;
//关闭大文件阅读器
SplitFileStream.Close ( ) ;
MessageBox.Show ( "分割成功!" ) ;
progressBar1.Value = 0 ;
}
四.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 ;
public string sDirectoryName = "" ;
//定义一个全局变量,用以存放合并文件所在的目录
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 ;
//获得文件所在目录
}
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 ;
}