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; }
加载全部内容