文件分割器

winform应用程序

一、贴图为快

二、源码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;

namespace FilesplitDemo
{
/// <summary>
/// author:hanjun
/// date:2012/10/18 17:40:27
/// 文件分割器主页面
/// </summary>
public partial class frmfilesplit : Form
{
/// <summary>
/// 文件处理进度值
/// </summary>
private int percentProgress = 0;
/// <summary>
/// fileLength为要分割文件的长度,FilesplitSize为分割文件的大小,filesplitTimes为文件分割的次数,fileMergeTimes为文件合并的块数
/// </summary>
private int fileLength, filesplitSize, filesplitTimes, fileMergeBlocks;

/// <summary>
/// splitPath为文件分割路径,mergePath为文件合并路径
/// </summary>
private string splitPath, mergePath;

/// <summary>
/// fileInfoSplit为分割文件对象,fileInfoMerge为合并文件对象
/// </summary>
private FileInfo fileInfoSplit,fileInfoMerge;
private FileStream fileStream,MergeStream;//文件分割流,文件合并流

/// <summary>
/// backgroundWokerFilesplit为文件分割线程的操作对象,backgroundWokerFileMerge为文件合并线程的操作对象
/// </summary>
private BackgroundWorker backgroundWokerFilesplit, backgroundWokerFileMerge;

public frmfilesplit()
{
InitializeComponent();
}

/// <summary>
/// 选择文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnChooseFile_Click(object sender, EventArgs e)
{
try
{
if(this.openFileDialog1.ShowDialog()==DialogResult.OK)
{
fileInfoSplit = new FileInfo(openFileDialog1.FileName);
txtSplitFile.Text = fileInfoSplit.FullName;

splitPath = fileInfoSplit.FullName.Substring(0,fileInfoSplit.FullName.Length - openFileDialog1.SafeFileName.Length);
txtFileSize.Text = ((int)fileInfoSplit.Length/1024).ToString();
fileStream = new FileStream(fileInfoSplit.FullName,FileMode.Open,FileAccess.Read);
}
}
catch (Exception err)
{
MessageBox.Show(err.Message + "文件分割错误!");
}
}
/// <summary>
/// 选择保存分割文件的路径
/// (如果不选默认为与原文件同目录)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnChoosePath_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(this.txtSplitSize.Text))
{
MessageBox.Show("请输入文件分割块的大小!");
}
if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
this.txtSaveFilesplitPath.Text = this.folderBrowserDialog1.SelectedPath;
splitPath = this.folderBrowserDialog1.SelectedPath + "\\";
}
}
/// <summary>
/// 分割文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSplitFile_Click(object sender, EventArgs e)
{
try
{
fileLength = Convert.ToInt32(txtFileSize.Text);

if (fileLength % filesplitSize == 0)
{
filesplitTimes = fileLength / filesplitSize;
}
else
{
filesplitTimes = fileLength / filesplitSize + 1;
}
backgroundWokerFilesplit = new BackgroundWorker();
backgroundWokerFilesplit.WorkerReportsProgress = true;
backgroundWokerFilesplit.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWokerFilesplit_RunWorkerCompleted);
backgroundWokerFilesplit.ProgressChanged += new ProgressChangedEventHandler(backgroundWokerFilesplit_ProgressChanged);
for (int i = 0; i < filesplitTimes; i++)
{
Thread thread = new Thread(new ParameterizedThreadStart(FileSplit));
thread.Start(i);
int p = Convert.ToInt32(i) + 1;
percentProgress = (p / filesplitTimes) * 100;
backgroundWokerFilesplit.ReportProgress(percentProgress);
}
MessageBox.Show("文件分割完毕");
}
catch (Exception err)
{
MessageBox.Show(err.Message+"分割文件出错!");
}
}

/// <summary>
/// 文件分割方法
/// </summary>
public void FileSplit(object obj)
{
try
{
using (FileStream fileStream = new FileStream(splitPath + fileInfoSplit.Name.Substring(0, fileInfoSplit.Name.Length - fileInfoSplit.Extension.Length) + obj + fileInfoSplit.Extension, FileMode.OpenOrCreate, FileAccess.Write))
{
byte[] buffer = new byte[filesplitSize * 1024];
int data = 0;
if ((data = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
BinaryWriter binaryWriter = new BinaryWriter(fileStream, Encoding.Default);
binaryWriter.Write(buffer, 0, data);
}
}

}
catch (Exception err)
{
MessageBox.Show(err.Message + "文件打开异常!");
}

}
/// <summary>
/// 分割结束后将进度条的值设为100
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void backgroundWokerFilesplit_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
}
/// <summary>
/// 分割过程中更新最新的分割进度
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void backgroundWokerFilesplit_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.progressBar1.Value = 100;
}

