C#ディレクトリ内の画像ファイルを絞り込む

C# コンピュータ
C#

ディレクトリ内にある.jpgや.pngなど画像ファイルの拡張子をもつファイルを絞り込みたい。

// 
// ディレクトリ内の画像ファイルを絞り込む
// 

using System;
using System.Collections.Generic;
using System.Linq;

using System.Text.RegularExpressions;
using System.IO;

// コンパイル
// csc PicFileSearch.cs

class PicFileSearch {
    // エントリーポイント
    static void Main() {

        // 対象の画像ファイルの拡張子一覧
        var picExt = new List<string> {
            ".png",
            ".jpg",
            ".jpge",
            ".bmp",
            ".gif",
        };

        string targetDir = @"./img/";

        var d = Directory.EnumerateFiles(targetDir)
            .Where(x => picExt.Contains(Path.GetExtension(x).ToLower()));
        
        // 結果の表示
        Console.WriteLine("List<string>.Contains()");
        foreach (string f in d) {
            Console.WriteLine("{0}", f);
        }

        // 正規表現
        string pattern = @".(jp(e)?g|bmp|png|gif)$";

        var e = Directory.EnumerateFiles(targetDir)
            .Where(x => Regex.IsMatch(x, pattern, RegexOptions.IgnoreCase));
        
        // 結果の表示
        Console.WriteLine("正規表現");
        foreach (string f in e) {
            Console.WriteLine("{0}", f);
        }
    }
}

.NETでファイルの一覧を取得する方法のうちの一つでSystem.IO.Directory.EnumerateFiles()を試してみました。
このメソッドの戻り値はIEnumerable<string>だったりするので、LINQを使った絞り込みやforeachすることが出来ます。また、同じIEnumerable<T>属のList<T>に変換することも容易です。LINQの場合、絞り込んだ後、項目を加工、並べ替えなどの処理をつなげるて記述することも出来ます。

Whereで絞り込みをさせたいのですが、拡張子が複数あり条件式が長くなりがちです。
絞り込みの条件にList.Contains()とRegex.IsMatch()を試してみました。

Regex.IsMatchで正規表現によるマッチングは、文字列の末尾とのマッチや大文字小文字の両方とマッチなど、通常の文字列操作数回分を1回の命令で表現することが出来ます。

List.Contains()を使った方法は、あまり使う場面は多くないかもしれませんが、絞り込む拡張子の種類が動的に変動するような場合使えるかもしれません。

コメント

  1. すずめ より:

    コードの部分が
    // 正規表現
    string pattern = @”\.(jp(e)?g|bmp|png|gif)$”;

    var e = Directory.EnumerateFiles(targetDir)
    .Where(x => Regex.IsMat

    までしか表示されていません。
    私のブラウザの環境、設定が原因かもしれませんが、
    chrome,firefox,edge の各ブラウザで同様です。

    私はLINQは不得意で、たいへん勉強になる記事なので
    もし不具合でしたら改善いただければ幸いです。

    • 八 四 より:

      ご指摘ありがとうございます。
      不具合と思われる部分を修正してみました。
      ご不便をおかけいたしまして申し訳ございません。

  2. すずめ より:

    早速のご対応ありがとうございます。

    ちゃんと動きました。