2016-07-21 55 views
0

我發現了有關Directory.GetFiles()的堆棧溢出的幾個問題,但在所有情況下,他們解釋瞭如何使用它來查找特定擴展名或通過多個標準的一組文件。但在我的情況下,我想要的是使用正則表達式獲取Directory.GetFiles()的搜索模式,該模式返回目錄中的所有文件,但返回了我指定的集合。我的意思是不宣佈我想要的那一套,但不同之處。例如,如果我想要一個目錄的所有文件而不是htmls。請注意,我」,M知道它可以通過這種方式來實現這一目標:使用Directory.GetFiles()來選擇除了特定擴展名之外的所有文件

var filteredFiles = Directory 
.GetFiles(path, "*.*") 
.Where(file => !file.ToLower().EndsWith("html"))) 
.ToList(); 

但是,這並不是一個很可重複使用的解決方案,如果以後我要篩選另一種文件,我不得不改變代碼添加一個||到Where條件。我正在尋找一些東西,允許我創建一個正則表達式,它包含我不想獲取的文件並將其傳遞給Directory.GetFiles()。所以,如果我想稍後過濾更多的擴展,只是改變正則表達式。

// for example a field or property in your class 
private HashSet<string> ExtensionBlacklist { get; } = 
    new HashSet<string>(StringComparer.InvariantCultureIgnoreCase) 
    { 
     ".html", 
     ".htm" 
    }; 
// ... 

var filteredFiles = Directory.EnumerateFiles(path, "*.*") 
    .Where(fn => !ExtensionBlacklist.Contains(System.IO.Path.GetExtension(fn))) 
    .ToList(); 
+0

看到一個非常相似的http://stackoverflow.com/questions/13301053/directory-getfiles-of-certain-extension –

回答

7

,如果你想過濾器擴展(S)你並不需要一個正則表達式?

Regex.IsMatch爲此目的。但是,您也可以更改代碼以在一組擴展中查找擴展來進行過濾,這也可以讓您輕鬆添加新的過濾器。

+0

我想知道這和一個正則表達式之間的盈虧平衡點,因爲'包含'將數組越長越慢。 – Joey

+0

@Joey:然後使用'HashSet '代替。它總是會比正則表達式效率更高 –

+0

謝謝蒂姆。你明白了。是一個相當乾淨的解決方案,我的問題 –

0

所以基本上你只是不知道如何對字符串進行正則表達式匹配:

1

我會建議不要贊成一些使用正則表達式是這樣的:

var filteredFiles = Directory 
    .GetFiles(path, "*.*") 
    .Where(file => !excludedExtensions.Any<string>((extension) => 
    file.EndsWith(extension, StringComparison.CurrentCultureIgnoreCase))) 
    .ToList(); 

你可以傳遞一個集合,爲您排除的擴展名,例如:

var excludedExtensions = new List<string>(new[] {".html", ".xml"}); 

Any將短路只要它在排除的擴展名中找到匹配項,我認爲這甚至更適用於excludedExtensions.Contains()。至於正則表達式,我不認爲有充足的理由使用它,因爲它可以買你的麻煩。除非它是唯一的工具,否則不要使用正則表達式。

+0

感謝您的正則表達式提示Rory。我會記住的 –

相關問題