1

以下でこれにほぼ3日を費やしたので、最終的にここにたどり着きました。

すべてのファイルとサブフォルダーを含むフォルダーをコピーする関数 (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 イベントに配置する方法がわかりません。

DoWork イベントで最初の DirectoryCopy 呼び出しを行うと、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 に答える