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对文件进行读写操作
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架