亲宝软件园·资讯

展开

C#实现文件分割和合并的示例详解

芝麻粒儿 人气:0

实践过程

效果

代码

public partial class frmSplit : Form
{
    public frmSplit()
    {
        InitializeComponent();
    }

    #region 分割文件
    /// <summary>
    /// 分割文件
    /// </summary>
    /// <param name="strFlag">分割单位</param>
    /// <param name="intFlag">分割大小</param>
    /// <param name="strPath">分割后的文件存放路径</param>
    /// <param name="strFile">要分割的文件</param>
    /// <param name="PBar">进度条显示</param>
    public void SplitFile(string strFlag, int intFlag, string strPath, string strFile, ProgressBar PBar)
    {
        int iFileSize = 0;
        //根据选择来设定分割的小文件的大小
        switch (strFlag)
        {
            case "Byte":
                iFileSize = intFlag;
                break;
            case "KB":
                iFileSize = intFlag * 1024;
                break;
            case "MB":
                iFileSize = intFlag * 1024 * 1024;
                break;
            case "GB":
                iFileSize = intFlag * 1024 * 1024 * 1024;
                break;
        }
        //以文件的全路径对应的字符串和文件打开模式来初始化FileStream文件流实例
        FileStream SplitFileStream = new FileStream(strFile, FileMode.Open);
        //以FileStream文件流来初始化BinaryReader文件阅读器
        BinaryReader SplitFileReader = new BinaryReader(SplitFileStream);
        //每次分割读取的最大数据
        byte[] TempBytes;
        //小文件总数
        int iFileCount = (int)(SplitFileStream.Length / iFileSize);
        PBar.Maximum = iFileCount;
        if (SplitFileStream.Length % iFileSize != 0) iFileCount++;
        string[] TempExtra = strFile.Split('.');
        //循环将大文件分割成多个小文件
        for (int i = 1; i <= iFileCount; i++)
        {
            //确定小文件的文件名称
            string sTempFileName = strPath + @"\" + i.ToString().PadLeft(4, '0') + "." + TempExtra[TempExtra.Length - 1]; //小文件名
            //根据文件名称和文件打开模式来初始化FileStream文件流实例
            FileStream TempStream = new FileStream(sTempFileName, FileMode.OpenOrCreate);
            //以FileStream实例来创建、初始化BinaryWriter书写器实例
            BinaryWriter TempWriter = new BinaryWriter(TempStream);
            //从大文件中读取指定大小数据
            TempBytes = SplitFileReader.ReadBytes(iFileSize);
            //把此数据写入小文件
            TempWriter.Write(TempBytes);
            //关闭书写器,形成小文件
            TempWriter.Close();
            //关闭文件流
            TempStream.Close();
            PBar.Value = i - 1;
        }
        //关闭大文件阅读器
        SplitFileReader.Close();
        SplitFileStream.Close();
        MessageBox.Show("文件分割成功!");
    }
    #endregion

    #region 合并文件
    /// <summary>
    /// 合并文件
    /// </summary>
    /// <param name="list">要合并的文件集合</param>
    /// <param name="strPath">合并后的文件名称</param>
    /// <param name="PBar">进度条显示</param>
    public void CombinFile(string[] strFile, string strPath, ProgressBar PBar)
    {
        PBar.Maximum = strFile.Length;
        FileStream AddStream = null;
        //以合并后的文件名称和打开方式来创建、初始化FileStream文件流
        AddStream = new FileStream(strPath, FileMode.Append);
        //以FileStream文件流来初始化BinaryWriter书写器,此用以合并分割的文件
        BinaryWriter AddWriter = new BinaryWriter(AddStream);
        FileStream TempStream = null;
        BinaryReader TempReader = null;
        //循环合并小文件,并生成合并文件
        for (int i = 0; i < strFile.Length; i++)
        {
            //以小文件所对应的文件名称和打开模式来初始化FileStream文件流,起读取分割作用
            TempStream = new FileStream(strFile[i].ToString(), FileMode.Open);
            TempReader = new BinaryReader(TempStream);
            //读取分割文件中的数据,并生成合并后文件
            AddWriter.Write(TempReader.ReadBytes((int)TempStream.Length));
            //关闭BinaryReader文件阅读器
            TempReader.Close();
            //关闭FileStream文件流
            TempStream.Close();
            PBar.Value = i + 1;
        }
        //关闭BinaryWriter文件书写器
        AddWriter.Close();
        //关闭FileStream文件流
        AddStream.Close();
        MessageBox.Show("文件合并成功!");
    }
    #endregion

