Help us understand the problem. What is going on with this article?

ファイル選択ダイアログのフィルタパターンがダブって表示される事がある

More than 5 years have passed since last update.

※ C#向けに説明していますが、内部でWin32の GetOpenFileName / GetSaveFileName を使用しているプログラムが対象です。
  フィルタの書式については、C++、その他各言語のスタイルに置き換えてお読み下さい。


ファイルを選択するダイアログを表示するとき、拡張子を絞り込むために

OpenFileDialog.Filter = "音楽ファイル|*.mp3";

などと設定すると思いますが、Windows ユーザー の設定によっては、このフィルタパターンが表示される事があります。

違いをスクリーンショットで撮りました。OSはWindows 7です。
まずはPC購入時と同等の設定です。通常は次のように表示されます。
P1

そして、 設定を変更した 際の表示です。
P2

('ω')

じゃあ何の設定を変えたのかと言うと、これです。

P3

登録されている拡張子は表示しない です。既定値は ON です。

この動作の違いを見て、「何の問題があるの?」という人と、
「えっじゃあアレやばくね」と思う人に分かれると思いますが、
今回の記事は後者の方々が対象になっています。前者の方は軽めに読んで下さい。

で、なにが「ヤバくね」なのかというと、

OpenFileDialog.Filter = "音楽ファイル|*.mp3";

こうではなく、

OpenFileDialog.Filter = "音楽ファイル (*.mp3)|*.mp3";

こういう風に書いているコードがありまして、
拡張子を常に表示させるようにするためのもので、自分も普通に使うようになってしまった書き方なのですが、
今回これが内部で上手く処理してくれているというのと、
あるパターンでダブって表示されてしまう事がわかりました。

何個かパターンを挙げてみましたので、自分のコードを確認しながらご覧下さい。

  1. 拡張子でフィルタしている

    OpenFileDialog.Filter = "実行ファイル (*.exe)|*.exe";
    

    P4

    常に拡張子を表示させたい場合に使われるパターンです。
    ネット上でもよく見かけます。

  2. ファイル名を限定している

    OpenFileDialog.Filter = "特定実行ファイル (OnlyOne.exe)|OnlyOne.exe";
    

    P5

    この記事を書くきっかけとなった、ファイル名を限定しているパターンです。ダブりました。

  3. 拡張子が無い

    OpenFileDialog.Filter = "MOTDファイル motd|motd";
    

    P6

    これもダブりましたね。何気に括弧が外れていますが、
    付けても(motd) (motd)になるのは確認済みです。

  4. フィルタはしていないが、選択するファイル名を表示している

    OpenFileDialog.Filter = "特定実行ファイル (OnlyOne.exe)|*.exe";
    

    P7

    特定と言いつつ、表示されるのは全てのEXEファイルというよくわからないパターン。
    実際には無いと思いますが、これはダブって表示されてしまいます。

  5. フィルタはしているが、ユーザーには任意のファイルを選ばせるように表示している

    OpenFileDialog.Filter = "特定実行ファイル (*.exe)|OnlyOne.exe";
    

    P8

    ユーザーにはなんでも良いよと言いつつファイル名は限定するというパターン。何がしたいのか。
    実際には無いとは思いますが、これはダブりませんね。なんとなく動きが解ってきた気がします。

  6. フィルタが間違っている

    OpenFileDialog.Filter = "実行ファイル (*.exe)|*.txt";
    

    P9

    フィルタと一致していないので表示されるかと思いましたが、表示側が優先されるようです。
    挙動を確認するために挙げましたが、ジョークソフト以外では見る機会は無さそうです。


表示文字列に拡張子が含まれていれば、フィルタパターンは表示されないようです。
上記に無い、複数の拡張子が含まれているケースですが、これも上の結果と同じのようです。

この前初めて知って衝撃を受けたのですが、幸い自作のソフトには問題ありませんでした。

パターンを細かく調べた訳では無いので、教えて頂ければ追記していきます。

kuchikios
✌('ω')✌
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away