2013-09-20 7 views
1

Я провел почти три дня с этим ниже, поэтому я, наконец, оказался здесь.Фоновертор с рекурсивной функцией DirectorCopy

У меня есть функция (из 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, не может обработать событие Отмена:

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

SourcePath и DestPath являются членами моего класса.

Любые советы, как я могу обработать событие Отмена работника в DirectoryCopy? Или любые другие советы, чтобы заставить его работать?

Спасибо!

+1

Попытка добавить параметр как Func отмены методу DirectoryCopy и колл с() => worker.CancellationPending и проверить его внутри цикла –

+0

Попытка прохождения как рабочий и и е к DirectoryCopy – Paparazzi

ответ

1

Хотя я не работал с BackgroundWorker все же, глядя на ваш вопрос - быстрый (может быть плохо логично) предложение было бы передать DoWorkEventArgs e внутри метода DirectoryCopy как

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

где BackgroundWoker worker, DoWorkEventArgs e и обрабатывайте его так, как вам хочется.

Пример:

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

Надеется, что это помогает!

+0

Это не работало, но, как @Blam сказал, что если я передам «DoWorkEventArgs e' и« BackgroundWorker worker », он отлично работает! –

+0

@AdamMezovari: Спасибо, отредактировал мой ответ на основе ваших отзывов. – Bhramar

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 
    }  
} 
+0

Спасибо! Единственная проблема, о которой я не упоминал, должен работать и на Windows 2000, поэтому я использую .NET 2.0, и, как я вижу, «Directory.EnumerateDirectories()» поддерживается только с 4.0. –

Смежные вопросы