2017-08-29 12 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方法では、あなたのGetFiles方法にSearchOption.AllDirectories引数を読み込む:

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

解決策は機能しますが、ファイルはルートディレクトリにコピーされます。/ noサブディレクトリは作成されません/。私は新しいものと何か間違っているかもしれない。 – Kristian

0

あなたは一緒にDirectory.GetFilesを使用することができますSearchOption.AllDirectoriesでサブフォルダからもファイルを抽出します。

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