多线程实现文件复制

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

namespace CopyFileDemo
{
    public partial class CopyProgressForm : Form
    {
        string destFile, srcFile;

        public CopyProgressForm(string destFile, string srcFile)
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;

            this.destFile = destFile;   // 要复制的源文件名称
            this.srcFile = srcFile;     // 要复制到的目标文件名称
        }

        private void CopyProgressForm_Load(object sender, EventArgs e)
        {
            this.Show();

            // 在此处创建多线程复制文件
            Thread thread = new Thread(new ThreadStart(this.CopyProcess));
            thread.IsBackground = true;
            thread.Start();
        }

        void CopyProcess()
        {
            FileStream src = null,dest = null;

            try
            {
                src = new FileStream(this.srcFile, FileMode.Open, FileAccess.Read, FileShare.Read);
                dest = new FileStream(this.destFile, FileMode.Create, FileAccess.Write, FileShare.None);

                long size = src.Length;
                long currBytes = 0;
                byte[] buffer = new byte[1024];
                int length = 0;

                do
                {
                    length = src.Read(buffer, 0, buffer.Length);
                    currBytes += length;
                    this.pgrProgress.Value = (int)(currBytes * 100 / size);

                    dest.Write(buffer, 0, length);
                }
                while (length != 0);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                if (src != null)
                    src.Close();
                if (dest != null)
                    dest.Close();

                this.Close();
            }
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

posted @ 2008-04-28 08:17  大牛博客  阅读(1036)  评论(0编辑  收藏  举报