2016-09-15 13 views
0

System.MasksユニットからTMaskを使用するとき、私は異なるファイル名(または他の文字列)のセットをフィルタリングできるかどうか疑問に思いました。もしそうなら、どうやって* .fooと* .barのようなものをフィルタリングできますか?MatchesMaskを使用していくつかの異なるファイル名をフィルタリングする

';'異なるフィールド間で(明らかに、ソースコードを読んだ後に)動作しません。

*。[fb] [oa] [or]のように* .fooと* .barファイルをフィルタリングすることもできますが、* .far、* .booなどもフィルタリングします。

これまでのところ、元のソースコードを完全に理解する時間はありませんでした。特に私は 'msMBCSLiteral'が何のために使われているのだろうかと思います。この場合、これは役に立ちますか?または、これを達成するための他の方法がありますか?

PS:私は他の方法でフィルタリングを解決する方法について知っています(フィルタリング用のカスタムコードを書きます)。しかし、既存のコードを再利用したいので、TMaskを使いたいと思っています。

+0

私はこれが不可能であると確信しています。明示的に述べているドキュメントは見つかりませんが、MatchesMaskの説明に従っているようです。また、この質問への回答でも述べられています:http://stackoverflow.com/questions/12726756/how-to-pass-multiple-file-extensions-to-tdirectory-getfiles – DNR

+1

正規表現は利用できませんか? 'Masks'だけでなく、' System.Masks'の使用に応じて、最近のバージョンのDelphiを使用しています。この場合、正規表現は本当に簡単です。 –

答えて

3

MatchesMask機能には、2つの異なる文字セットを並行して検出する機能はありません。 msMBCSLiteral状態は、マルチバイト文字の先頭バイトを検出するためのものであり、2つのブランチのいずれかを検出するためのものではありません。

二回関数を呼び出し、二つの異なるマスクを一致させるために:

if MatchesMask(filename, '*.foo') or MatchesMask(filename, '*.bar') then 
    // ... 

をあなたはまた、正規表現を使用することができます。大文字小文字を区別するためのフラグを設定していれば、\.(foo|bar)$が動作します。

Bashスタイルのマスクをサポートするライブラリをお持ちの場合は、*.{foo,bar}を使用できます。私はDelphiのためのそのようなライブラリを認識していませんが、それはあなたが見た場合、あなたが1つを見つけることができなかったことを意味しません。

+0

残念ながら、私が使用するライブラリでは、MatchesMask呼び出しが内部的に実行される(1つの)TMaskが必要です。 – CWBudde

+0

それを働かせるチャンスがないように、私はこの答えを受け入れる傾向があります。しかし、私はそうするまで数日待つ。たぶん、誰かがこのための創造的な解決策を考え出すでしょう。 – CWBudde

関連する問題