- PR -

済)ファイル名を複数の条件で検索する

投稿者投稿内容
うちうせん
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 96
お住まい・勤務地: 福岡県
投稿日時: 2007-04-12 11:52
C#での質問です。

フォルダ内のファイルを検索するソフトを作成中です。
そこで条件として複数のワイルドカード指定を考えています。
例えば・・・
a*.txt
*bcd*.exe
上記の2つの条件をorでヒットするファイルをリストアップするといった感じです。
実装する方法として2つほど考えています。

1)1フォルダに対してDirectory.GetFilesを設定されたワイルドカードの数だけ繰り返す
2)Directory.GetFilesにてすべてのファイルを取得した後、ワイルドカードと一致するかどうか1ファイルごとに判断する

ここで質問ですが、2)の方法をとる場合取得したあとのファイル名に対してワイルドカードと一致するかどうか判断する方法ってあるのでしょうか?
もし、この2つの方法以外にこういうのもあるよ?っていう方もアドバイスお願いします。


_________________
うちうせん

[ メッセージ編集済み 編集者: うちうせん 編集日時 2007-04-12 11:53 ]

[ メッセージ編集済み 編集者: うちうせん 編集日時 2007-04-18 12:10 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-04-12 12:03
引用:

うちうせんさんの書き込み (2007-04-12 11:52) より:

ここで質問ですが、2)の方法をとる場合取得したあとのファイル名に対してワイルドカードと一致するかどうか判断する方法ってあるのでしょうか?


いくつかありますが、C# となれば正規表現で良いのではないでしょうか。
VB であれば、Like 演算子という選択肢もありますが。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
うちうせん
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 96
お住まい・勤務地: 福岡県
投稿日時: 2007-04-12 12:15
返答ありがとうございます。

正規表現クラスとしてregexというクラスを見つけました。
その線も考えてはいたのですが、検索条件をユーザーが指定できるようにしたいため、簡単なワイルドカードをつかっての条件設定ができれば助かるのですが・・・
正規表現のことは詳しくはないのですが、正規表現になるとある程度の知識が必要な気がして条件設定のハードルがあがりそうな感じがしたもので。
VBでLike演算子が使えるので、その判断部分のみVBを使用する方がいいんでしょうか・・・
_________________
by うちうせん
わちゃ
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 162
お住まい・勤務地: 東京
投稿日時: 2007-04-12 12:53
ユーザの入力を、正規表現形式に置換して、Regex を使ってはどうでしょうか?

? -> .
* -> .*

といった感じで。他に、正規表現の特殊文字( + など )のエスケープとかは、
しないといけないでしょうけど。
うちうせん
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 96
お住まい・勤務地: 福岡県
投稿日時: 2007-04-12 13:45
ワイルドカード入力を正規表現に変換する方法についてですが・・・
正規表現のメタ文字の中でファイル名に使用できる文字をエスケープ処理する(\付け)で合ってますか?
そこでワイルドカード *.exe を正規表現にするとします。
自分なりに考えた答えだと
".*\.exe"
だったんですが・・・どうも"\."がだめらしくコンパイルエラーがでます。
正規表現に詳しい方アドバイスお願いします。

調べた結果正規表現のメタ文字は
.\/[]^-?+*(){}$|!
ということですが、この中で単純に\付けではダメだとか、ほかにもこんなメタ文字があるとかあれば教えてください。

開発環境を書き忘れていました

WindowsXP Pro SP2
VS2005 Standard


_________________
うちうせん

[ メッセージ編集済み 編集者: うちうせん 編集日時 2007-04-12 13:45 ]

[ メッセージ編集済み 編集者: うちうせん 編集日時 2007-04-12 13:47 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-04-12 20:35
存在しているファイルを検索するんでしょ?[Win]+[F]じゃだめなの?
_________________
うちうせん
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 96
お住まい・勤務地: 福岡県
投稿日時: 2007-04-13 00:01
検索のあとにいろいろと処理が入るので・・・
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2007-04-13 09:54
>コンパイルエラー
まずその詳細を書くべきですが、推測するにC#自体のエスケープ文字列も¥ですので、おそらくそれが原因でしょう。文字列として¥を表現する場合には "¥¥" とするか @"¥" と必要があります。
正規表現パターンの場合¥¥はめんどくさいし見通しが悪いので、大抵 @"" リテラルを使いますが。

まぁそれはいいとして、Regex クラスの静的メソッドに Escape っていうのがありますので、正規表現のメタ文字を調べたりしないでそっちを使いましょう。将来メタ文字が拡張されないとも限らないし。
あと、正規表現の場合全文マッチの場合は^とか$とかをつけたほうがよろしいです(意味はリファレンスを参照してください)。

その辺踏まえたうえで適当にコードにしてみました。

コード:


static string WildcardToRegexPattern(string expression) {
return "^" + Regex.Replace(
expression,
@"([*?]|[^*?]+)",
delegate(Match match) {
string str = match.ToString();
return
str == "?" ? "." :
str == "*" ? ".*" :
Regex.Escape(str);
},
RegexOptions.Compiled
) + "$";
}



いろいろ適当ですんで意味は理解してから使ってくださいね。仕様により修正する必要があるかもしれませんので。


[ メッセージ編集済み 編集者: ya 編集日時 2007-04-13 09:56 ]

スキルアップ/キャリアアップ(JOB@IT)