2017-07-14 41 views
0

我有一個foreach語句是一部分這樣的功能:C#排除文件擴展從foreach語句

try 
{ 
    string pathToFiles = sourceTB.Text; 
    DirectoryInfo dirInfo = new DirectoryInfo(pathToFiles); 
    int i = 0; 

    foreach (var files in dirInfo.EnumerateFiles()) 
    { 
    //Do stuff here 
    } 
    MessageBox.Show("Process Successful", "Completed"); 
} 
catch 
{ 
    MessageBox.Show("Process failed", "Failed"); 
} 

我希望能夠代碼,以便它會讀取所選文件夾的全部內容(這工作正常),但我正在努力,所以它會跳過任何具有特定文件擴展名的文件。

例如,如果該文件夾中的每個文件都是.txt文件,並且我想省略.jpg文件。

我已經嘗試了一些方法來實現這個功能,比如:

var allFilesFromFolder = Directory.GetFiles(pathToFiles); 
var filesToExclude = Directory.GetFiles(pathToFiles, "*.jpg"); 
var filetoInclude = allFilesFromFolder.Except(filesToExclude); 

這:

var files = Directory.GetFiles(pathToFiles).Where(name => !name.EndsWith(".jpg")); 

但這兩把錯誤引入到在foreach循環中的代碼,並不會配合當循環通過文件。

有什麼辦法可以達到這個目的嗎?

+3

他們在代碼中帶來什麼錯誤?請解釋 – Steve

+1

究竟是什麼問題?你的代碼(至少是第二個變體)似乎沒問題。 –

+1

[Directory.GetFiles某些擴展名]的可能重複(https://stackoverflow.com/questions/13301053/directory-getfiles-of-certain-extension) –

回答

2

你可以準備你不想處理的擴展名的列表,然後使用該列表,同時列舉由DirectoryInfo.EnumerateFiles

List<string> excluded = new List<string>() {".jpg", ".png"}; 
foreach (var file in dirInfo.EnumerateFiles().Where(x => !excluded.Contains(x.Extension)) 
{ 
    //Do stuff here 
} 
+0

完美的作品。謝謝! – lostintranslation

+1

只是關於變量命名的一個注意事項,它應該是單個'var file'。我知道OP有它的複數形式,但是這可能是一個錯字,或者反映了對'foreach'循環的不正確理解,所以如果修復了接受的答案,那將會更好。 –

+0

感謝您的留言@RacilHilan我正在努力改善我的代碼的清潔度以供他人閱讀,所以我非常感謝您的文章。 – lostintranslation

0

的方式,你正在試圖做的,它返回FileInfo類應該工作正常,但你也可以在您的原代碼的模式,例如這會給你所有的文本文件:

foreach (var file in dirInfo.EnumerateFiles("*.txt")) 
{ 
    //Do stuff here 
} 

另一種方法是讓你的原代碼,然後把檢查裏面的擴展:

foreach (var file in dirInfo.EnumerateFiles("*.txt")) 
{ 
    if(file.Extension == ".jpg") 
    continue; 

    //Do stuff here 
}