繁体   English   中英

后台工作者复制目录

[英]Background worker to copy directory

在我的Windows窗体应用程序中,某些目录是应用户请求复制的。 目前,正在UI线程上运行这些目录,但无法复制。

当前复制功能正在触发我的以下代码。

 private void button5_Click(object sender, EventArgs e)
        {


            string[] str = comboBox2.Text.Split(' ');
            string username = str[2].Replace("[", "").Replace("]", "");
            label3.Text = comboBox3.Text;
            DialogResult result = MessageBox.Show("Do you want to copy " + comboBox3.Text + " mozilla profile for " + username + " to Selected Servers?", "Confirmation", MessageBoxButtons.YesNoCancel);
            if (result == DialogResult.Yes)
            {
                if (myCheck.Checked == true)
                {
                    string path = getPath(comboBox3.Text);
                    try
                    {      
                        string source = path + "\\Appdata";
                        string dest = "\\\\192.168.1.40\\C$\\Users\\" + username + "\\AppData\\Local\\Mozilla";
                        Copy(@source, @dest);

                    }
                 }
             }
        }

复制功能具有以下代码。

     public void Copy(string sourceDirectory, string targetDirectory)
                {

                    DirectoryInfo diSource = new DirectoryInfo(sourceDirectory);
                    DirectoryInfo diTarget = new DirectoryInfo(targetDirectory);
                    //Gets size of all files present in source folder.
                    GetSize(diSource, diTarget);
                    maxbytes = maxbytes / 1024;

                    progressBar1.Maximum = maxbytes;
                    CopyAll(diSource, diTarget);
                }

 public void CopyAll(DirectoryInfo source, DirectoryInfo target)
            {

                if (Directory.Exists(target.FullName) == false)
                {
                    Directory.CreateDirectory(target.FullName);
                }
                foreach (FileInfo fi in source.GetFiles())
                {

                    fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);

                    total += (int)fi.Length;

                    copied += (int)fi.Length;
                    copied /= 1024;
                    progressBar1.Visible = true;
                    progressBar1.Step = copied;

                    progressBar1.PerformStep();
                    label14.Visible = true;
                    label14.Text = (total / 1048576).ToString() + "MB of " + (maxbytes / 1024).ToString() + "MB copied";



                    label14.Refresh();
                }

                foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
                {



                    DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
                    CopyAll(diSourceSubDir, nextTargetSubDir);
                }
            }

            public void GetSize(DirectoryInfo source, DirectoryInfo target)
            {


                if (Directory.Exists(target.FullName) == false)
                {
                    Directory.CreateDirectory(target.FullName);
                }
                foreach (FileInfo fi in source.GetFiles())
                {
                    maxbytes += (int)fi.Length;//Size of File


                }
                foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
                {
                    DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
                    GetSize(diSourceSubDir, nextTargetSubDir);

                }

            }

我的代码运行正常,但是我看不到进度,也看不到Label中的更新。

有人可以帮我在新线程中运行此副本,以便可以看到进度条中的进度。

不会为您总结一下,但我认为以下内容可能会让您走上正确的道路。 假定您具有“标准” :) button1progressBar1 ,则可以使用例如TaskBeginInvoke()获得不错的非阻塞UI更新。

private void button1_Click(object sender, EventArgs e)
{
    progressBar1.Minimum = 0;
    progressBar1.Maximum = 5;

    Task.Factory.StartNew(() =>
        {
            for (int i = 0; i <= 5; i++)
            {
                int progress = i;
                progressBar1.BeginInvoke((Action)(() =>
                    {
                        progressBar1.Value = progress;
                    }));
                Thread.Sleep(250);
            }
        });
}

这是一个使用后台工作程序的简单示例。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        Shown += new EventHandler(Form1_Shown);

        // To report progress from the background worker we need to set this property
        backgroundWorker1.WorkerReportsProgress = true;
        // This event will be raised on the worker thread when the worker starts
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        // This event will be raised when we call ReportProgress
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    }
    void Form1_Shown(object sender, EventArgs e)
    {
        // Start the background worker
        backgroundWorker1.RunWorkerAsync();
    }
    // On worker thread so do our thing!
    void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        // Your background task goes here
        for (int i = 0; i <= 100; i++)
        {
            // Report progress to 'UI' thread
            backgroundWorker1.ReportProgress(i);
            // Simulate long task
            System.Threading.Thread.Sleep(100);
        }
    }
    // Back on the 'UI' thread so we can update the progress bar
    void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        // The progress percentage is a property of e
        progressBar1.Value = e.ProgressPercentage;
    }
}

您可以在Do_Work和Report progress中执行CopyAll,以在进度栏中显示UI上的进度。

试试这个伪代码:

BackgroundWorker bw = new BackgroundWorker();    
bw.WorkerSupportsCancellation = true;    
bw.WorkerReportsProgress = true;

bw.DoWork += 
new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += 
new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += 
new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);

private void button5_Click(object sender, EventArgs e)
{
      // rest of the code above this...
      if (bw.IsBusy != true)
      {
          bw.RunWorkerAsync();
      }
}

private void bw_DoWork(object sender, DoWorkEventArgs e)
{  
     // rest of the code above this...
     Copy(@source, @dest);
}

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
     progressBar1.Visible = true;
     progressBar1.Step = copied;

     progressBar1.PerformStep();
}

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
      MessageBox.Show("Completed");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM