多线程拷贝(二)

今天写一个我们复制文件时常用到的小程序,弄清其中多线程的原理,你就不会再烦恼为什么边复制,窗体还能边动态显示进程、在复制过程还能移动窗口等异步显示的问题,希望能对大家有所帮助。

制作进度条

若源文件不存在:

若源文件已存在:

若文件不存在会显示进度条:

好了我们就可以把它拖到一边喽,让他自己慢慢复制吧,嗯好了,那我们就看看怎么让它来实现吧代码如下:

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 }

代码没有写什么注释,还请大家谅解。不过有了以上简单的几个步骤,我们就拥有了自己简单的多线程拷贝小程序了,虽然有点...,可毕竟是自己设计的,对它的原理也有深刻的理解,况且其复制,拖动,显示进程和文件总大小的功能也都具备,所以还应算作一个不如人意的复制小程序……没事,多多努力..加油

原文地址:https://www.cnblogs.com/QLJ1314/p/2633770.html