2016-04-07 12 views
-1

Ich möchte ein Verzeichnis als Copy/Paste-Routine verschieben, indem ich die Struktur so belasse wie sie ist. Ich suche nicht nur nach den Dateien in allen Unterordnern in einem Verzeichnis, sondern kopiere/kopiere sie (wie this Lösung), stattdessen möchte ich Klon die ganze Sache und behalten Sie ihre Struktur so wie es ist (Baum -> Unterordner und Dateien) , genau wie eine Kopier- und Einfüge-Routine.Wie kopiert und fügt man ein ganzes Verzeichnis rekursiv in einen neuen Pfad ein?

So fand ich this Funktion, die kopiert einen Ordner voller Dateien auf einen neuen Pfad:

Folder -> Datei (en)

Die Funktion wie die Copy/Paste bekannt verhält Routine. Es nimmt SourcePath, DestinationPath und booleschen Wert zu OverWriteExisting. Schön und klein, aber schade, dass es dort nicht als eigentliche Antwort auf diese Frage markiert wurde (Empfehlung einer Rate).

Aber was, wenn ich ein ganzes Verzeichnis verschieben möchte? Mit anderen Worten, was ist, wenn ich einen Ordner habe, der Ordner mit Ordnern von Ordnern von Dateien und usw. hat? Und vielleicht ist es die Dateistruktur Baumgröße wie diese unbekannt:

Folder -> Ordner (n) -> ... -> Ordner (n) -> Datei (en)

I verwende die folgende Routine, um einen Ordner mit Ordnern zu kopieren/einzufügen. Aber hier weiß ich, dass ich nur eine Ebene der Ordner so nur eine foreach-Schleife ist erforderlich:

foreach (var Folder in DestinationFolder) // here I know that I have only one level of folders to reach the files 
{ 
    CopyDirectory(FolderPath, DestinationPath, false); // use that function to copy the files 
} 

Diese obige Funktion dient dieser Verzeichnisstruktur:

Folder -> Ordner (n) -> Datei (en)

Ich versuchte this und es hat nicht getan, was ich will. Ich lese nur alle Dateien, während es alle Unterordner durchsucht. Was ich nicht will. Ich möchte die Unterordner und die ursprüngliche Struktur so beibehalten, wie sie ist. Hier erhalte ich vier Dateien anstelle des Verzeichnisses, wie es ist, Unterordner und ihre Unterordner, Unterordner, Dateien. Nur vier, weil es Duplikate entfernt, was ich nicht möchte, weil ich alle brauche.

Hier ist meine derzeitige Struktur (aber meine Frage in einem beliebigen Verzeichnis global):

Folder -> Ordner -> Ordner + Dateien

Hier ist, was der folgende Code in dem tut neuer Weg:

NewFolder -> AllFilesFoundInAnySubfolder

dialog.FileName = dialog.FileName.Replace(".xml", ""); // get the destination path 
DirectoryInfo dirInfo = new DirectoryInfo(dialog.FileName); 

if (dirInfo.Exists == false) 
    Directory.CreateDirectory(dialog.FileName); 

List<String> EverythingInTheDirectory = Directory 
        .GetFiles(FileStructure.baseSessionPath + "\\" + SelectedSession.Name, "*.*", SearchOption.AllDirectories).ToList(); // source 

foreach (string file in EverythingInTheDirectory) 
{ 
    FileInfo mFile = new FileInfo(file); 
    // to remove name collusion 
    if (new FileInfo(dirInfo + "\\" + mFile.Name).Exists == false) 
     mFile.MoveTo(dirInfo + "\\" + mFile.Name); 
} 

Wie verschiebt man das gesamte Verzeichnis mit unbekannter Größe und behält seine Struktur so wie es ist? Nicht nur die Dateien aus einem Verzeichnis holen und verschieben!

+0

bekommen Was in diesem Zusammenhang bedeutet 'clone' und wie unterscheidet es sich von dem Kopieren eines Verzeichnisses rekursiv an einen anderen Ort? Bitte fügen Sie auch einen Code ein. Was hast du probiert? – Zuzlx

+0

Ihre verknüpfte Frage hat zwei Wiederwahlstimmen. Seien Sie geduldig und geben Sie ihm Zeit, wieder geöffnet zu werden, anstatt ein tatsächliches Duplikat dieses Posts zu veröffentlichen **. Dies ist keine * sofortige Befriedigungs * -Site; Sie erhalten keine Antworten sofort, und es wird nicht helfen, wenn Sie es immer wieder posten. –

+0

Leute * gehen * dahin. Es gibt eine Überprüfungswarteschlange, mit der Sie zwei Wiederwahlstimmen erhalten. Und die Tatsache, dass du Zuxlx * gesagt hast, schau in die "Frage * und du wirst sehen, was ich versucht habe * zeige, dass du bereits weißt, dass es ein Duplikat ist. (Und um etwas zu verdeutlichen, * kopiert/fügt * einen Benutzer ein Windows Explorer: Programmierungslösungen kopieren nicht *; Code erstellt Verzeichnisse und kopiert Dateien.) –

Antwort

5

Hier ist ein Beispiel, das rekursiv ein Verzeichnis in ein anderes Zielverzeichnis klonen wird.In der Zukunft, und fügte hinzu, was Sie zu der aktuellen Frage versucht haben, werden Sie bessere Antworten

class Program 
{ 
    static void Main(string[] args) 
    { 
     CloneDirectory(@"C:\SomeRoot", @"C:\SomeOtherRoot"); 
    } 

    private static void CloneDirectory(string root, string dest) 
    { 
     foreach (var directory in Directory.GetDirectories(root)) 
     { 
      string dirName = Path.GetFileName(directory); 
      if (!Directory.Exists(Path.Combine(dest, dirName))) 
      { 
       Directory.CreateDirectory(Path.Combine(dest, dirName)); 
      } 
      CloneDirectory(directory, Path.Combine(dest, dirName)); 
     } 

     foreach (var file in Directory.GetFiles(root)) 
     { 
      File.Copy(file, Path.Combine(dest, Path.GetFileName(file))); 
     } 
    } 
} 
+0

Das ist, was ich suche. Das tat genau was ich wollte. Es kopiert und fügt ein ein Ordner auf einen neuen Pfad. Danke! –

+0

Ich fügte hinzu, was ich versuchte. Vielen Dank :) –