2017-08-29 1 views
2

Ich versuche, ein Programm zum Sichern von Dateien aus einem bestimmten Ordner zusammen mit den Dateien in den Unterordnern des Hauptordners zu einem anderen Sicherungsordner zu machen.Kopieren Sie Dateien und sichern Sie die vorhandenen + Unterverzeichnisse

Dies ist Teil des Codes Ich versuche, das Ziel zu erreichen, aber ich werde nur die Dateien aus dem Hauptordner gesichert, und die Unterordner werden vollständig kopiert (alle Dateien in ihnen).

public static string[] Backup(string sourceDirectory, string targetDirectory, string backupDirectory) 
    { 
     DirectoryInfo diBackup = new DirectoryInfo(backupDirectory); 
     DirectoryInfo diTarget = new DirectoryInfo(targetDirectory); 

     List<string> dups = new List<string>(); 
     string[] fileNamesSource = Directory.GetFiles(sourceDirectory, "*", SearchOption.AllDirectories); 
     string[] fileNamesDest = Directory.GetFiles(targetDirectory, "*", SearchOption.AllDirectories); 
     List<string> dupNS = new List<string>(); 
     List<string> dupND = new List<string>(); 
     List<string> BCKP = new List<string>(); 
     string replacement = ""; 

     for (int i = 0; i < fileNamesDest.Length; i++) 
     { 
      string res = fileNamesDest[i].Replace(targetDirectory, replacement); 
      dupND.Add(res); 

     } 


     foreach (var ns in fileNamesSource) 
     { 
      string res = ns.Replace(sourceDirectory, replacement); 
      dupNS.Add(res); 

     } 

     var duplicates = dupND.Intersect(dupNS); 

     string[] DuplicatesStringArray = duplicates.ToArray(); 

     foreach (var dup in DuplicatesStringArray) 
     { 
      string res = targetDirectory + dup; 
      BCKP.Add(res); 

     } 

     string[] ToBeBackedUp = BCKP.ToArray(); 


     Directory.CreateDirectory(diBackup.FullName); 

     // Copy each file into the new directory. 
     foreach (FileInfo fi in diTarget.GetFiles()) 
     { 
      if (ToBeBackedUp.Contains(fi.FullName)){ 

      fi.CopyTo(Path.Combine(diBackup.FullName, fi.Name), true); 
      } 

     } 

     // Copy each subdirectory using recursion. 
     foreach (DirectoryInfo diSourceSubDir in diTarget.GetDirectories()) 
     { 
      if (ToBeBackedUp.Contains(diSourceSubDir.FullName)) { 
      DirectoryInfo nextTargetSubDir = 
       diBackup.CreateSubdirectory(diSourceSubDir.Name); 
      CopyAll(diSourceSubDir, nextTargetSubDir); 
      } 
     } 
     return ToBeBackedUp; 

    } 

Irgendwelche Ideen, wie kann ich nur die Dateien in den Unterordnern kopieren, die in der „Quelle“ Ordner vorhanden?

Auch die CopyAll Funktion:

public static void CopyAll(DirectoryInfo source, DirectoryInfo target) 
    { 

     Directory.CreateDirectory(target.FullName); 

     // Copy each file into the new directory. 
     foreach (FileInfo fi in source.GetFiles()) 
     { 


       fi.CopyTo(Path.Combine(target.FullName, fi.Name), true); 


     } 

     // Copy each subdirectory using recursion. 
     foreach (DirectoryInfo diSourceSubDir in source.GetDirectories()) 
     { 
      DirectoryInfo nextTargetSubDir = 
       target.CreateSubdirectory(diSourceSubDir.Name); 
      CopyAll(diSourceSubDir, nextTargetSubDir); 

     } 
    } 

Vielen Dank im Voraus.

Antwort

1

Sie auf diese Weise als versuchen Viel einfacher

//Now Create all of the directories 
foreach (string dirPath in Directory.GetDirectories(SourcePath, "*", 
    SearchOption.AllDirectories)) 
    Directory.CreateDirectory(dirPath.Replace(SourcePath, DestinationPath)); 

//Copy all the files & Replaces any files with the same name 
foreach (string newPath in Directory.GetFiles(SourcePath, "*.*", 
    SearchOption.AllDirectories)) 
    File.Copy(newPath, newPath.Replace(SourcePath, DestinationPath), true); 
1

Eine einfache Lösung: in Ihre CopyAll Methode, laden Sie das SearchOption.AllDirectories Argument Ihre GetFiles Methode:

foreach (FileInfo fi in source.GetFiles("*", SearchOption.AllDirectories)) 
{ 
    fi.CopyTo(Path.Combine(target.FullName, fi.Name), true); 
} 
+0

Die Lösung funktioniert, aber die Dateien werden in das Stammverzeichnis kopiert/kein Unterverzeichnis wird erstellt /. Ich könnte etwas falsch machen, da ich neu bin. – Kristian

0

Sie Directory.GetFiles zusammen verwenden können mit SearchOption.AllDirectories, um die Dateien auch aus den Unterordnern zu extrahieren:

Directory.GetFiles(path, *search pattern goes here*, SearchOption.AllDirectories) 
Verwandte Themen