2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

複数のフィルタを噛ましてファイルの一覧を取得

Posted at

概要

一口で言ってしまうと、DirectoryInfoEnumerateFiles使うときにSearchPatternが指定できますけど、複数のパターンを指定したくなったよー
って話です

これには、大きく分けて二つの方法があります
つまり、先に絞るか・後で絞るか―――

先に絞る

先に絞る方は、個々のSearchPatternEnumerateFilesに与えて、得られた結果を統合するやり方、ですね

こちらの方式の長所は、EnumerateFiles(SearchPattern)を利用するので、プログラムとして分かりやすいとこでしょうかねぇ、いろんな意味でね

短所は、ここのSearchPatternが実は謎仕様である点
こちらにある様な謎を秘めているらしいです

総合的には、それらひっくるめてWindowsの標準的な動作と一致している安心感が得られるんじゃないでしょうか(良し悪しは別にして)、と思ってます

後で絞る

後で絞るのは、SearchPatternを指定せず全ての結果を受け入れたうえで、複数のSearchPatternに合致するファイルだけに着目する方式

こちらの問題点はSearchPatternの取り扱いでしょうか
結局、SearchPatternを正規表現と見立ててフィルタを自作することになり、色々面倒そう
謎仕様のSearchPatternを完全に踏襲するのは更に難しそうです

利点としては、謎仕様ぶん投げて独自仕様の明確なSearchPatternを確立できるとこでしょう、裏っ返しですけど

で、効率的なのはどっち?

という観点では、実装の仕方だけではなく、母集団の状況とフィルタの関連性から、一義的に決まるものではない
と勝手に結論付けました

ではどうするのが一番楽な方法だろうか?
以下ではこの観点で結論を導き出しました

結局

「先に絞る」一択です、圧倒的に楽なのは
SearchPatternの解釈をWindows側に押し付けちゃえますからね

先に絞ってから ⇒ 統合する、って云うのがなんとなくめんどくさそうな響きがありますけど、実はこいつもLinqにお任せすれば1行で書けます

それが、こちら!

C# OneLine snipet
    "*.pdf;*.ppt;*.png".Split(';')
        .SelectMany(filter => new DirectoryInfo("フォルダパス").EnumerateFiles(filter))

しまった、2行になってしまった…






いやー、たった2行書くのに引っ張ったなー

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?