1

我在下面花了将近三天的时间,所以我终于到了这里。

我有一个功能(来自 MSDN),它复制一个文件夹,其中包含每个文件和子文件夹。首先它复制主文件夹的文件,然后在每个子文件夹上调用自身。

这里是:

private void DirectoryCopy(string sourceDirName, string destDirName)
    {
        // Get the subdirectories for the specified directory.
        DirectoryInfo dir = new DirectoryInfo(sourceDirName);
        DirectoryInfo[] dirs = dir.GetDirectories();

        if (!dir.Exists)
        {
            throw new DirectoryNotFoundException(
                "Source directory does not exist or could not be found: "
                + sourceDirName);
        }

        // If the destination directory doesn't exist, create it. 
        if (!Directory.Exists(destDirName))
        {
            Directory.CreateDirectory(destDirName);
        }

        // Get the files in the directory and copy them to the new location.
        FileInfo[] files = dir.GetFiles();
        foreach (FileInfo file in files)
        {
            string temppath = System.IO.Path.Combine(destDirName, file.Name);
            file.CopyTo(temppath, false);
        }

        // Copying subdirectories and their contents to new location. 
        foreach (DirectoryInfo subdir in dirs)
        {
            string temppath = System.IO.Path.Combine(destDirName, subdir.Name);
            DirectoryCopy(subdir.FullName, temppath, copySubDirs);
        }
    }

问题是它可能需要很长时间,因此我尝试使用 BackgroundWorker,但我不知道如何将它放在它的 DoWork 事件中。

如果我将第一个 DirectoryCopy 调用放在 DoWork 事件中,则无法处理 Cancel 事件:

private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        if (worker.CancellationPending)
        {
            e.Cancel = true;
            return;
        }
        DirectoryCopy(sourcePath, destPath, true);
    }

sourcePath 和 destPath 是我班级的成员。

任何提示如何在 DirectoryCopy 中处理工作人员的 Cancel 事件?或任何其他提示使其正常工作?

谢谢!

4

2 回答 2

1

这里最好和最简单的方法是使用Directory.EnumerateDirectories(,,).

这会从您的代码中删除递归并使其更容易停止。

foreach(var dir in Directory.EnumerateDirectories(sourceDir, "*.*", SearchOption.AllDirectories)
{    
   foreach(var file in Directory.EnumerateDirectories(dir, "*.*")
   {
     if (worker.CancellationPending)
     {
        e.Cancel = true;
        return;
     }

     // copy file
   }      
}
于 2013-09-20T14:36:07.440 回答
1

虽然我还没有合作过,BackgroundWorker但看看你的问题 - 一个快速(可能不合逻辑)的建议是 DoWorkEventArgs e在 DirectoryCopy 方法中传递,比如

DirectoryCopy (sourcePath, destPath, true, worker , e)

在哪里 BackgroundWoker worker , DoWorkEventArgs e 并以任何你想要的方式处理它。

例子 :

if (worker.CancellationPending)
     {
        // your code
        e.Cancel = true;
     }

希望这可以帮助!

于 2013-09-20T14:24:30.287 回答