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

开始要做简单的逻辑判断,源文件路径为空或者不存在的情况下,要弹出友情提示:

接着判断目标路径是否已经存在,若不存在则自动创建文件,然后执行复制操作。若存在,需要请求用户是否覆盖原来文件,根据用户选择,执行后续操作:

有了前面的逻辑分析和明确的思路,接下来代码就小意思喽……

View Code
 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Windows.Forms;
 9 using System.IO;
10 using System.Threading;
11 
12 namespace WindowsFormsApplication1
13 {
14     public partial class Form1 : Form
15     {
16         public Form1()
17         {
18             InitializeComponent();
19             CheckForIllegalCrossThreadCalls = false;
20         }
21 
22         private void CopyBtn_Click(object sender, EventArgs e)
23         {
24             Thread thread = new Thread(this.CopyFile);
25             thread.Start();
26         }
27         private void CopyFile()
28         {
29             string sfile = this.SourceTbox.Text.Trim();
30             string mfile = this.TargetTbox.Text.Trim();
31             if (!(File.Exists(sfile)))
32             {
33                 MessageBox.Show("源文件不存在");
34                 return;
35             }
36             FileStream readStream = File.Open(sfile, FileMode.Open);
37             FileStream writeStream = null;
38             if ((File.Exists(mfile)))
39             {
40                 DialogResult dr = MessageBox.Show("是否要覆盖文件", "警告", MessageBoxButtons.OKCancel);
41                 if (dr == DialogResult.OK)
42                 {
43                     writeStream = File.Open(mfile, FileMode.Truncate);
44                 }
45                 else
46                 {
47                     return;
48                 }
49             }
50             else
51             {
52                 writeStream = File.Open(mfile, FileMode.Create);
53             }
54             byte[] buffer = new byte[1024];
55             int i = 0;
56             long count = readStream.Length;
57             int ri = 0;
58             string progress = "";
59             while ((i = readStream.Read(buffer, 0, buffer.Length)) != 0)
60             {
61                 writeStream.Write(buffer, 0, i);
62                 ri = ri + i;
63                 progress = ((double)ri / count * 100).ToString("0.0") + "%";
64                 this.ProgressLab.Text = "进度: " + progress;
65                 this.CountLab.Text = "文件大小: " + ((double)count / (1024 * 1024)).ToString("0.0") + "Mb";
66                 this.progressBar.Maximum = (int)count;
67                 this.progressBar.Value = ri;
68                 if (ri == count)
69                 {
70                     this.progressBar.Value = 0;
71                 }
72             }
73             writeStream.Close();
74             readStream.Close();
75         }
76     }
77 }

以上代码比较直观,所以就没有写什么注释,还请大家谅解哈。有了以上简单的几个步骤,你就拥有了自己简单的多线程拷贝小程序了,虽然简陋了点儿,可毕竟是自己设计的,对它内部原理也肯定有比较深刻的掌握,况且其复制,拖动,显示进程和文件总大小的功能也都具备,所以还应算作一个差强人意的复制小程序……

posted on 2012-08-04 21:38  bergy  阅读(288)  评论(0编辑  收藏  举报