簡體   English   中英

使用Directory.GetFiles()選擇除特定擴展名之外的所有文件

[英]Using Directory.GetFiles() to select all the files but a certain extension

我在Stack Overflow上發現了有關Directory.GetFiles()的幾個問題,但在所有情況下,它們都說明了如何使用它通過多個條件來查找特定擴展名或一組文件。 但是在我的情況下,我想要的是使用正則表達式獲取Directory.GetFiles()的搜索模式,該搜索模式返回目錄的所有文件,但我指定的是集合。 我的意思是不聲明我想要的集合,而是區別。 例如,如果我想要目錄的所有文件,而不是htmls。 注意,我知道可以通過這種方式實現:

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();

我建議不要使用正則表達式來支持這樣的事情:

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在排除的擴展名上找到匹配項, Any就會短路,因此我認為這甚至比excludedExtensions.Contains()更可取。 至於正則表達式,考慮到它可以給您帶來麻煩,我認為沒有充分的理由使用它。 除非它是該工作的唯一工具,否則不要使用正則表達式。

因此,從本質上講,您只是不知道如何對字符串執行正則表達式匹配?

有正則表達式正則表達式 但是,您也可以更改代碼以在要過濾的一組擴展中查找該擴展,這也使您可以輕松添加新的過濾器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM