Kopieren Sie den gesamten Inhalt eines Verzeichnisses in C#
Möchte ich kopieren Sie den gesamten Inhalt eines Verzeichnisses von einem Ort zum anderen in C#.
Es scheint nicht ein Weg, dies zu tun mit System.IO
Klassen, ohne viel Rekursion.
Gibt es eine Methode in VB, die wir verwenden können, wenn wir hinzufügen, die einen Verweis auf Microsoft.VisualBasic
:
new Microsoft.VisualBasic.Devices.Computer().
FileSystem.CopyDirectory( sourceFolder, outputFolder );
Dies scheint wie ein ziemlich hässlicher hack. Gibt es einen besseren Weg?
- Verzeichnis Kopieren und dessen Inhalt in ein Anderes Verzeichnis in C#.
- Ich würde sagen, dass der Blick auf die alternativen unten geschrieben, dass das VB Weg, sieht nicht so hässlich.
- Die eigentliche Frage ist, warum ist das nicht in der Standard-IO-Bibliothek? Indem wir jetzt wohl alle haben den gleichen code in eine eigene, persönliche Bibliothek.
- Wie kann es ein hack, wenn es Teil der .NET Framework? Stop-code schreiben, und nutzen, was Sie bekam.
Microsoft.VisualBasic
ist eine Reihe von add-on-Zeug für die Herstellung Vermächtnis VB6-Projekte einfacher zu aktualisieren. Sie würden in der Regel nicht verwenden Sie es in einer C# - Anwendung. Wenn es eine 'richtige' Teil der .Net framework wäre es inSystem.IO
. Auch nur dieSystem.[something]
Namensräume sind Teil der Mono.- Das ist ein häufiges Missverständnis. Microsft.VisualBasic enthält alle gängigen Visual Basic-Prozeduren, die macht das coding in VB so viel einfacher. Microsoft.VisualBasic.Kompatibilität ist die Montage verwendet für VB6 legacy.
- Wenn Sie einen Blick auf die Quelle für CopyDirectory Sie werden sehen, dass es System.IO oder interne Shell-API-Aufrufe, je nachdem, wie CopyDirectory genannt wird.
- Der Grund, warum Microsoft.VisualBasic ist nicht Hinzugefügt, um ein C# - Projekt ist, weil es nicht ein VB-Projekt. Auch VB.NET Projekte müssen hinzufügen von Microsoft.VisualBasic.Kompatibilität wenn Sie möchten, um die Verwendung von legacy-Funktionen. Die Kompatibilitätsebene wird nur Hinzugefügt, indem Sie den Assistenten für die migration oder durch den Benutzer.
- Es gibt über 2.000 Zeilen code zu Microsoft.VisualBasic.- Geräte.Computer.Dateisystem. CopyDirectory sicher, dass Sie nicht das kopieren von einem Ordner in einen untergeordneten Ordner und andere Prüfungen. Es ist hoch optimiert, und so weiter. Die ausgewählte Antwort ist zerbrechlich-code am besten.
- Das ist eine Einschränkung von Mono. Nicht Teil Ihrer Antwort. Sie wollen einen besseren Weg, und es gibt keine.
- Wenn Sie brauchen, System.Windows.Formen.Design, sind Sie gehen, um zu vermeiden, hinzufügen, dass die Referenz, nur weil es das Wort "Design"? Natürlich nicht. Daher die Vermeidung von etwas, das gebaut in den Rahmen, nur weil es das Wort "VisualBasic" in seinem Namen ist, naja..., einfach nur...dumm.
- Sie C# Jungs nur mich töten. Es geht nicht um tools, es wird über Lösungen.
- ok, also warum ist dieses optimierte und vollständige code in
Microsoft.VisualBasic
und nichtSystem.IO
? Der Grund, warum es nicht in Mono ist, weil alle Bibliotheken, die als "core" sindSystem.[something]
- alle anderen nicht. Ich habe kein problem mit Bezug auf eine zusätzliche DLL, aber es gibt einen guten Grund, warum Microsoft noch nicht enthalten diese Funktion inSystem.IO
. - Für alle von Euch, die denken, dass es einfach gut zu benutzen
Microsoft.VisualBasic
: würden Sie gerne mithilfe einer Bibliothek von Perl in python? Das ist im Grunde, was passiert ist, mit geringfügigen unterschieden. Auch nicht mitSystem.*
Bibliotheken, Sie sind potenziell einschränkende sich aus der Verwendung von Mono, die ich sammeln kann ein problem sein, aus den Bemerkungen der OP. - Die besten Entwickler sind diejenigen, die den job zu bekommen getan effektiv und schnell. Was also, wenn der name Visual Basic in es, ist die Tatsache, der code in der DLL ist nur MSIL. Microsoft hat klar geschrieben, einen effektiven Algorithmus, und es wäre eine Schande für jemanden, der es zu übersehen, nur weil es das Wort Visual Basic in seinem Namen. Insbesondere dann, wenn es einen Algorithmus schreibt er nur wegen einer DLL name oddity endet als buggy und kostet mehr Zeit, dies zu beheben.
- Vielleicht ist die BCL abgeschlossen war, bevor Sie entdecken, dass diese Funktion nötig war. Alles, was wir tun können, ist spekulieren an dieser Stelle. Sie haben einen guten Grund, warum sollten Sie nicht die DLL als der name? Hat die MSDN-Dokumentation sagen, dass diese Funktion ist veraltet?
- nee - das ist eine ganz alte Frage, die jetzt und Microsoft.VisualBasic-Verweis wurde in versendet die software über ein Jahr. Ich habe nur gefragt, warum es war in der seltsamen Lage - es sollte so etwas wie
System.IO.Directory.Copy(sourceFolder, outputFolder)
- Ich bin damit einverstanden, dass ' s, wo es sein sollte, aber es ist definitiv plausibel, dass der BCL abgeschlossen war, bevor Sie erkannte, dass es notwendig wäre für das VB und damit der nutzen es und Sie nie gedacht, zu überdenken es. Nur der Theorie wohlgemerkt. 🙂
- Ich habe gerade die Q&A würde dies mit einigen xcopy-Optionen wie in C#. stackoverflow.com/questions/22151995/...
- Ich benutze robocopy funktioniert es Super
Du musst angemeldet sein, um einen Kommentar abzugeben.
Viel einfacher
SearchOption.AllDirectories
. Ich würde wahrscheinlich dieSubString
Methode eher alsReplace
, aber das ist nur coding style stuff.SubString
Methode eher alsReplace
"sourceDir/things/sourceDir/things"
werden sollte"destinationDir/things/sourceDir/things"
, aber wenn Sie es ersetzen wird"destinationDir/things/destinationDir/things"
File.Copy
so verlässt es das original. Wenn Sie wollte, um das original entfernen, könnten SieFile.Move
oder (wahrscheinlich besser) hinzufügen einer Schleife, die Dateien zu löschen, nachdem das kopieren abgeschlossen ist.*.*
statt*
? Nicht, das Sie kopieren möchten Dateien ohne Erweiterungen auch so?AllDirectories
option, die Dateien in Unterverzeichnisse des Quellverzeichnisses. Mit deinem code wird bewirkt, dass alle Dateien kopiert werden in das Ziel-Verzeichnis selbst eher als in einem sub-Verzeichnis des Ziel-directory.Hmm, ich denke, dass ich missverstehen Sie die Frage, aber ich werde es riskieren. Was ist falsch mit der folgenden einfachen Methode?
BEARBEITEN Da dieses posting hat sammelte eine beeindruckende Anzahl an downvotes für eine so einfache Antwort auf eine ebenso simple Frage, lassen Sie mich hinzufügen, eine Erklärung. Bitte Lesen Sie diese, bevor downvoting.
Zunächst dieser code ist nicht intendend als drop-in Ersatz, um den code in die Frage. Es ist für die Darstellung Zweck.
Microsoft.VisualBasic.Devices.Computer.FileSystem.CopyDirectory
hat einige zusätzliche Richtigkeit tests (z.B. ob Quelle und Ziel gültig sind Verzeichnisse, ob die Quelle ein parent des Ziels etc.) fehlen diese Antwort. Dieser code wird wahrscheinlich auch mehr optimiert.Sagte, die code gut funktioniert. Es hat (fast identisch) verwendet worden, eine ausgereifte software, die seit Jahren. Abgesehen von der innewohnenden Unbeständigkeit vorhanden mit allen IO-handlings (z.B. was passiert, wenn der Benutzer manuell steckt den USB-Laufwerk, während Ihr code schreibt?), es gibt keine bekannten Probleme.
Insbesondere möchte ich darauf hinweisen, dass die Verwendung von Rekursion ist hier absolut kein problem. Weder in der Theorie (konzeptionell, es ist die eleganteste Lösung), noch in der Praxis: dieser code wird nicht überlauf der stack. Der stack ist groß genug, um sogar tief verschachtelten Datei-Hierarchien. Lange bevor der stack-space wird ein problem, der Ordner mit Pfadlänge kicks in.
Beachten Sie, dass ein böswillige Benutzer könnte in der Lage sein zu brechen, diese Annahme durch die Verwendung von tief verschachtelten Verzeichnissen aus einem Brief jeden. Ich habe nicht versucht, diese. Aber nur um den Punkt zu illustrieren: um diesen code-überlauf auf einem typischen Rechner, die Verzeichnisse hätte geschachtelt werden ein paar tausend Zeiten. Das ist einfach kein realistisches Szenario.
source
selbst wird ein Ordner untertarget
, dann sind es die Kinder gehen unter, die.Kopiert von MSDN:
Versuchen Sie dies:
Ihre xcopy Argumente kann variieren, aber Sie bekommen die Idee.
/S
auch, wenn du gehst zu verwenden/E
: "Verwenden Sie /e mit den /s und /t command-line options" (technet.microsoft.com/en-us/library/bb491035.aspx)Robocopy C:\A C:\B /E
xcopy.exe
oderSystem.IO
?Oder, wenn Sie wollen, gehen den harten Weg, fügen Sie einen Verweis auf das Projekt für Microsoft.VisualBasic und verwenden Sie dann die folgenden:
Jedoch durch die Verwendung der rekursiven Funktionen, einen besseren Weg zu gehen, da es nicht haben, laden Sie die VB-dll.
System.IO.Directory
, aber es ist besser als es umschreiben!Dieser Website immer, haben mir geholfen, eine Menge, und jetzt ist es meine umdrehung, um den anderen zu helfen mit dem, was ich weiß.
Ich hoffe, dass meine folgende code nützlich sein für jemanden.
Path.Combine()
. Verwenden Sie niemals die string-Verkettung, um Datei-Pfade zusammen.source_dir.Length + 1
, nichtsource_dir.Length
.source_dir.Length + 1
wie erwähnt, oderTrimStart('\\'))
Kopieren-Ordner rekursiv ohne Rekursion zu vermeiden stack-überlauf.
Hier ist eine utility-Klasse, die ich benutzt habe für IO-Aufgaben wie diese.
Kann es nicht sein, performance-wissen, aber ich verwende es für 30MB Ordner und es funktioniert einwandfrei. Plus, ich wusste nicht, wie all der Menge an code und die Rekursion benötigt für solch eine einfache Aufgabe.
Hinweis: ZipFile ist verfügbar .NET 4.5+ in das System.IO.Compression-namespace
Eine kleine Verbesserung auf d4nt Antwort, wie Sie wahrscheinlich wollen, um auf Fehler zu überprüfen und nicht zu ändern xcopy Wege, wenn Sie arbeiten auf einem server und Entwicklungsrechner:
Wenn Sie wie Konrad die beliebte Antwort, aber Sie wollen das
source
sich um einen Ordner, der sich untertarget
, anstatt es Kindern untertarget
Ordner, hier ist der code für, die. Es gibt die neu erstellteDirectoryInfo
, das ist praktisch:Können Sie immer diese, genommen von der Microsoft-website.
file.CopyTo(temppath, false);
sagt "kopieren Sie diese Datei an diesem Ort, nur wenn es nicht existieren", welche die meiste Zeit nicht, was wir wollen. Aber ich kann verstehen, warum ist es standardmäßig, dass. Vielleicht fügen Sie ein flag, um die Methode für das überschreiben von Dateien.tboswell 's ersetzen Proof-version (die ist elastisch, um sich wiederholende Muster in filepath)
Path.Combine()
. Verwenden Sie niemals die string-Verkettung, um Datei-Pfade zusammen.Meine Lösung ist im Grunde eine Abwandlung von @Termininja Antwort, aber ich habe verbessert es ein bisschen, und es wird mehr als 5 mal schneller als die akzeptierte Antwort.
BEARBEITEN: Ändern @Ahmed Sabry full-parallel-foreach erzeugt ein besseres Ergebnis, jedoch ist der code verwendet rekursive Funktion und die nicht ideal in einigen situation.
Sorry für den vorherigen code, hatte es noch bugs: ( (, zum Opfer fiel der Schnellste Gewehr problem) . Hier ist es getestet und funktioniert. Der Schlüssel ist die SearchOption.AllDirectories, die eliminiert die Notwendigkeit für explizite Rekursion.
Dies ist mein code, hoffe, dass dies helfen
SearchOption
- flag auf der Suche nach Ordnern und Dateien, die es tut dies in 4 Zeilen code. Schauen Sie sich auch die.HasFlag
Erweiterung jetzt auf enums.Hier ist eine Erweiterung Methode für DirectoryInfo a la FileInfo.CopyTo (Hinweis: die
overwrite
parameter):Verwenden diese Klasse.
.ToList().ForEach(
(das ist etwas mehr Arbeit, Speicher und etwas langsamer als nur das auflisten der Verzeichnisse direkt) und als eine Erweiterung-Methode. Die ausgewählte Antwort verwendetSearchOption.AllDirectories
und vermeidet Rekursion, so würde ich empfehlen, den Wechsel zu diesem Modell. Auch, Sie müssen sich normalerweise nicht den Namen des Typs in der extension-Methoden - ich würde es umbenennenCopyTo()
so wurde essourceDir.CopyTo(destination);
Einer Variante mit nur einer Schleife für das kopieren aller Ordner und Dateien:
Besser als jeder code (Erweiterung Methode DirectoryInfo mit Rekursion)
Kopieren und ersetzen Sie alle Dateien von dem Ordner
try
catch
throw
ist sinnlos.Den code unten ist der microsoft-Vorschlag how-to-copy-Verzeichnisse
und es ist geteilt durch Liebe @iato
aber es nur kopiert Unterverzeichnisse und Dateien des Quell-Ordners rekursiv und nicht kopieren Sie den Quell-Ordner, in dem es selbst (wie Rechte Maustaste -> kopieren ).
aber es ist eine schwierige Art und Weise unterhalb dieser Antwort :
wenn Sie kopieren möchten Inhalt von Quelle Ordner und Unterordner rekursiv können Sie einfach verwenden Sie es wie diese :
aber wenn Sie kopieren möchten das Quelltext-Verzeichnis selbst ein (ähnlich, dass Sie mit der rechten Maustaste auf den source-Ordner und klickte dann auf kopieren, dann in den Zielordner, den Sie geklickt paste) sollten Sie verwenden, wie diese :