Visual C#实现文件分割合并器
2005-06-16 08:56作者:马金虎出处:天极网责任编辑:方舟
文件分割器主要是为了解决实际生活中携带大文件的问
,由于存储介质容量的限制,大的文件往往不能够一下子拷贝到存储介质中,这只能通过分割程序把的文件分割多个可携带小文件,分步拷贝这些小文件,从而实现携带大文件的目的。而合并器的作用则能够把这些分割的小文件重新合并,恢复原来的文件。.Net FrameWork SDK中提供的许多处理文件的类库,通过这些类能够简捷、灵活的实现对文件的操作。本文的主要内容就是探讨一下Visual C#在对文件编程中的一个比较流行的应用--文件分割器和合并器。下面就首先了解一下Visual C#在实现分割、合并器时所使用的.Net FrameWork SDK提供的类库及其在本文中的使用方法。
一.本文程序
、调试和运行的环境:
(1).微软公司视窗2000服务器版。
(2).Visual Studio .Net 2003企业构建版,.Net FrameWork SDK版本号4322。
二.Visual C#实现分割合并程序时使用的类库及其使用方法:
Visual C#对文件的编程所使用的类库一般都在.Net FrameWork SDK中的System.IO命名空间中,System.IO命名空间提供了在数据流和文件层次上的存取方法,存取方法一般都提供同步、异步二种模式。Visual C#实现分割合并程序时主要使用的是在数据流层次上的类,主要是:FileStream、BinaryReader和BinaryWriter,这三个类一般都提供了同步、异步模式来存取文件数据流,本文一般采用同步模式,虽然在性能上有所欠缺,但使用起来非常方便,也不容易出错。
FileStream类对Visual C#实现文件编程是非常重要的类,具体
现在对文件系统中文件的读、写操作上。FileStream类为适应各种具体操作,提供了许多构造函数。本文是使用文件路径对应的字符串和文件打开方式来创建、初始化FileStream实例的。具体语法如下:
public FileStream (string path ,FileMode mode) ;
下面是使用此构造函数创建、初始化FileStream实例的具体代码:
FileStream SplitFileStream = new FileStream ( "C:\\temp.avi" , FileMode.Open ) ;
表01是FileStream类的常用属性及其说明:
属性
说明
CanRead
获取指示当前流是否支持读取值。
CanSeek
获取指示当前流是否支持查找值。
CanWrite
获取指示当前流是否支持写入值。
Handle
获取当前FileStream对象所封装文件的操作系统文件句柄。
IsAsync
获取指示FileStream是异步还是同步打开的值。
Length
获取用字节表示的流长度。
Name
获取传递给构造函数的FileStream的名称。
Position
获取或设置此流的当前位置。
表01:FileStream类常用属性及其说明
FileStream类中最重要的是其中的方法,表02是FileStream类中的常用方法及其说明:
方法
说明
BeginRead
开始异步读。
BeginWrite
开始异步写。
Close
关闭文件并释放与当前文件流关联的任何资源。
EndRead
等待挂起的异步读取完成。
EndWrite
结束异步写入,在I/O操作完成之前一直阻塞。
Flush
清除该流的所有缓冲区,使所有缓冲的数据被写入基础设备。
Lock
防止其他进程访问某个文件的全部或部分。
Read
从流中读取字节块并将该数据写入给定缓冲区中。
ReadByte
从文件中读取一个字节,并将读取位置提升一个字节。
Seek
将该流的当前位置设置为给定值。
SetLength
将该流的长度设置为给定值。
Unlock
允许其他进程访问以前锁定的某个文件的全部或部分。
Write
使用从缓冲区读取的数据将字节块写入该流。
WriteByte
将一个字节写入文件流的当前位置。
其中:BeginRead、EndRead和BeginWrite、EndWrite是二对异步方法,其功能相当于Read和Write方法。
BinaryReader类提供了以FileStream类的实例为参数的构造函数,其语法比较简单,具体如下:
public BinaryReader ( Stream ) ;
下面是通过此构造函数创建、初始化BinaryReader实例的具体代码,其中SplitFileStream是FileStream实例:
BinaryReader SplitFileReader = new BinaryReader ( SplitFileStream ) ;
BinaryReader类为从当前的数据流中读取各种读取数据的方法,掌握了这些方法的使用方法也就掌握了BinaryReader类,表03是BinaryReader类中从数据流中读取数据的方法及其说明:
方法
说明
Read
从基础流中读取字符,并提升流的当前位置。
ReadBoolean
从当前流中读取Boolean,并使该流的当前位置提升1个字节。
ReadByte
从当前流中读取下一个字节,并使流的当前位置提升1个字节。
ReadBytes
从当前流中将指定个字节读入字节数组,并使当前位置提升指定个字节。
ReadChar
从当前流中读取下一个字符,并根据所使用的
ReadChars
从当前流中读取指定个字符,以字符数组的形式返回数据,并根据所使用的Encoding和从流中读取的特定字符,提升当前位置。
ReadDecimal
从当前流中读取十进制数值,并将该流的当前位置提升十六个字节。
ReadDouble
从当前流中读取8字节浮点值,并使流的当前位置提升8个字节。
ReadInt16
从当前流中读取2字节有符号整数,并使流的当前位置提升2个字节。
ReadInt32
从当前流中读取4字节有符号整数,并使流的当前位置提升4个字节。
ReadInt64
从当前流中读取8字节有符号整数,并使流的当前位置提升4个字节。
ReadSByte
从此流中读取一个有符号字节,并使流的当前位置提升1个字节。
ReadSingle
从当前流中读取4字节浮点值,并使流的当前位置提升4个字节。
ReadString
从当前流中读取一个字符串。字符串有长度前缀,一次7位地被编码为整数。
ReadUInt16
使用Little Endian编码从当前流中读取2字节无符号整数,并将流的位置提升2个字节。
ReadUInt32
从当前流中读取4字节无符号整数并使流的当前位置提升4个字节。
ReadUInt64
从当前流中读取8字节无符号整数并使流的当前位置提升8个字节。
表03:BinaryReader类中从数据流读取数据方法及其说明
BinaryWriter类也提供了使用以FileStream类的实例为参数的构造函数,其语法和BinaryReader类提供的构造函数非常相似,具体语法如下:
public BinaryWriter ( Stream ) ;
下面是通过此构造函数创建、初始化BinaryWriter实例的具体代码,其中SplitFileStream是FileStream实例:
BinaryWriter TempWriter = new BinaryWriter (SplitFileStream) ;
BinaryWriter类结构较BinaryReader简单,表04是BinaryWriter类中的常用方法及其说明:
方法
说明
Close
关闭当前的BinaryWriter和基础流。
Flush
清理当前编写器的所有缓冲区,使所有缓冲数据写入基础设备。
Seek
设置当前流中的位置。
Write
将值写入当前流。
表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所示: