ファイル名拡張子


Macintoshソフトウェア開発者の一部は、ファイル名拡張子に対して困惑を示します。書類の種類と所有権を指定するという意味において、拡張子は、マルチフォークHFSまたはHFS+ボリュームフォーマットによって可能となる、タイプ・クリエータコードをはじめとする、高機能なメタデータに比べて原始的に思えるからです。【そうそう】

けれども、インターネット時代においては、書類は異質なネットワーク間を頻繁に行き来します。ある書類が、MacintoshからLinuxネットワークサーバへ、さらにWindowsコンピュータへ移動することもあります。このパス上の各コンピュータは、何が書類の種類を構成しているかについて、異なる考えを持っていることでしょう。

多くのコンピュータシステムは、書類の種類を、単によく知られているファイル名拡張子(.jpg、.mp3、.htmlといった)によって定義しています。こうしたシステムは拡張子を持たないファイルをどうすればよいか知らず、未知の種類として扱うことがあります。他のシステムも、HFS+ファイルシステムと、それが記録するメタデータについて、少ししか、もしくは全く知識を持っていません。ファイルを転送するとき、こうしたシステムはメタデータを取り去ってしまい、その結果それは完全に失われてしまうでしょう。

ファイル名拡張子を隠す

Macintoshユーザ体験を維持するために、Mac OS Xはファイルごとの単位でファイル名拡張子を隠す手段を提供しています。ファイルシステムの各ファイルは、その拡張子を隠すか表示するかを区別する、特別なフラグを持っています。ユーザはファイル名拡張子を表示したいかどうかを元に、このフラグをセットすることができます。ユーザは、個々のファイルの設定に関わらず、すべてのファイルのファイル名拡張子を隠すか、表示するか、各自のFinder環境設定を調節することができます。

注:ファイル名拡張子を隠すか、表示するかの設定は、ファイルの表示名にだけ作用します。(表示名についての詳細は、「表示名」(43ページ)を参照。)これらの設定は、ファイルシステムにおけるファイルの名前を、物理的に変更することはありません。

ファイル名拡張子に対応する

プラットフォーム間相互処理可能性を保障し、Mac OS Xユーザ体験を保つためにあなたが従うべき、ファイル名拡張子に対応するための基本的なガイドラインがいくつか存在しています…

  • あなたのすべての書類の種類は、関連付けられたファイル名拡張子を、確実に持つようにしましょう。
  • あなたのユーザインタフェースにファイルを表示するときは、常にファイルの表示名を使用しましょう。(詳細は、「あなたのコードで表示名を得る」(44ページ)を参照。)
  • 保存ダイアログは、ユーザに対して、ファイル名拡張子を隠すかどうかをコントロールできるようにするべきです。
  • アプリケーションは、書類を開いたり保存するときに、既存の表示/非表示設定と、ファイル名拡張子を保つべきです。
  • アプリケーションは、新規のファイルを保存するときや、既存のファイルを「別名で保存」コマンドを用いて保存するときに、適切な拡張子を加えるべきです。
  • アプリケーションは、拡張子を持たないファイルに拡張子を加えたり、表示/非表示設定を変更すべきではありません。
  • アプリケーションは、ユーザが既知の、正しくないファイル名拡張子を入力した後でファイルを保存しようとしたときに、警告表示を行うべきです。

Carbonアプリケーションに対しては、保存ダイアログを作成するために、あなたはNavigation Servicesを使用します。

もしあなたが、作成オプションkNavPreserveSaveFileExtensionを指定した場合、ダイアログはデフォルトファイル名のファイル名拡張子を維持し、初期状態では隠します。

また、あなたはユーザにファイル名拡張子を表示するか、隠すかの選択肢を与えるように、あなたのダイアログを拡張することもできます。もしそうするのであれば、現在の拡張子の可視性を設定するためにNavDialogSetSaveFileExtensionHidden関数を用い、ユーザの選択を判断するためにNavDialogGetSaveFileExtensionHidden関数を用いることができます。

ファイルを保存するときに起こりうる筋書きの詳細は、「保存ダイアログの筋書き」(40ページ)を参照してください。

もし、ユーザがあなたの保存ダイアログでファイル名拡張子を入力しなかった場合は、あなたのダイアログのコードは、「拡張子を隠す」チェックボックスを有効なままにしておくべきです。

