C#中对文件进行分割与合并的实现

阅读:957次   时间:2009-02-06 00:00:00   字体:[ ]
主要通过C#对文件流的操作来完成..

可简单定义文件分割大小和把文件分割成多少块..

默认分割大小是5M可在fragmentsize变量中修改..

合并文件就是找到分割后的第一个文件块既可完成合并...

在对文件分割和合并的过程中...如果不放在线程里...将出现见面暂时无法响应和假死状态...所以把所有的操作都放在线程里来执行..

可对文件分割后的文件扩展名进行自定义..

以下是文件合并和分割的核心代码
=====================================

//拆分文件线程
private void SplitterThread()
{
FileStream inFile = new FileStream(f.ToString(), FileMode.OpenOrCreate,FileAccess.Read);
for(int i=0;i<Int32.Parse(this.txtSplitFragmentCount.Text);i++)
{
FileStream outFile = new FileStream(f.ToString()+i+".fsm",FileMode.OpenOrCreate,FileAccess.Write);
int data=0;
byte[] buffer = new byte[fragmentsize];
if((data=inFile.Read(buffer,0,fragmentsize))>0)
{
outFile.Write(buffer,0,data);
}
outFile.Close();
toolStripStatusLabel1.Text="当前进度:"+100*i/Int32.Parse(txtSplitFragmentCount.Text)+"%";
}
inFile.Close();
toolStripStatusLabel1.Text="文件拆分完成!";

}


//合并文件线程
private void MergerThread()
{
FileStream outFile = new FileStream(this.txtFileNameMergeTo.Text, FileMode.OpenOrCreate,FileAccess.Write);
for(int i=0;i<Int32.Parse(this.txtMergeFragmentCount.Text);i++)
{
int data = 0;
byte[] buffer = new byte[1024];
FileStream inFile = new FileStream(this.txtFileNameMergeTo.Text+i+".fsm",FileMode.OpenOrCreate,FileAccess.Read);
while((data=inFile.Read(buffer,0,1024))>0)
{
outFile.Write(buffer,0,data);
}
inFile.Close();
toolStripStatusLabel2.Text="当前进度:"+100*i/Int32.Parse(this.txtMergeFragmentCount.Text)+"%";
}
outFile.Close();
toolStripStatusLabel2.Text="文件组装完成!";
}
=====================================

以下是全部代码和截图:

