2016-12-04 9 views
0

ファイルをバックアップするプログラムを作成しようとしています。コピー部分はすでに動作していますが、コピー元ディレクトリに存在しないディレクトリやファイルをコピー先ディレクトリから削除したいと思います。ソースディレクトリに存在しない場合にのみ、ターゲットディレクトリ内のファイルを削除します。

私はの線に沿って何かを考えています:

// Get existing files in destination 
string[] existingTargetFiles = Directory.GetFiles(targetDir, "*.*", SearchOption.AllDirectories); 

// Get existing directories in destination 
    string[] existingTargetDirectories = Directory.GetDirectories(targetDir, "*", SearchOption.AllDirectories); 

// Compare and delete directories that exist in destination but not source 
foreach (string existingDirectory in existingTargetDirectories) 
{ 
    if (!Directory.Exists(Path.Combine(sourceDir, existingDirectory))) 
     Directory.Delete(Path.Combine(targetDir, existingDirectory)); 
    } 
} 

// Compare and delete files that exist in destination but not source 
foreach (string existingFiles in existingTargetFiles) 
{ 
    if (!Directory.Exists(Path.Combine(sourceDir, existingFiles))) 
     Directory.Delete(Path.Combine(targetDir, existingFiles)); 
} 

}

この作品のようなものを作る方法上の任意の考えを?

+0

この再帰的な問題を解決する必要があります – NtFreX

答えて

0

私はそれ以外の場合は、一貫性の原因となります、私は最初のファイル削除するために変更した。..ファイルの削除などのファイルクラスを使用して、ソース・ディレクトリとそれを組み合わせる相対ファイルパスを取得するには

をいくつかの変更を行いました次のコードファイルの問題(あなたがDirectory.GetFiles(targetDir, "*.*", SearchOption.AllDirectories);を使用して再帰的にファイルの一覧を取得しているよう)フォルダがいくつかのシナリオでは、その前に削除されたため見つからない

 // Get existing files in destination 
     string[] existingTargetFiles = Directory.GetFiles(targetDir, "*.*", SearchOption.AllDirectories); 

     // Get existing directories in destination 
     string[] existingTargetDirectories = Directory.GetDirectories(targetDir, "*", SearchOption.AllDirectories); 

     // Compare and delete files that exist in destination but not source 
     foreach (string existingFiles in existingTargetFiles) 
     { 

      if (!File.Exists(existingFiles.Replace(targetDir, sourceDir))) 
      { 

       File.Delete(existingFiles); 
      } 
     } 
     // Compare and delete directories that exist in destination but not source 
     foreach (string existingDirectory in existingTargetDirectories) 
     { 

      if (!Directory.Exists(existingDirectory.Replace(targetDir, sourceDir))) 
      { 
       Directory.Delete(existingDirectory,true); 
      } 
     } 
+0

これは私にとってはうまくいきました。私は、私のforeachループとFile.Delete()の両方でDirectory.Delete()を持っていることにも気づいた!助けてくれてありがとう! – user3426050

0

は、先のディレクトリではなく、中に存在する先のディレクトリからすべてのこれらのファイルを削除しますソースディレクトリ:

 //Source path directory 
     string sourceDir = @"G:\Sample\Source"; 
     //Target path directory 
     string targetDir = @"G:\Sample\Destination"; 

     //Function that will return name of directory or file 
     public static string GetDirectoryName(string path) 
     { 
      return path.Substring((path.LastIndexOf("\\") + 1)); 
     } 

     // Get existing files in destination 
     string[] existingTargetFiles = Directory.GetFiles(targetDir, "*.*", SearchOption.AllDirectories); 
     // Get existing files in source 
     string[] existingSourceFiles = Directory.GetFiles(sourceDir, "*.*", SearchOption.AllDirectories); 
     // Get existing directories in destination 
     string[] existingTargetDirectories = Directory.GetDirectories(targetDir, "*", SearchOption.AllDirectories); 
     // Get existing directories in source 
     string[] existingSourceDirectories = Directory.GetDirectories(sourceDir, "*", SearchOption.AllDirectories); 


     // Compare and delete files that exist in destination but not source 
     string TargetFileName = ""; 
     string SourceFileName = ""; 
     bool IsTargetFileIsInSourceFileList = false; 
     //Getting each single file from Target directory. 
     foreach (string existingFiles in existingTargetFiles) 
     { 
      //Getting only name of current file. 
      TargetFileName = GetDirectoryName(existingFiles); 
      //Let current file is not present in list of source files. 
      IsTargetFileIsInSourceFileList = false; 
      //Getting each single file from Source directory. 
      //If current file of Target directory not exists in list of source directory files 
      //then IsTargetFileIsInSourceFileList would be false 
      //And if exists the IsTargetFileIsInSourceFileList would be true. 
      foreach (string existingSourceFile in existingSourceFiles) 
      { 
       SourceFileName = GetDirectoryName(existingSourceFile); 
       if (string.Equals(TargetFileName, SourceFileName)) 
       { 
        IsTargetFileIsInSourceFileList = true; 
        break; 

       } 
      } 
      //if IsTargetFileIsInSourceFileList is false and delete the file 
      if (!IsTargetFileIsInSourceFileList) 
      { 
       File.Delete(existingFiles); 
      } 

     } 


     // Compare and delete directories that exist in destination but not source 
     foreach (string existingDirectory in existingTargetDirectories) 
     { 
      //Getting name of directory from path of current directory taken from list. 
      string sourceDirPath = Path.Combine(sourceDir, GetDirectoryName(existingDirectory)); 
      //if name of current directory is not present in list of directories of source 
      //Delete the directory 
      if (!existingSourceDirectories.Contains(sourceDirPath)) 
      { 
       Directory.Delete(existingDirectory); 
      } 

     } 
関連する問題