    private void frmSplit_Load(object sender, EventArgs e)
    {
        timer1.Start();//启动计时器
    }

    //选择要分割的文件
    private void btnSFile_Click(object sender, EventArgs e)
    {
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            txtFile.Text = openFileDialog.FileName;
        }
    }

    //执行文件分割操作
    private void btnSplit_Click(object sender, EventArgs e)
    {
        try
        {
            if (txtLength.Text == ""||txtFile.Text.Trim()==""||txtPath.Text.Trim()=="")
            {
                MessageBox.Show("请将信息填写完整!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtLength.Focus();
            }
            else if (cboxUnit.Text == "")
            {
                MessageBox.Show("请选择要分割的文件单位!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                cboxUnit.Focus();
            }
            else
            {
                SplitFile(cboxUnit.Text, Convert.ToInt32(txtLength.Text.Trim()), txtPath.Text, txtFile.Text, progressBar);
            }
        }
        catch { }
    }

    //选择分割后的文件存放路径
    private void btnSPath_Click(object sender, EventArgs e)
    {
        if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
        {
            txtPath.Text = folderBrowserDialog.SelectedPath;
        }
    }

    //选择要合成的文件
    private void btnCFile_Click(object sender, EventArgs e)
    {
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            string Selectfile = "";
            string[] files = openFileDialog.FileNames;
            for (int i = 0; i < files.Length; i++)
            {
                Selectfile += "," + files[i].ToString();
            }
            if (Selectfile.StartsWith(","))
            {
                Selectfile = Selectfile.Substring(1);
            }
            if (Selectfile.EndsWith(","))
            {
                Selectfile.Remove(Selectfile.LastIndexOf(","),1);
            }
            txtCFile.Text = Selectfile;
        }
    }

    //选择合成后的文件存放路径
    private void btnCPath_Click(object sender, EventArgs e)
    {
        if (saveFileDialog.ShowDialog() == DialogResult.OK)
        {
            txtCPath.Text = saveFileDialog.FileName;
        }
    }

    //执行合成文件操作
    private void btnCombin_Click(object sender, EventArgs e)
    {
        try
        {
            if (txtCFile.Text.Trim() == "" || txtCPath.Text.Trim() == "")
            {
                MessageBox.Show("请将信息输入完整!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                if (txtCFile.Text.IndexOf(",") == -1)
                    MessageBox.Show("请选择要合成的文件,最少为两个!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                else
                {
                    string[] strFiles = txtCFile.Text.Split(',');
                    CombinFile(strFiles, txtCPath.Text, progressBar);
                }
            }
        }
        catch { }
    }

    //监视“分割”/“合并”按钮的可用状态
    private void timer1_Tick(object sender, EventArgs e)
    {
        if (txtFile.Text != "" && txtPath.Text != "")
            btnSplit.Enabled = true;
        else
            btnSplit.Enabled = false;
        if (txtCFile.Text != "" && txtCPath.Text != "")
            btnCombin.Enabled = true;
        else
            btnCombin.Enabled = false;
    }
}
partial class frmSplit
{
    /// <summary>
    /// 必需的设计器变量。
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// 清理所有正在使用的资源。
    /// </summary>
    /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Windows 窗体设计器生成的代码

    /// <summary>
    /// 设计器支持所需的方法 - 不要
    /// 使用代码编辑器修改此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        this.tabControl1 = new System.Windows.Forms.TabControl();
        this.tabPage1 = new System.Windows.Forms.TabPage();
        this.txtPath = new System.Windows.Forms.TextBox();
        this.txtLength = new System.Windows.Forms.TextBox();
        this.btnSPath = new System.Windows.Forms.Button();
        this.label3 = new System.Windows.Forms.Label();
        this.cboxUnit = new System.Windows.Forms.ComboBox();
        this.label2 = new System.Windows.Forms.Label();
        this.btnSplit = new System.Windows.Forms.Button();
        this.btnSFile = new System.Windows.Forms.Button();
        this.txtFile = new System.Windows.Forms.TextBox();
        this.label1 = new System.Windows.Forms.Label();
        this.tabPage2 = new System.Windows.Forms.TabPage();
        this.txtCPath = new System.Windows.Forms.TextBox();
        this.txtCFile = new System.Windows.Forms.TextBox();
        this.label5 = new System.Windows.Forms.Label();
        this.btnCPath = new System.Windows.Forms.Button();
        this.btnCombin = new System.Windows.Forms.Button();
        this.btnCFile = new System.Windows.Forms.Button();
        this.label4 = new System.Windows.Forms.Label();
        this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
        this.folderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog();
        this.timer1 = new System.Windows.Forms.Timer(this.components);
        this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
        this.progressBar = new System.Windows.Forms.ProgressBar();
        this.tabControl1.SuspendLayout();
        this.tabPage1.SuspendLayout();
        this.tabPage2.SuspendLayout();
        this.SuspendLayout();
        // 
        // tabControl1
        // 
        this.tabControl1.Controls.Add(this.tabPage1);
        this.tabControl1.Controls.Add(this.tabPage2);
        this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
        this.tabControl1.Location = new System.Drawing.Point(0, 0);
        this.tabControl1.Name = "tabControl1";
        this.tabControl1.SelectedIndex = 0;
        this.tabControl1.Size = new System.Drawing.Size(354, 201);
        this.tabControl1.TabIndex = 0;
        // 
        // tabPage1
        // 
        this.tabPage1.Controls.Add(this.txtPath);
        this.tabPage1.Controls.Add(this.txtLength);
        this.tabPage1.Controls.Add(this.btnSPath);
        this.tabPage1.Controls.Add(this.label3);
        this.tabPage1.Controls.Add(this.cboxUnit);
        this.tabPage1.Controls.Add(this.label2);
        this.tabPage1.Controls.Add(this.btnSplit);
        this.tabPage1.Controls.Add(this.btnSFile);
        this.tabPage1.Controls.Add(this.txtFile);
        this.tabPage1.Controls.Add(this.label1);
        this.tabPage1.Location = new System.Drawing.Point(4, 21);
        this.tabPage1.Name = "tabPage1";
        this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
        this.tabPage1.Size = new System.Drawing.Size(346, 176);
        this.tabPage1.TabIndex = 0;
        this.tabPage1.Text = "文件分割";
        this.tabPage1.UseVisualStyleBackColor = true;
        // 
        // txtPath
        // 
        this.txtPath.Location = new System.Drawing.Point(37, 117);
        this.txtPath.Name = "txtPath";
        this.txtPath.Size = new System.Drawing.Size(256, 21);
        this.txtPath.TabIndex = 10;
        // 
        // txtLength
        // 
        this.txtLength.Location = new System.Drawing.Point(37, 72);
        this.txtLength.Name = "txtLength";
        this.txtLength.Size = new System.Drawing.Size(146, 21);
        this.txtLength.TabIndex = 9;
        // 
        // btnSPath
        // 
        this.btnSPath.Location = new System.Drawing.Point(299, 115);
        this.btnSPath.Name = "btnSPath";
        this.btnSPath.Size = new System.Drawing.Size(37, 23);
        this.btnSPath.TabIndex = 8;
        this.btnSPath.Text = "<<";
        this.btnSPath.UseVisualStyleBackColor = true;
        this.btnSPath.Click += new System.EventHandler(this.btnSPath_Click);
        // 
        // label3
        // 
        this.label3.AutoSize = true;
        this.label3.Location = new System.Drawing.Point(12, 100);
        this.label3.Name = "label3";
        this.label3.Size = new System.Drawing.Size(137, 12);
        this.label3.TabIndex = 7;
        this.label3.Text = "选择分割后文件存放路径";
        // 
        // cboxUnit
        // 
        this.cboxUnit.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
        this.cboxUnit.FormattingEnabled = true;
        this.cboxUnit.Items.AddRange(new object[] {
        "Byte",
        "KB",
        "MB",
        "GB"});
        this.cboxUnit.Location = new System.Drawing.Point(189, 73);
        this.cboxUnit.Name = "cboxUnit";
        this.cboxUnit.Size = new System.Drawing.Size(63, 20);
        this.cboxUnit.TabIndex = 6;
        // 
        // label2
        // 
        this.label2.AutoSize = true;
        this.label2.Location = new System.Drawing.Point(12, 55);
        this.label2.Name = "label2";
        this.label2.Size = new System.Drawing.Size(101, 12);
        this.label2.TabIndex = 5;
        this.label2.Text = "设置分割文件大小";
        // 
        // btnSplit
        // 
        this.btnSplit.Location = new System.Drawing.Point(261, 26);
        this.btnSplit.Name = "btnSplit";
        this.btnSplit.Size = new System.Drawing.Size(75, 23);
        this.btnSplit.TabIndex = 3;
        this.btnSplit.Text = "分割";
        this.btnSplit.UseVisualStyleBackColor = true;
        this.btnSplit.Click += new System.EventHandler(this.btnSplit_Click);
        // 
        // btnSFile
        // 
        this.btnSFile.Location = new System.Drawing.Point(220, 26);
        this.btnSFile.Name = "btnSFile";
        this.btnSFile.Size = new System.Drawing.Size(40, 23);
        this.btnSFile.TabIndex = 2;
        this.btnSFile.Text = "<<";
        this.btnSFile.UseVisualStyleBackColor = true;
        this.btnSFile.Click += new System.EventHandler(this.btnSFile_Click);
        // 
        // txtFile
        // 
        this.txtFile.Location = new System.Drawing.Point(37, 27);
        this.txtFile.Name = "txtFile";
        this.txtFile.Size = new System.Drawing.Size(179, 21);
        this.txtFile.TabIndex = 1;
        // 
        // label1
        // 
        this.label1.AutoSize = true;
        this.label1.Location = new System.Drawing.Point(12, 10);
        this.label1.Name = "label1";
        this.label1.Size = new System.Drawing.Size(113, 12);
        this.label1.TabIndex = 0;
        this.label1.Text = "请选择要分割的文件";
        // 
        // tabPage2
        // 
        this.tabPage2.Controls.Add(this.txtCPath);
        this.tabPage2.Controls.Add(this.txtCFile);
        this.tabPage2.Controls.Add(this.label5);
        this.tabPage2.Controls.Add(this.btnCPath);
        this.tabPage2.Controls.Add(this.btnCombin);
        this.tabPage2.Controls.Add(this.btnCFile);
        this.tabPage2.Controls.Add(this.label4);
        this.tabPage2.Location = new System.Drawing.Point(4, 21);
        this.tabPage2.Name = "tabPage2";
        this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
        this.tabPage2.Size = new System.Drawing.Size(346, 176);
        this.tabPage2.TabIndex = 1;
        this.tabPage2.Text = "文件合成";
        this.tabPage2.UseVisualStyleBackColor = true;
        // 
        // txtCPath
        // 
        this.txtCPath.Location = new System.Drawing.Point(37, 88);
        this.txtCPath.Name = "txtCPath";
        this.txtCPath.Size = new System.Drawing.Size(256, 21);
        this.txtCPath.TabIndex = 6;
        // 
        // txtCFile
        // 
        this.txtCFile.Location = new System.Drawing.Point(37, 44);
        this.txtCFile.Name = "txtCFile";
        this.txtCFile.Size = new System.Drawing.Size(174, 21);
        this.txtCFile.TabIndex = 5;
        // 
        // label5
        // 
        this.label5.AutoSize = true;
        this.label5.Location = new System.Drawing.Point(11, 72);
        this.label5.Name = "label5";
        this.label5.Size = new System.Drawing.Size(173, 12);
        this.label5.TabIndex = 4;
        this.label5.Text = "选择合并后文件存放路径及名称";
        // 
        // btnCPath
        // 
        this.btnCPath.Location = new System.Drawing.Point(299, 87);
        this.btnCPath.Name = "btnCPath";
        this.btnCPath.Size = new System.Drawing.Size(38, 23);
        this.btnCPath.TabIndex = 3;
        this.btnCPath.Text = "<<";
        this.btnCPath.UseVisualStyleBackColor = true;
        this.btnCPath.Click += new System.EventHandler(this.btnCPath_Click);
        // 
        // btnCombin
        // 
        this.btnCombin.Location = new System.Drawing.Point(262, 44);
        this.btnCombin.Name = "btnCombin";
        this.btnCombin.Size = new System.Drawing.Size(75, 23);
        this.btnCombin.TabIndex = 2;
        this.btnCombin.Text = "合并";
        this.btnCombin.UseVisualStyleBackColor = true;
        this.btnCombin.Click += new System.EventHandler(this.btnCombin_Click);
        // 
        // btnCFile
        // 
        this.btnCFile.Location = new System.Drawing.Point(217, 44);
        this.btnCFile.Name = "btnCFile";
        this.btnCFile.Size = new System.Drawing.Size(39, 23);
        this.btnCFile.TabIndex = 1;
        this.btnCFile.Text = "<<";
        this.btnCFile.UseVisualStyleBackColor = true;
        this.btnCFile.Click += new System.EventHandler(this.btnCFile_Click);
        // 
        // label4
        // 
        this.label4.AutoSize = true;
        this.label4.Location = new System.Drawing.Point(11, 28);
        this.label4.Name = "label4";
        this.label4.Size = new System.Drawing.Size(101, 12);
        this.label4.TabIndex = 0;
        this.label4.Text = "选择要合成的文件";
        // 
        // openFileDialog
        // 
        this.openFileDialog.Multiselect = true;
        // 
        // timer1
        // 
        this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
        // 
        // progressBar
        // 
        this.progressBar.Dock = System.Windows.Forms.DockStyle.Bottom;
        this.progressBar.Location = new System.Drawing.Point(0, 181);
        this.progressBar.Name = "progressBar";
        this.progressBar.Size = new System.Drawing.Size(354, 20);
        this.progressBar.TabIndex = 1;
        // 
        // frmSplit
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(354, 201);
        this.Controls.Add(this.progressBar);
        this.Controls.Add(this.tabControl1);
        this.MaximizeBox = false;
        this.MinimizeBox = false;
        this.Name = "frmSplit";
        this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
        this.Text = "文件分割与合成";
        this.Load += new System.EventHandler(this.frmSplit_Load);
        this.tabControl1.ResumeLayout(false);
        this.tabPage1.ResumeLayout(false);
        this.tabPage1.PerformLayout();
        this.tabPage2.ResumeLayout(false);
        this.tabPage2.PerformLayout();
        this.ResumeLayout(false);

    }

    #endregion

    public System.Windows.Forms.TabControl tabControl1;
    private System.Windows.Forms.TabPage tabPage1;
    private System.Windows.Forms.TextBox txtFile;
    private System.Windows.Forms.Label label1;
    private System.Windows.Forms.TabPage tabPage2;
    private System.Windows.Forms.TextBox txtPath;
    private System.Windows.Forms.TextBox txtLength;
    private System.Windows.Forms.Button btnSPath;
    private System.Windows.Forms.Label label3;
    private System.Windows.Forms.ComboBox cboxUnit;
    private System.Windows.Forms.Label label2;
    private System.Windows.Forms.Button btnSplit;
    private System.Windows.Forms.Button btnSFile;
    private System.Windows.Forms.OpenFileDialog openFileDialog;
    private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog;
    private System.Windows.Forms.TextBox txtCPath;
    private System.Windows.Forms.TextBox txtCFile;
    private System.Windows.Forms.Label label5;
    private System.Windows.Forms.Button btnCPath;
    private System.Windows.Forms.Button btnCombin;
    private System.Windows.Forms.Button btnCFile;
    private System.Windows.Forms.Label label4;
    private System.Windows.Forms.Timer timer1;
    private System.Windows.Forms.SaveFileDialog saveFileDialog;
    private System.Windows.Forms.ProgressBar progressBar;
}

加载全部内容

相关教程
猜你喜欢
用户评论