2014-01-14 101 views
-1

以下比較兩個文件夾並刪除兩個文件夾中存在的文件。比較兩個文件夾並刪除C#中兩個文件夾中都不存在的文件

var common = from f1 in Directory.EnumerateFiles(targetDir, "*.*", SearchOption.AllDirectories) 
        join f2 in Directory.EnumerateFiles(sourceDir, "*.*", SearchOption.AllDirectories) 
        on Path.GetFileName(f1) equals Path.GetFileName(f2) 
        select f1; 

     foreach (string file in common) 
     { 
      File.Delete(file); 
     } 

如何修改它刪除存在於我的TARGETDIR沒有在我的sourceDir存在的文件?

+5

問題是不明確的。你的意思是你想刪除在兩個文件夾中具有相同名稱但不是相同內容的文件嗎? – Marshall777

+0

爲什麼我們需要比較這兩個文件夾中是否不存在? – Gun

+0

您發佈的代碼將向控制檯寫出列表1中的文件名,而不是列表2中的文件名。任何地方都會被刪除 - 特別是不是同時存在的文件....這很混亂.... –

回答

0

怎麼樣的東西這樣的:

list1.Where(f1 => list2.Where(f2 => f2.Name == f1.Name).Any()); 

我不知道你所說的「不一樣」的意思,但更換f2.Name == f1.Name與實際值的比較,你正在尋找使

+0

對不起,我發佈了這樣的代碼: var common = from f1 in Directory.EnumerateFiles(targetDir,「*。*」,SearchOption.AllDirectories) 在Directory.EnumerateFiles(sourceDir,「*。*」,SearchOption .AllDirectories) on Path.GetFileName(f1)等於Path.GetFileName(f2) select f1; foreach(字符串文件的共同點) { File.Delete(file); } – user3194708

1

像這樣的東西應該(仔細測試...):

// List files 
var sourceFiles = Directory.EnumerateFiles(sourceDir, ".", SearchOption.AllDirectories) 
var targetFiles = Directory.EnumerateFiles(targetDir, ".", SearchOption.AllDirectories) 

// Makes path relatives so you can compare files in subdirectories 
sourceFiles = sourceFiles .Select(f => new Uri(f).MakeRelativeUri(sourceDir)) 
targetFiles = targetFiles.Select(f => new Uri(f).MakeRelativeUri(targetDir)) 

// Get files from targetDir that does not exist in sourceDir 
var filesToDelete = targetFiles.Except(sourceFiles); 

foreach (string file in filesToDelete) 
{ 
    System.IO.File.Delete(System.IO.Path.Combine(targetDir, file); 
} 
相關問題