多线程拷贝(二)
今天写一个我们复制文件时常用到的小程序,弄清其中多线程的原理,你就不会再烦恼为什么边复制,窗体还能边动态显示进程、在复制过程还能移动窗口等异步显示的问题,希望能对大家有所帮助。
制作进度条
若源文件不存在:
若源文件已存在:
若文件不存在会显示进度条:
好了我们就可以把它拖到一边喽,让他自己慢慢复制吧,嗯好了,那我们就看看怎么让它来实现吧代码如下:
View Code
1 using System.IO; 2 using System.Threading; 3 namespace ThreadCopy 4 { 5 public partial class Form1 : Form 6 { 7 public Form1() 8 { 9 InitializeComponent(); 10 //允许线程间互相访问 11 CheckForIllegalCrossThreadCalls = false; 12 } 13 14 private void CpyBtn_Click(object sender, EventArgs e) 15 { 16 17 Thread thread = new Thread(this.CopyFile); 18 thread.Start(); 19 20 } 21 private void CopyFile() 22 { 23 FileStream readStream = null; 24 FileStream writeStream = null; 25 string sfile = this.STB.Text.Trim(); 26 string mfile = this.MTB.Text.Trim(); 27 if (!File.Exists(sfile)) 28 { 29 MessageBox.Show("源文件不存在"); 30 return; 31 } 32 using (readStream = File.Open(sfile, FileMode.Open)) 33 { 34 35 if (File.Exists(mfile)) 36 { 37 DialogResult dr = MessageBox.Show("是否要覆盖文件", "警告", 38 39 MessageBoxButtons.OKCancel); 40 if (dr == DialogResult.OK) 41 { 42 writeStream = File.Open(mfile, FileMode.Truncate); 43 } 44 else 45 { 46 return; 47 } 48 } 49 else 50 { 51 writeStream = File.Open(mfile, FileMode.Create); 52 } 53 using (writeStream) 54 { 55 byte[] buffer = new byte[1024 * 4]; 56 int i = 0; 57 long count = readStream.Length; 58 int ri = 0; 59 string ps = ""; 60 while ((i = readStream.Read(buffer, 0, buffer.Length)) != 0) 61 { 62 writeStream.Write(buffer, 0, i); 63 ri = ri + i; 64 //进度比率 65 ps = ((double)ri / count * 100).ToString("0.0") + "%"; 66 this.PSLB.Text = ps; 67 //源文件的大小 68 this.CLB.Text = (count/1024/1024)+"MB".ToString(); 69 this.CpyPB.Maximum = (int)count; 70 this.CpyPB.Value = ri; 71 //复制完成 72 if (ri == count) 73 { 74 this.CpyPB.Value = 0; 75 } 76 } 77 78 } 79 } 80 } 81 } 82 }
代码没有写什么注释,还请大家谅解。不过有了以上简单的几个步骤,我们就拥有了自己简单的多线程拷贝小程序了,虽然有点...,可毕竟是自己设计的,对它的原理也有深刻的理解,况且其复制,拖动,显示进程和文件总大小的功能也都具备,所以还应算作一个不如人意的复制小程序……没事,多多努力..加油