Cocoaアプリケーションに対しては、NSSavePanelクラスが、同様にファイル名拡張子を隠す、表示するための選択肢を提供します。

あなたがもしユーザにファイル名拡張子を表示する、隠すための選択肢を持たせたいのであれば、ダイアログの表示に先立って、NSSavePanelのsetCanSelectHiddenExtension:メソッドを呼んでください。

あなたはユーザの選択を判断するために、isExtensionHiddenメソッドを使用することができます。

また、Carbonアプリケーションは、保存ダイアログの外部でもLaunch Servicesを用いてファイル名拡張子の可視性を変更することができます。LSSetExtensionHiddenForRef および LSSetExtensionHiddenForURL関数は、それぞれFSRefとCFURLRef型を用いて、あなたにファイル名拡張子の可視性を設定させます。

Cocoaアプリケーションは、NSFileManagerのメソッドchangeFileAttributes:atPath:を同じように用いることができます。

保存ダイアログの筋書き

ファイルを保存するときには、ファイル名拡張子の表示、非表示に関わる、検討すべきいくつかの筋書きが存在します…

  • ユーザが既知の、正しい拡張子を入力したときには、何が起こるでしょうか?
  • ユーザが既知の、不適切な拡張子を入力したときには、何が起こるでしょうか?
  • ユーザが拡張子を入力しなかったり、未知の拡張子を入力したときには、何が起こるでしょうか?

最初の筋書きは、扱いが最も簡単です。もしユーザが既知の、正しい拡張子を入力したときには、あなたのダイアログのコードは拡張子を隠すフラグと、対応するダイアログのコントロールをクリアする必要があります。ファイルを保存するとき、あなたはファイルのプロパティに、拡張子を表示すべきであることを示す設定を行う必要があります。

ユーザが既知の、不適切な拡張子を入力した状況に対しては、あなたは警告表示を行うべきです。あなたの警告表示で、不適切な拡張子が入力されたことをユーザに知らせ、正しい拡張子を提案してください。

次にダイアログボックスは、ユーザに操作を取り消させるか、拡張子を変更させるか、ファイル名を両方の拡張子と共に、すなわち、ユーザの入力した文字列に正しい拡張子を加えて【"readme.jpg"を入力→"readme.jpg.txt"】保存します。

ユーザが拡張子を入力しなかったり、未知の拡張子を入力した状況に対しては、適切な拡張子をファイル名に加えて、拡張子を表示しない印を付けてください。たとえば、もしユーザが文字列書類をMyDocument.oldとして保存したら、あなたは"MyDocument.old.txt"という名前のファイルを作成し、拡張子を隠すことを示すファイル属性を設定することになるでしょう。従って、ユーザはFinderや開くダイアログ、保存ダイアログにおいて引き続きMyDocument.oldという名前を目にすることになります。【気持ち悪ぅ…】

タイプコードとファイル名拡張子

ファイル名拡張子に加えて、アプリケーションはそれが作成するあらゆるファイルに対して、ファイルタイプと、任意でクリエータタイプも設定すべきです。これらのタイプコードは厳密には必要ではありませんが、Classic環境のアプリケーションとの相互処理可能性を保障します。もし、与えられたファイルに既にファイルタイプやクリエータタイプがあれば、あなたはその情報を保つ必要があります。

アプリケーションは自分で作成した書類に対してクリエータタイプを設定できます。こうすることで、書類とそれを作成したアプリケーションとの間に、緊密な結びつきが生まれます。

アプリケーションは書類が既に持っていたクリエータタイプを、黙って変更すべきではありません。もし、あなたのアプリケーションが開いた書類のクリエータタイプを変更したいのであれば、あなたのアプリケーションはユーザがそのファイルを保存するときに、【ダイアログなしの上書き保存ではなく】保存ダイアログを表示すべきです。これによってユーザは、必要に応じてファイルの名前を付け直す機会を得ます。もしあなたのアプリケーションで編集している書類が、ファイルの種類を変更したら、あなたはこのようにする必要があるでしょう。この場合には、あなたは保存ダイアログにおいて、ファイルに適切なファイル名拡張子も割り当てる必要があります。

与えられた書類に対する、最優先の編集アプリケーションではないアプリケーションは、これらの書類にクリエータタイプを設定すべきではありません。

たとえば、インターネットブラウザは多数のさまざまな種類のファイルをダウンロードし、保存しますが、こうしたファイルすべての所有権を持つという意味ではありません。