2016-12-04 62 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循環的Directory.Delete(),並沒有File.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); 
      } 

     }