=====================================
/*
* Created by SharpDevelop.
* User: HackWang
* Date: 2008-9-13
* Time: 22:59
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using System.Runtime.InteropServices;

namespace File_Splitter_and_Merger
{
/// <summary>
/// Description of MainForm.
/// </summary>
public partial class MainForm : Form
{

private FileInfo f= null;
private int filesize=0;
private int fragmentsize=5242880;
Thread sThread,mThread;
String d;
public MainForm()
{
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
InitializeComponent();

//
// TODO: Add constructor code after the InitializeComponent() call.
//
}

//文件拆分浏览
void BtnSplitBrowseClick(object sender, EventArgs e)
{
this.openFileDialog1.Title="选择要拆分的文件";
this.openFileDialog1.Filter="所有文件(*.*)|*.*";
this.openFileDialog1.FileName="";
if(openFileDialog1.ShowDialog()== DialogResult.OK)
{
txtFileNameToSplit.Text=openFileDialog1.FileName;
this.DisplayFileSize();
}
}

void TxtFileNameToSplitTextChanged(object sender, EventArgs e)
{
if(txtFileNameToSplit.Text!="")
{
this.btnSplit.Enabled=true;
txtFragmentSize.Enabled=true;
txtSplitFragmentCount.Enabled=true;
DisplayFileSize();
}
}

// void TxtFileNameToSplitKeyPress(object sender, KeyPressEventArgs e)
// {
// if(e.KeyChar=='\r')
// DisplayFileSize();
// }

//显示分割文件大小
private void DisplayFileSize()
{
if(this.tabControl1.SelectedIndex==0)
{
f = new FileInfo(txtFileNameToSplit.Text);
filesize=(int)f.Length;
this.txtFileSize.Text=filesize.ToString();
this.txtSplitFragmentCount.Text=System.Math.Ceiling(Double.Parse(txtFileSize.Text)/Double.Parse(txtFragmentSize.Text)).ToString();
}
else
{
string targetfilename=this.txtFileNameToMerge.Text.Substring(0,txtFileNameToMerge.Text.Length-5);
int i=0;
while(File.Exists(targetfilename+i+".fsm"))
{
i++;
}
this.txtMergeFragmentCount.Text=i.ToString();
this.txtFileNameMergeTo.Text=targetfilename;
}
}

//开始拆分文件
void BtnSplitClick(object sender, EventArgs e)
{
sThread = new Thread(new ThreadStart(SplitterThread));
sThread.Start();
}

//拆分文件线程
private void SplitterThread()
{
FileStream inFile = new FileStream(f.ToString(), FileMode.OpenOrCreate,FileAccess.Read);
for(int i=0;i<Int32.Parse(this.txtSplitFragmentCount.Text);i++)
{
FileStream outFile = new FileStream(f.ToString()+i+".fsm",FileMode.OpenOrCreate,FileAccess.Write);
int data=0;
byte[] buffer = new byte[fragmentsize];
if((data=inFile.Read(buffer,0,fragmentsize))>0)
{
outFile.Write(buffer,0,data);
}
outFile.Close();
toolStripStatusLabel1.Text="当前进度:"+100*i/Int32.Parse(txtSplitFragmentCount.Text)+"%";
}
inFile.Close();
toolStripStatusLabel1.Text="文件拆分完成!";

}

void TxtFragmentSizeTextChanged(object sender, EventArgs e)
{
fragmentsize=int.Parse(this.txtFragmentSize.Text);
}

//合并文件浏览
void BtnMergeBrowseClick(object sender, EventArgs e)
{

this.openFileDialog1.Filter="fsm文件(*.fsm)|*.fsm";
this.openFileDialog1.Title="选择要合并的文件";
this.openFileDialog1.FileName="";
if(this.openFileDialog1.ShowDialog()== DialogResult.OK)
{
this.txtFileNameToMerge.Text=this.openFileDialog1.FileName;
this.DisplayFileSize();
}

}

//开始合并文件
void BtnMergeClick(object sender, EventArgs e)
{
mThread = new Thread(new ThreadStart(MergerThread));
mThread.Start();

}

//合并文件线程
private void MergerThread()
{
FileStream outFile = new FileStream(this.txtFileNameMergeTo.Text, FileMode.OpenOrCreate,FileAccess.Write);
for(int i=0;i<Int32.Parse(this.txtMergeFragmentCount.Text);i++)
{
int data = 0;
byte[] buffer = new byte[1024];
FileStream inFile = new FileStream(this.txtFileNameMergeTo.Text+i+".fsm",FileMode.OpenOrCreate,FileAccess.Read);
while((data=inFile.Read(buffer,0,1024))>0)
{
outFile.Write(buffer,0,data);
}
inFile.Close();
toolStripStatusLabel2.Text="当前进度:"+100*i/Int32.Parse(this.txtMergeFragmentCount.Text)+"%";
}
outFile.Close();
toolStripStatusLabel2.Text="文件组装完成!";
}

void MainFormLoad(object sender, EventArgs e)
{
Win32.AnimateWindow(this.Handle, 500, Win32.AW_CENTER);
this.btnSplit.Enabled=false;
this.btnMerge.Enabled=false;
}

void TxtFileNameToMergeTextChanged(object sender, EventArgs e)
{
if(this.txtFileNameToMerge.Text!="")
this.btnMerge.Enabled=true;
}

void MainFormFormClosing(object sender, FormClosingEventArgs e)
{
Win32.AnimateWindow(this.Handle, 1000, Win32.AW_CENTER | Win32.AW_HIDE);
}

}
}

//窗体效果类
public class Win32
{
public const Int32 AW_HOR_POSITIVE = 0x00000001;     // 从左到右打开窗口
public const Int32 AW_HOR_NEGATIVE = 0x00000002;     // 从右到左打开窗口
public const Int32 AW_VER_POSITIVE = 0x00000004;     // 从上到下打开窗口
public const Int32 AW_VER_NEGATIVE = 0x00000008;     // 从下到上打开窗口
public const Int32 AW_CENTER = 0x00000010;           // 从里面向外扩散
public const Int32 AW_HIDE = 0x00010000;       // 在窗体卸载时若想使用本函数就得加上此常量
public const Int32 AW_ACTIVATE = 0x00020000;     //在窗体通过本函数打开后,默认情况下会失去焦点,除非加上本常量
public const Int32 AW_SLIDE = 0x00040000;
public const Int32 AW_BLEND = 0x00080000;        // 淡入淡出效果

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool AnimateWindow(
IntPtr hwnd, // handle to window
int dwTime, // duration of animation
int dwFlags // animation type
);
}
关于本站 - 广告服务 - 会员指南 - 联系方法
Copyright ©2003-2011 源码天空 All Rights Reserved