Ausgabe
Ich möchte ein Verzeichnis als Copy/Paste-Routine verschieben, indem ich seine Struktur so behalte, wie sie ist. Ich suche nicht nur nach den Dateien in allen Unterordnern in einem Verzeichnis und kopiere sie dann (wie diese Lösung), sondern möchte das Ganze klonen und seine Struktur so beibehalten, wie sie ist (Baum -> Unterordner und Dateien), genau wie eine Copy-and-Paste-Routine.
Also habe ich diese Funktion gefunden, die einen Ordner voller Dateien in einen neuen Pfad kopiert:
Ordner -> Datei(en)
Die Funktion verhält sich wie die Copy/Paste-Routine. Es braucht SourcePath, DestinationPath und einen booleschen Wert für OverWriteExisting. Schön und klein, aber schade, dass es dort nicht als eigentliche Antwort auf diese Frage markiert war (einen Tarif empfehlen).
Aber was ist, wenn ich ein ganzes Verzeichnis verschieben möchte? Mit anderen Worten, was ist, wenn ich einen Ordner habe, der Ordner von Ordnern von Ordnern von Dateien usw. enthält? Und vielleicht ist die Größe des Dateistrukturbaums wie folgt unbekannt:
Ordner -> Ordner(s) -> … -> Ordner(s) -> Datei(en)
Ich verwende die folgende Routine, um einen Ordner mit Ordnern zu kopieren/einzufügen. Aber hier weiß ich, dass ich nur eine Ordnerebene habe, sodass nur eine foreach-Schleife erforderlich ist:
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:
Ordner -> Ordner -> Datei(en)
Ich habe es versucht und es hat nicht das getan, was ich wollte. Ich rufe nur alle Dateien ab, während alle Unterordner durchsucht werden. Was ich nicht will. Ich möchte die Unterordner und die ursprüngliche Struktur beibehalten. Hier bekomme ich vier Dateien anstelle des Verzeichnisses, das so strukturiert ist, Unterordner und deren Unterordner, Unterordner, Dateien. Nur vier, weil es Duplikate entfernt, was ich nicht möchte, weil ich alle brauche.
Hier ist meine aktuelle Struktur (aber meine Frage ist global für jedes Verzeichnis):
Ordner -> Ordner -> Ordner + Dateien
Folgendes macht der folgende Code im neuen Pfad:
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 bei? Nicht nur die Dateien aus einem Verzeichnis holen und verschieben!
Lösung
Hier ist ein Beispiel, das ein Verzeichnis rekursiv in ein anderes Zielverzeichnis klont. In Zukunft werden Sie bessere Antworten erhalten, wenn Sie der aktuellen Frage hinzufügen, was Sie versucht haben
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)));
}
}
}
Beantwortet von – Hawkstrider
Antwort geprüft von – Clifford M. (FixError Volunteer)