Visual C#实现文件分割合并器

2016-02-19 16:14 6 1 收藏

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享Visual C#实现文件分割合并器吧。

【 tulaoshi.com - 编程语言 】

  文件分割器主要是为了解决实际生活中携带大文件的问题,由于存储介质容量的限制,大的文件往往不能够一下子拷贝到存储介质中,这只能通过分割程序把的文件分割多个可携带小文件,分步拷贝这些小文件,从而实现携带大文件的目的。而合并器的作用则能够把这些分割的小文件重新合并,恢复原来的文件。.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. 将设置为。

  4. 将设置为。

  5. 在文本框中输入。

  6. 在的文本框中输入,然后单击按钮,这样在"E:VS.NET项目"目录中就产生了名称为"文件分割"的文件夹,并在里面创建了名称为"文件分割"的项目文件。具体如图01所示:

  图01:项目之对话框

  7. 把Visual Studio .Net的当前窗口切换到窗口,并从中的选项卡中往Form1窗体中拖入下列组件,并执行相应的操作:

  一个OpenFileDialog组件,用于选择要分割的大文件。

  一个ProgressBar组件,用以显示文件分割的进度。

  一个ComboBox组件,用以选择文件分割的大小。

  二个TextBox组件,分别用以显示OpenFileDialog组件选择后的文件和输入分割后小文件存放的目录。

  四个Label组件。

  二个Button组件,分别用以选择要分割的大文件和对选定文件进行分割,并在这二个Button组件拖入Form1的设计窗体后,双击它们,则系统会在Form1.cs文件分别产生这二个组件的Click事件对应的处理代码。

  8. 把Visual Studio .Net的当前窗口切换到窗口,并按照表05所示数值来调整组件的主要属性:

  组件类型 组件名称 属性 设置结果Button button1 FlatStyle Flatbutton1 Text 执行button2 FlatStylePopupbutton2 Text...Form Form1 Text 文件分割Form1MaximizeBox FalseForm1MinimizeBox TrueForm1 FormBorderStyle FormBorderStyle.FixedSingleComboBox comboBox1 Items 720comboBox1 Items 1440comboBox1 Items 2880Label label1 Text 请选择大小:label2 Text 请选择文件:label3 Text 输入存放目录:label4 Text (单位:K)TextBox TextBox1 Text  TextBox2 Text 

  表05:项目中组件主要属性设定数值表

  至此项目的界面设计和功能实现的准备工作就完成了,设计后的界面如图02所示:

  图02:项目的设计后的界面

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  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 ;

  10. 用下列代码替换Form1.cs中的button2的Click事件对应的处理代码,下列代码功能是选定要分割的大文件:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  

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 ; }}

  11. 用下列代码替换Form1.cs中的button1的Click事件对应的处理代码,下列代码功能是按照选择的文件大小,把选定的文件按照此大小进行分割,并把分割后的文件存放到指定目录中:

  

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 ;}

  12. 至此在上述步骤都正确完成后,项目的全部工作就基本完成了。此时单击快捷键F5运行程序,单击按钮选择要分割的文件,输入分割文件存放的目录,并确定分割文件的大小后,单击按钮,则程序就能够把选定的文件按照选定的大小进行分割,并把分割成的文件存放输入的目录中。图03是项目的运行界面:

  图03:项目的运行界面

  Visual C#实现分割文件程序已经全部完成了,下面就来介绍Visual C#把用分割程序分割成的小文件进行合并的解决思路和具体的实现步骤。

  四.Visual C#实现合并文件的解决方法及其具体实现步骤:

  Visual C#实现合并文件的思路是首先获得要合并文件所在的目录,然后确定所在目录的文件数目,最后通过循环按此目录文件名称的顺序读取文件,形成数据流,并使用BinaryWriter在不断追加,循环结束即合并文件完成。具体的实现方法请参考下面步骤中的第步。以下就是Visual C#实现合并文件的具体实现步骤:

  1. 启动Visual Studio .Net。

  2. 选择菜单||后,弹出对话框。

  3. 将设置为。

  4. 将设置为。

  5. 在文本框中输入。

  6. 在的文本框中输入,然后单击按钮,这样在"E:VS.NET项目"目录中就产生了名称为"合并程序"的文件夹,并在里面创建了名称为"合并程序"的项目文件。具体如图04所示:

  图04:项目之对话框

  7. 把Visual Studio .Net的当前窗口切换到窗口,并从中的选项卡中往Form1窗体中拖入下列组件,并执行相应的操作:

来源:https://www.tulaoshi.com/n/20160219/1611393.html

延伸阅读
ICMP就是所谓的Internet控制报文协议(Internet Control Message Protocol),在网络中,一般用它来传递差错报文以及其他应注意的信息。ICMP一般被认为是和IP协议同一层的协议,IMCP报文通常被IP层或者更高层的协议(如:TCP或者UDP)使用,ICMP对于互联网以及其他基于IP协议的网络的正常运行起着非常重要的作用。有许多重要的网络程序都是...
       在我们的开发项目中使用MVC(Model-View-Control)模式的益处是,可以完全降低业务层和应用表示层的相互影响。此外, 我们会有完全独立的对象来操作表示层。MVC在我们项目中提供的这种对象和层之间的独立,将使我们的维护变得更简单使 我们的代码重用变得很容易(下面你将看到)。 ...
在前两篇文章中我们讨论了XML文件的读取和写入,但都是基于流模型的解决方案,今天我们就来谈谈在C#中如何实现DOM,DOM确实有它的不足,但在编程工作中它还是不可或缺的技术。下面我们来简单了解一下DOM的相关知识。 DOM的全称是Document Object Model(文档对象模型),它是来自W3C的官方标准,它允许按照W3C标准W3C DOM Level1和W3C...
如何于Windows Form控件中捕捉按键向来是许多程序员所关心的课题,基本上,标准的KeyUp、KeyDown与KeyPress事件就足以去捕捉并处理按键。然而问题在于,并非所有的控件会在所有的情况下为所有的按键操作产生这些事件。 图CH8_DemoForm004.cs运行画面 如果您希望不管控件的状况如何,都能够顺利地捕捉Windows Form控件中的...
一、前言 用计算机进行数字图像处理的目的有两个,一是产生更适合人类视觉观察和识别的图像,二是希望计算机能够自动进行识别和理解图像。无论是为了何种目的,图像处理的要害一步是对包含有大量各式各样景物信息的图像进行分解。分解的最终结果就是图像被分成一些具有各种特征的最小成分,这些成分就称为图像的基元。产生这些基元的过...

经验教程

740

收藏

95
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部