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

  • 相关阅读:
    POJ
    Fence Repair POJ
    COGS 2096. 不平凡的许愿树
    COGS 2095. 不平凡的引线
    BZOJ 4392 卡牌游戏
    COGS 2089. 平凡的测试数据
    Slim Span (最小生成树)
    【BZOJ1294】[SCOI2009]围豆豆Bean 射线法+状压DP+SPFA
    排列perm HYSBZ
    I
  • 原文地址:https://www.cnblogs.com/hanjun/p/2730215.html
Copyright © 2011-2022 走看看