2012-04-30 20 views
6

Próbuję utworzyć funkcję, która będzie rekursywnie kopiować folder źródłowy oraz wszystkie pliki i foldery znajdujące się w nim do innej lokalizacji.Tworzenie funkcji rekursywnej do kopiowania wszystkich plików i folderów

W tej chwili muszę zdefiniować każdy folder w głównym folderze, co powoduje nadpisanie kodu i jego nadmiarowość.

Co jest bardziej skutecznym sposobem na zrobienie tego?

+1

bardziej wydajne niż brakujących [szczegóły]/kod? –

+0

możliwy duplikat [Jaki jest najlepszy sposób rekurencyjnego kopiowania treści w języku C#?] (Http://stackoverflow.com/questions/627504/what-is-the-best-way-to-recursively-copy-contents-in -c) – nawfal

+0

MSDN ma przykład: [Jak: kopiować katalogi] (http://msdn.microsoft.com/en-us/library/bb762914.aspx). – BluesRockAddict

Odpowiedz

4

Źródło: C# - Copy files and folders recursively from source to destination folder in c-sharp

public static void CopyFolder(string sourceFolder, string destFolder) 
{ 
    if (!Directory.Exists(destFolder)) 
     Directory.CreateDirectory(destFolder); 

    string[] files = Directory.GetFiles(sourceFolder); 
    foreach (string file in files) 
    { 
     string name = Path.GetFileName(file); 
     string dest = Path.Combine(destFolder, name); 
     File.Copy(file, dest); 
    } 
    string[] folders = Directory.GetDirectories(sourceFolder); 
    foreach (string folder in folders) 
    { 
     string name = Path.GetFileName(folder); 
     string dest = Path.Combine(destFolder, name); 
     CopyFolder(folder, dest); 
    } 
} 
+0

Zgłasza wyjątek, jeśli katalog docelowy ("dest" w linii 17) nie istnieje. Wstaw to w linii 18: , jeśli (! Directory.Exists (dest)) Directory.CreateDirectory (dest); – GojiraDeMonstah

9

spojrzeć na moje pytanie:

performance of copying directories użyłem równoległego foreach i to bardzo szybko

private static void CopyAll(string SourcePath, string DestinationPath) 
{ 

string[] directories = System.IO.Directory.GetDirectories(SourcePath, "*.*", SearchOption.AllDirectories); 

Parallel.ForEach(directories, dirPath => 
{ 
    Directory.CreateDirectory(dirPath.Replace(SourcePath, DestinationPath)); 
}); 

string[] files = System.IO.Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories); 

Parallel.ForEach(files, newPath => 
{ 
    File.Copy(newPath, newPath.Replace(SourcePath, DestinationPath)); 
}); 
} 
0

Korzystanie GetDirectories/GetFiles jest nieco na zewnątrz daty w moich oczach, użyłbym zamiast tego Directory.EnumerateFileSystemEntries(source);, ponieważ jest szybszy.

1

zrobić w ten sposób

void Copy(string sourceDir, string targetDir) 
{ 
    Directory.CreateDirectory(targetDir); 
    foreach (var file in Directory.GetFiles(sourceDir)) 
     File.Copy(file, Path.Combine(targetDir, Path.GetFileName(file))); 

    foreach (var directory in Directory.GetDirectories(sourceDir)) 
     Copy(directory, Path.Combine(targetDir, Path.GetFileName(directory))); 
} 
Powiązane problemy