/// <summary>
/// 分割文件块大小输入值的变化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtSplitSize_TextChanged(object sender, EventArgs e)
{
if (this.txtFileSize.Text.Length > 0)
{
filesplitSize = Convert.ToInt32(this.txtFileSize.Text);
}
}

/// <summary>
/// 选择要合并的文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnChooseMergeFile_Click(object sender, EventArgs e)
{
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
fileInfoMerge = new FileInfo(this.openFileDialog1.FileName);
this.txtMergeFile.Text = fileInfoMerge.FullName;
mergePath = this.folderBrowserDialog1.SelectedPath + "\\";
}
}
/// <summary>
/// 合并文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnMergeFile_Click(object sender, EventArgs e)
{
try
{
backgroundWokerFileMerge = new BackgroundWorker();
backgroundWokerFileMerge.ProgressChanged += new ProgressChangedEventHandler(backgroundWokerFileMerge_ProgressChanged);
backgroundWokerFileMerge.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWokerFileMerge_RunWorkerCompleted);
backgroundWokerFileMerge.WorkerReportsProgress = true;
if (fileMergeBlocks > 0)
{
using (MergeStream = new FileStream(mergePath + fileInfoMerge.Name.Substring(0, fileInfoMerge.Name.Length - fileInfoMerge.Extension.Length - 1) + fileInfoMerge.Extension, FileMode.OpenOrCreate, FileAccess.Write))
{
for (int i = 0; i < fileMergeBlocks; i++)
{
Thread thread = new Thread(new ParameterizedThreadStart(FileSplit));
thread.Start(i);
backgroundWokerFileMerge.ReportProgress((i + 1) / fileMergeBlocks * 100);
}
MessageBox.Show("合并完成!");
}
}
else
{
MessageBox.Show("请输入合并文件的数目");
}
}
catch (Exception err)
{
MessageBox.Show(err.Message + "文件合并错误!");
}
}
/// <summary>
/// 合并线程调用的合并函数,执行文件合并
/// </summary>
public void FileMerge(object obj)
{
try
{
using (FileStream fileStream = new FileStream(fileInfoMerge.FullName.Substring(0, fileInfoMerge.FullName.Length - fileInfoMerge.Extension.Length - 1) + obj + fileInfoMerge.Extension, FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[fileStream.Length];
int data = 0;
if ((data = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
BinaryWriter binaryWriter = new BinaryWriter(MergeStream, Encoding.Default);
binaryWriter.Write(buffer, 0, data);
}
}
}
catch(Exception err)
{
MessageBox.Show(err.Message+"合并异常,请确认选择合并的项为分割的第一项!");
}

}
/// <summary>
/// 合并完后,设置进度条值为100
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void backgroundWokerFileMerge_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.progressBar2.Value = 100;
}
/// <summary>
/// 合并过程中,更新进度条的进度
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void backgroundWokerFileMerge_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar2.Value = e.ProgressPercentage;
}
/// <summary>
/// 求要合并的文件数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtMergeFileBlocks_TextChanged(object sender, EventArgs e)
{
fileMergeBlocks = Convert.ToInt32(this.txtMergeFileBlocks.Text);
}
/// <summary>
/// 选择合并后的文件的保存路径
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnChooseMergeFilePath_Click(object sender, EventArgs e)
{
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
mergePath = folderBrowserDialog1.SelectedPath + "\\";
}
}
}
}

三、实现功能

1. 能进行文件分割
2. 分割块大小由用户输入决定
3. 能进行文件合并
4. 文件分割与合并过程用线程来实现
5. 数据缓冲区不得超过2K
6. 要有处理进度显示

四、知识点

1、掌握File类和FileInfo类的基本用法
2、掌握Directory类和DirectoryInfo类的基本用法
3、掌握Path类的基本用法
4、掌握使用FileStream和StreamReader、StreamWriter对文件进行读写操作

原文地址:https://www.cnblogs.com/hanjun/p/2730215.html