2017-08-29 68 views
2

我想製作一個程序,將文件從一個特定的文件夾,以及主文件夾的子文件夾內的文件備份到另一個備份文件夾。複製文件和備份現有的+子目錄

這是我試圖完成目標的代碼的一部分,但是我只備份主文件夾中的文件,並且子文件夾被完全複製(其中的所有文件)。

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; 

    } 

有關如何只複製「源」文件夾中存在的子文件夾中的文件的任何想法?

另外,CopyAll功能:

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); 

     } 
    } 

在此先感謝。

回答

1

你可以試試這個方式 容易得多

//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

一個簡單的辦法:在你CopyAll方法,加載SearchOption.AllDirectories參數傳送給GetFiles方法:

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

該解決方案有效,但文件被複制到根目錄/ no子目錄被創建/。因爲我是新手,所以我可能會做錯事。 – Kristian

0

您可以沿着使用Directory.GetFilesSearchOption.AllDirectories從子文件夾中提取文件以及:

Directory.GetFiles(path, *search pattern goes here*, SearchOption.AllDirectories) 
相關問題