Hmm, ich glaube, ich verstehe die Frage falsch, aber ich werde es riskieren. Was ist falsch an der folgenden einfachen Methode?
public static void CopyFilesRecursively(DirectoryInfo source, DirectoryInfo target) {
foreach (DirectoryInfo dir in source.GetDirectories())
CopyFilesRecursively(dir, target.CreateSubdirectory(dir.Name));
foreach (FileInfo file in source.GetFiles())
file.CopyTo(Path.Combine(target.FullName, file.Name));
}
BEARBEITEN Da dieser Beitrag eine beeindruckende Anzahl von Abstimmungen für eine so einfache Antwort auf eine ebenso einfache Frage erhalten hat, möchte ich eine Erklärung hinzufügen. Bitte lesen Sie dies vor dem Downvoting .
Erstens ist dieser Code nicht als Ersatz für den betreffenden Code gedacht. Es dient nur zu Illustrationszwecken.
Microsoft.VisualBasic.Devices.Computer.FileSystem.CopyDirectory
führt einige zusätzliche Korrektheitstests durch (z. B. ob Quelle und Ziel gültige Verzeichnisse sind, ob die Quelle ein übergeordnetes Element des Ziels ist usw.), die in dieser Antwort fehlen. Dieser Code ist wahrscheinlich auch optimierter.
Das heißt, der Code funktioniert gut . Es wird (fast identisch) seit Jahren in einer ausgereiften Software verwendet. Abgesehen von der inhärenten Unbeständigkeit, die bei allen E / A-Handlings auftritt (z. B. was passiert, wenn der Benutzer das USB-Laufwerk manuell aussteckt, während Ihr Code darauf schreibt?), Sind keine Probleme bekannt.
Insbesondere möchte ich darauf hinweisen, dass die Verwendung der Rekursion hier absolut kein Problem darstellt. Weder theoretisch (konzeptionell ist es die eleganteste Lösung) noch in der Praxis: Dieser Code wird den Stapel nicht überlaufen . Der Stapel ist groß genug, um auch tief verschachtelte Dateihierarchien zu verarbeiten. Lange bevor der Stapelspeicherplatz zum Problem wird, tritt die Begrenzung der Ordnerpfadlänge in Kraft.
Beachten Sie, dass ein böswilliger Benutzer diese Annahme möglicherweise durch die Verwendung tief verschachtelter Verzeichnisse mit jeweils einem Buchstaben brechen kann. Ich habe das nicht versucht. Aber nur um den Punkt zu veranschaulichen: Um diesen Code auf einem typischen Computer überlaufen zu lassen, müssten die Verzeichnisse einige tausend Mal verschachtelt werden . Dies ist einfach kein realistisches Szenario.