Gesamtes Verzeichnis im C# kopieren
Hallo, Ich programmiere schon einige zeit in "Microsoft Visual C# 2010 Express". Doch jetzt bin ich auf folgendes Problem gestoßen: Ich möchte einen ganzen Ordner (mit Unterordner, Dateien, ... Einfach alles im Ordner!) kopieren, doch mein Code (unten) erstellt immer ein weiteres Unterverzeichnis...
Also zum Beispiel: "C:/User/Myname/AppData/MyFolder/sourceFolder"
soll nach: "C:/User/Myname/AppData/MyFolder/targetFolder"
KOPIERT werden (Dadurch nützt mir die Anweisung System.IO.Directory.Move nichts)
Doch er kopiert das ganze nach: "C:/User/Myname/AppData/MyFolder/targetFolder/sourceFolder"
Was muss ich bei dem Code ändern??
Hier ist der Code:
private void CopyDirectoryWithIncludedFiles(string dirCopySource, string dirCopyTarget)
{
// alle Unterverzeichnisse des aktuellen Verzeichnisses ermitteln
string[] subDirectories = Directory.GetDirectories(dirCopySource);
// Zielpfad erzeugen
StringBuilder newTargetPath = new StringBuilder();
{
newTargetPath.Append(dirCopyTarget);
// Diese Zeile Erstellt einen Ordner im Zielordner: (Kann leider nicht entfernt werden!)
newTargetPath.Append(dirCopySource.Substring(dirCopySource.LastIndexOf(@"\")));
}
// wenn aktueller Ordner nicht existiert -> ersstellen
if (!Directory.Exists(newTargetPath.ToString()))
Directory.CreateDirectory(newTargetPath.ToString());
// Unterverzeichnise durchlaufen und Funktion mit dazu gehörigen Zielpfad erneut aufrufen (Rekursion)
foreach (string subDirectory in subDirectories)
{
string newDirectoryPath = subDirectory;
// wenn ''/'' an letzter Stelle dann entfernen
if (newDirectoryPath.LastIndexOf(@"\") == (newDirectoryPath.Length - 1))
newDirectoryPath = newDirectoryPath.Substring(0, newDirectoryPath.Length - 1);
// rekursiever Aufruf
CopyDirectoryWithIncludedFiles(newDirectoryPath, newTargetPath.ToString());
}
// alle enthaltenden Dateien des aktuellen Verzeichnisses ermitteln
string[] fileNames = Directory.GetFiles(dirCopySource);
foreach (string fileSource in fileNames)
{
// Zielpfad + Dateiname
StringBuilder fileTarget = new StringBuilder();
{
fileTarget.Append(newTargetPath);
fileTarget.Append(fileSource.Substring(fileSource.LastIndexOf(@"\")));
}
// Datei kopieren, wenn schon vorhanden überschreiben
File.Copy(fileSource, fileTarget.ToString(), true);
}
}
Bitte helft mir! Brauche das ganz dringend!
1 Antwort
Hier einmal deine Methode die ich bearbeitet habe. Code den ich für überflüssig hiel, hab ich auskommentiert.
private void CopyDirectoryWithIncludedFiles(string dirCopySource, string dirCopyTarget)
{
// wenn aktueller Ordner nicht existiert -> ersstellen
if (!Directory.Exists(dirCopyTarget))
Directory.CreateDirectory(dirCopyTarget);
// alle Unterverzeichnisse des aktuellen Verzeichnisses ermitteln
string[] subDirectories = Directory.GetDirectories(dirCopySource);
// Unterverzeichnise durchlaufen und Funktion mit dazu gehörigen Zielpfad erneut aufrufen (Rekursion)
foreach (string subDirectory in subDirectories)
{
//string newDirectoryPath = subDirectory;
string targetPath = dirCopyTarget + "\\" + Path.GetFileName(subDirectory);
//// wenn ''/'' an letzter Stelle dann entfernen
//if (newDirectoryPath.LastIndexOf(@"\") == (newDirectoryPath.Length - 1))
// newDirectoryPath = newDirectoryPath.Substring(0, newDirectoryPath.Length - 1);
// rekursiever Aufruf
CopyDirectoryWithIncludedFiles(subDirectory, targetPath);
}
// alle enthaltenden Dateien des aktuellen Verzeichnisses ermitteln
string[] fileNames = Directory.GetFiles(dirCopySource);
foreach (string fileSource in fileNames)
{
// Zielpfad + Dateiname
//StringBuilder fileTarget = new StringBuilder();
//{
// fileTarget.Append(newTargetPath);
// fileTarget.Append(fileSource.Substring(fileSource.LastIndexOf(@"\")));
//}
string targetPath = dirCopyTarget + "\\" + Path.GetFileName(fileSource);
// Datei kopieren, wenn schon vorhanden überschreiben
File.Copy(fileSource, targetPath, true);
}
}
Und hier ist eine etwas kürzere Methode die ich angefertigt hab'.:
private void CopyDirectory(string dirSource, string dirTarget)
{
// wenn aktueller Ordner nicht existiert -> ersstellen
if (!Directory.Exists(dirTarget))
Directory.CreateDirectory(dirTarget);
// Unterverzeichnise durchlaufen und Funktion mit dazu gehörigen Zielpfad erneut aufrufen (Rekursion)
foreach (string subDir in Directory.GetDirectories(dirSource))
CopyDirectory(subDir,
dirTarget + "\\" + Path.GetFileName(subDir));
// alle enthaltenden Dateien des aktuellen Verzeichnisses durchlaufen und Kopieren
foreach (string strFile in Directory.GetFiles(dirSource))
File.Copy(strFile,
dirTarget + "\\" + Path.GetFileName(strFile),
true);
}
PS: Ich bin mir nicht 100% sicher ob das was ich gepostet hab', eine Antwort bzw die Lösung auf die von dir gestellte Frage war. Falls ich die Frage/Aufgabe falsch verstanden hab, bitte ich um eine bessere Erklärung.
MfG KlickKlackKluck