当前位置:首页C# > 正文

C# winform基于 BackgroundWorker实现异步复制文件显示进度条百分比源代码

作者:野牛程序员:2023-12-28 20:04:48C#阅读 2443

C# winform基于 BackgroundWorker实现异步复制文件显示进度条百分比源代码

using System;
using System.ComponentModel;
using System.IO;
using System.Windows.Forms;

namespace FileCopyApp
{
    public partial class MainForm : Form
    {
        private BackgroundWorker backgroundWorker;
        private string sourceFilePath;
        private string destinationFolderPath;

        public MainForm()
        {
            InitializeComponent();
            InitializeBackgroundWorker();
        }

        private void InitializeBackgroundWorker()
        {
            backgroundWorker = new BackgroundWorker
            {
                WorkerReportsProgress = true,
                WorkerSupportsCancellation = true
            };

            backgroundWorker.DoWork += BackgroundWorker_DoWork;
            backgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged;
            backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
        }

        private void btnBrowseSource_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog = new OpenFileDialog())
            {
                openFileDialog.Title = "Select Source File";
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    sourceFilePath = openFileDialog.FileName;
                    txtSourcePath.Text = sourceFilePath;
                }
            }
        }

        private void btnBrowseDestination_Click(object sender, EventArgs e)
        {
            using (FolderDialog folderDialog = new FolderDialog())
            {
                folderDialog.Title = "Select Destination Folder";
                if (folderDialog.ShowDialog() == DialogResult.OK)
                {
                    destinationFolderPath = folderDialog.SelectedPath;
                    txtDestinationPath.Text = destinationFolderPath;
                }
            }
        }

        private void btnCopy_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(sourceFilePath) && !string.IsNullOrEmpty(destinationFolderPath))
            {
                btnCopy.Enabled = false;
                backgroundWorker.RunWorkerAsync();
            }
            else
            {
                MessageBox.Show("Please select source file and destination folder.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            int bufferSize = 1024 * 1024; // 1 MB buffer size
            byte[] buffer = new byte[bufferSize];

            using (FileStream sourceStream = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read))
            {
                using (FileStream destinationStream = new FileStream(Path.Combine(destinationFolderPath, Path.GetFileName(sourceFilePath)), FileMode.Create, FileAccess.Write))
                {
                    long totalBytes = sourceStream.Length;
                    long copiedBytes = 0;
                    int bytesRead;

                    while ((bytesRead = sourceStream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        destinationStream.Write(buffer, 0, bytesRead);
                        copiedBytes += bytesRead;

                        int progressPercentage = (int)((copiedBytes * 100) / totalBytes);
                        backgroundWorker.ReportProgress(progressPercentage);
                    }
                }
            }
        }

        private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar.Value = e.ProgressPercentage;
        }

        private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            btnCopy.Enabled = true;
            if (e.Error != null)
            {
                MessageBox.Show($"Error: {e.Error.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                MessageBox.Show("File copied successfully!", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
    }
}


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击