ディレクトリ内にある.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
Regex.IsMatch()
を試してみました。
Regex.IsMatch
で正規表現によるマッチングは、文字列の末尾とのマッチや大文字小文字の両方とマッチなど、通常の文字列操作数回分を1回の命令で表現することが出来ます。
List
コメント
コードの部分が
// 正規表現
string pattern = @”\.(jp(e)?g|bmp|png|gif)$”;
var e = Directory.EnumerateFiles(targetDir)
.Where(x => Regex.IsMat
までしか表示されていません。
私のブラウザの環境、設定が原因かもしれませんが、
chrome,firefox,edge の各ブラウザで同様です。
私はLINQは不得意で、たいへん勉強になる記事なので
もし不具合でしたら改善いただければ幸いです。
ご指摘ありがとうございます。
不具合と思われる部分を修正してみました。
ご不便をおかけいたしまして申し訳ございません。
早速のご対応ありがとうございます。
ちゃんと動きました。