zoukankan      html  css  js  c++  java
  • 文件分割器

    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对文件进行读写操作

  • 相关阅读:
    LightOJ 1132 Summing up Powers(矩阵快速幂)
    hdu 3804 Query on a tree (树链剖分+线段树)
    LightOJ 1052 String Growth && uva 12045 Fun with Strings (矩阵快速幂)
    uva 12304 2D Geometry 110 in 1! (Geometry)
    LA 3263 That Nice Euler Circuit (2D Geometry)
    2013 SCAUCPC Summary
    poj 3321 Apple Tree (Binary Index Tree)
    uva 11796 Dog Distance (几何+模拟)
    uva 11178 Morley's Theorem (2D Geometry)
    动手动脑
  • 原文地址:https://www.cnblogs.com/hanjun/p/2730215.html
Copyright © 2011-2022 走看看