カテゴリー
未分類

ElectronのshowOpenDialogSync()メソッドを、fitler指定してコールしたのに、拡張子の制限が反映されない。

原因は、拡張子を配列で指定していないことでした。

ファイル選択ダイアログ表示する際に、選択対象をPDFファイルだけに制限しようと考えて、以下のような誤ったコードを書いていました。

dialog.showOpenDialogSync({
  filters: [
    {name: 'PDFファイル', extensions: 'pdf'} //これは誤りです。
    ]
});

しかしながら上記のコードでは、以下の画像のようにPDF以外のファイルも選択候補になります。

期待したのは、以下の画像のようにPDFファイルだけが選択候補となる事です。

正しくは、以下のようにextensionsに配列を記述すべきでした。

//これは誤りです。
dialog.showOpenDialogSync({
  filters: [
    {name: 'PDFファイル', extensions: ['pdf']}//正しくは、このように配列として渡します
    ]
});

今から考えると、extensionsという言葉自体が複数形なので、分かりそうなものですが、作業中は気づかず少し困っていました。

['jpg', 'jpeg'] のような、複数の拡張子を持つファイルであれば、もっと意識したかもしれませんね。

同じようにお困りの方のお役に立てれば幸いです。

公式ドキュメントを読んでみると、他にありがちなミスで、'pdf'と書くべきところを*.pdfと書いてしまったり、.pdfと書いてしまったりするケースが紹介されていました。

https://www.electronjs.org/docs/api/dialog

The extensions array should contain extensions without wildcards or dots (e.g. 'png' is good but '.png' and '*.png' are bad). To show all files, use the '*' wildcard (no other wildcard is supported).

https://www.electronjs.org/docs/api/dialog

extensions配列は、ワイルドカードやドットは含めないでください。(例えば、'png'は正しいですが、'.png''*.png'はダメです)。

全てのファイルを表示するには'*'ワイルドカードを使います。(他の種類のワイルドカードは、どれもサポートされません)