2016-07-21 74 views
0

Directory.GetFiles()についてStack Overflowに関するいくつかの質問がありましたが、すべてのケースで特定の拡張子を見つける方法を説明していますまたは複数の基準による一連のファイルを含むことができます。しかし、私の場合、Directory.GetFiles()の検索パターンは正規表現を使用してディレクトリのファイルをすべて返しますが、指定したセットが返されます。私は、私が望むセットを宣言するのではなく、その違いを宣言することを意味します。たとえば、ディレクトリのすべてのファイルを必要とするが、htmlは必要ない。 mが、それはこの方法でそれを達成することができ知っている、i」は、ことに注意してください:Directory.GetFiles()を使用して特定の拡張子以外のすべてのファイルを選択

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

しかし、その後、私は、コードを変更する必要がファイルの別の種類のフィルタ処理する場合、これは、非常に再利用可能なソリューションではありません||を追加するWhere条件にします。私は私が取得し、Directory.GetFiles()に渡したくないファイルに構成されて正規表現を作成できる何かを探しています。だから、後で拡張機能をフィルタリングしたい場合は、正規表現を変更するだけです。

+0

非常によく似たものを参照してください。http://stackoverflow.com/questions/13301053/directory-getfiles-of-certain-extension –

答えて

7

あなたは拡張子(複数可)をフィルタ処理したい場合は、正規表現を必要としません:

// 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

これは正規表現と正規表現の間のブレークポイントがどこになるのでしょうか?配列が長くなるほど遅くなる。 – Joey

+0

@Joey:代わりに 'HashSet 'を使ってください。正規表現よりも常に効率的です –

+0

Thanks Tim。あなたはその考えを持っています。私の問題のためにきれいな解決策です –

0

だから、基本的に、あなただけの文字列に正規表現マッチを実行する方法がわかりませんか?

その目的のためにRegex.IsMatchがあります。ただし、フィルタを拡張する一連の拡張モジュールを参照するようにコードを変更すると、新しいフィルタを簡単に追加できます。

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の正規表現のおかげでありがとう。私は心に留めておきます –

関連する問題