C# 多线程复制文件并显示进度条的代码

发布时间:2019-07-22编辑:脚本学堂
本文介绍下,用C#实现的多线程复制文件,并显示进度条的一段代码,有需要的朋友,可以参考学习下。

以下代码,会用到C#线程、进程以及委托的相关知识,不明白的朋友,可以先补一下相关知识。
注:在本文后面附有C#多线程及委托的相关文章,大家可以参考下。
注意,已经在D://WORK//111这个文件夹中故意存放了很多的文件,同时也创建了D://WORK//222这个文件夹用于接受copy过来的文件。

看代码吧。
 

复制代码 代码示例:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;

namespace WindowsFormsApplication2
{

/// <summary>
    /// date:2012年3月2日17
    /// author:Ryan.wan
    /// </summary>
    public partial class Form1 : Form
    {
        private Thread threadcount; //定义线程
        delegate void setpro(int count,int index); //定义委托
        setpro SetPro;
        private event EventHandler sucevent; //事件
        int index = 0;
        int count = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SetPro = new setpro(changepar);
            threadcount = new Thread(new ThreadStart(run));
            threadcount.IsBackground = true;
            threadcount.Start();
            sucevent += new EventHandler(Form1_sucevent);
        }
        private void changepar(int count1,int value)
        {
            this.progressBar1.Maximum = count1;
            this.progressBar1.Value = value;
            if (this.progressBar1.Value == this.progressBar1.Maximum)
            {
                sucevent(this, new EventArgs());
            }
        }

        private void run()
        {
            String[] strpath = Directory.GetFiles("D:work111");
            count = strpath.Length;
            for (int i = 0; i < strpath.Length; i++)
            {
                if (File.Exists(strpath[i].Replace("111", "222")))
                {
                    File.Delete(strpath[i].Replace("111", "222"));
                }
                File.Copy(strpath[i], strpath[i].Replace("111", "222"));
                index = i + 1;
                this.progressBar1.Invoke(SetPro, new object[] { count, index });
            }
        }

        void Form1_sucevent(object sender, EventArgs e)
        {
            threadcount.Abort();
            MessageBox.Show("完成了");
        }
    }
}

附1,C#多线程的文章
C# 多线程更新进度条progressBar控件的代码一例
c# 多线程操作progressBar进度条控件的例子
c# asp.net 多线程实例(经典)
c#多线程读取注册表 c#多线程的小例子

附2,C#委托与事件的相关文章
C#入门学习笔记之事件和委托的实例
C#泛型:泛型特点、泛型继承、泛型接口、泛型委托学习笔记
学习 asp.net 的事件与委托
c# 委托浅析
c# 委托反射 DataTable转换为实体集的方法
c# 委托与事件的小例子
c#使用委托反射将DataTable转换为实体集的代码