※ C#向けに説明していますが、内部でWin32の GetOpenFileName / GetSaveFileName を使用しているプログラムが対象です。
フィルタの書式については、C++、その他各言語のスタイルに置き換えてお読み下さい。
ファイルを選択するダイアログを表示するとき、拡張子を絞り込むために
OpenFileDialog.Filter = "音楽ファイル|*.mp3";
などと設定すると思いますが、Windows ユーザー の設定によっては、このフィルタパターンが表示される事があります。
違いをスクリーンショットで撮りました。OSはWindows 7
です。
まずはPC購入時と同等の設定です。通常は次のように表示されます。
('ω')
じゃあ何の設定を変えたのかと言うと、これです。
登録されている拡張子は表示しない
です。既定値は ON
です。
この動作の違いを見て、「何の問題があるの?」という人と、
「えっじゃあアレやばくね」と思う人に分かれると思いますが、
今回の記事は後者の方々が対象になっています。前者の方は軽めに読んで下さい。
で、なにが「ヤバくね」なのかというと、
OpenFileDialog.Filter = "音楽ファイル|*.mp3";
こうではなく、
OpenFileDialog.Filter = "音楽ファイル (*.mp3)|*.mp3";
こういう風に書いているコードがありまして、
拡張子を常に表示させるようにするためのもので、自分も普通に使うようになってしまった書き方なのですが、
今回これが内部で上手く処理してくれているというのと、
あるパターンでダブって表示されてしまう事がわかりました。
何個かパターンを挙げてみましたので、自分のコードを確認しながらご覧下さい。
-
拡張子でフィルタしている
OpenFileDialog.Filter = "実行ファイル (*.exe)|*.exe";
常に拡張子を表示させたい場合に使われるパターンです。
ネット上でもよく見かけます。 -
ファイル名を限定している
OpenFileDialog.Filter = "特定実行ファイル (OnlyOne.exe)|OnlyOne.exe";
この記事を書くきっかけとなった、ファイル名を限定しているパターンです。ダブりました。
-
拡張子が無い
OpenFileDialog.Filter = "MOTDファイル motd|motd";
これもダブりましたね。何気に括弧が外れていますが、
付けても(motd) (motd)
になるのは確認済みです。 -
フィルタはしていないが、選択するファイル名を表示している
OpenFileDialog.Filter = "特定実行ファイル (OnlyOne.exe)|*.exe";
特定と言いつつ、表示されるのは全てのEXEファイルというよくわからないパターン。
実際には無いと思いますが、これはダブって表示されてしまいます。 -
フィルタはしているが、ユーザーには任意のファイルを選ばせるように表示している
OpenFileDialog.Filter = "特定実行ファイル (*.exe)|OnlyOne.exe";
ユーザーにはなんでも良いよと言いつつファイル名は限定するというパターン。何がしたいのか。
実際には無いとは思いますが、これはダブりませんね。なんとなく動きが解ってきた気がします。 -
フィルタが間違っている
OpenFileDialog.Filter = "実行ファイル (*.exe)|*.txt";
フィルタと一致していないので表示されるかと思いましたが、表示側が優先されるようです。
挙動を確認するために挙げましたが、ジョークソフト以外では見る機会は無さそうです。
表示文字列に拡張子が含まれていれば、フィルタパターンは表示されないようです。
上記に無い、複数の拡張子が含まれているケースですが、これも上の結果と同じのようです。
この前初めて知って衝撃を受けたのですが、幸い自作のソフトには問題ありませんでした。
パターンを細かく調べた訳では無いので、教えて頂ければ追記していきます。