タイトル鶴薗賢吾のCocoaはやっぱり!出張版》#4-Mac OS X 10.1の新機能(5)カテゴリーCocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
作成日2001/10/4 16:4:6作成者新居雅行
■ 拡張子の扱い

◎拡張子に関するガイドライン

Mac OS X 10.1で、ファイルの拡張子の扱いについてのガイドラインが定義されました。全てのファイルに拡張子を表示するかどうかのフラグが、ファイル属性として追加されています。画面にファイル名やファイルパスを表示する際には、このフラグを参照して表示する必要があります。多くのアプリケーションは、このための修正が必要になるでしょう。拡張子のガイドラインは以下のところにありますので、参照ください。

◇Appleサイト
 http://developer.apple.com/techpubs/macosx/ReleaseNotes/FileExtensionGuidelines.html
◇ハードディスク上 ( Developer Toolsをインストールした場合 )
 /Developer/Documentation/ReleaseNotes/FileExtensionGuidelines.html

このガイドラインに沿っていないと、ファイル名の表示がFinderと異なるという状況になり、ユーザーに混乱を与えかねませんし、Mac OS X 10.1対応と謳うためには、必須のガイドラインと言えます。

基本的に全てのファイルには拡張子を付けることになります。これは、他のプラットホームとのファイル交換のことを考えたためです。しかし、なるべくユーザーに拡張子の存在を意識させないようにするために、ユーザーがファイル名を入力した時に、拡張子を入力しなかった場合は、拡張子を隠すように属性をコントロールした上で、そのファイルのフォーマットに応じた拡張子を付けます。逆に、ユーザーが意識的に拡張子を入力した場合は、拡張子はそのまま表示します。どちらにしても拡張子は付くわけですが、入力したままが表示されるのというのが方針で、これをAppleは「 What you see is what you type 」と呼んでいます。

◎ファイル名の表示

What you see is what you typeを実現するためには、ファイル名を表示するときに拡張子フラグを参照しないといけませんが、簡単な仕組みが用意されています。displayNameAtPath : というメソッドがNSFileManagerに用意されていて、ファイルパスを与えると、表示用のファイル名を得ることが出来ます。

NSFileManager *fm = [ NSFileManager defaultManager ];
NSString *dispName = [ fm displayNameAtPath : @" filepath " ];

★NSFileManager : 表示用のファイル名を取得
[書式] - (NSString *) displayNameAtPath : (NSString *) path
[入力] path : 表示用のファイル名を得たいファイルのフルパス
[出力] 返り値 : 表示用のファイル名 ( パスは含まない )
[備考] "/Users/crane/Pictures/photo.jpg" → "photo.jpg" or "photo"

◎セーブパネルでの拡張子の扱い

拡張子のガイドラインはセーブパネルでの動作についても取り決めをしてあります。ファイルを保存する際に、ユーザーに拡張子を隠すかどうかを選択できるようにするものです。以下の図のように、セーブパネルにチェックボックスを1つ追加します。

図. セーブパネルの拡張子を隠すためのチェックボックス
 

このためには、NSSavePanelのsetCanSelectHiddenExtension : というメソッドを使います。

★NSSavePanel : 拡張子表示のチェックボックスの表示状態を変更する
[書式] - (void) setCanSelectHiddenExtension : (BOOL) flag
[入力] flag : 拡張子のチェックボックスを表示する - YES、しない - NO
[出力] 返り値 : ファイルタイプ文字列

そして、セーブパネルを表示したら戻ってきたところで、isExtensionHiddenメソッドで、チェックボックスの状態がどうなっているかを取得します。

★NSSavePanel : 拡張子表示のチェックボックスの状態を取得する
[書式] - (BOOL) isExtensionHidden
[出力] 返り値 : 拡張子を隠す - YES、隠さない - NO

サンプルは以下のようになります。

NSSavePanel *sp = [ NSSavePanel savePanel ];
int iSts;
BOOL bHidden;

[ sp setCanSelectHiddenExtension : YES ]; // チェックボックス表示
iSts = [ sp runModalForDirectory : NSHomeDirectory()
file : @"Pictures" ];

bHidden = [ sp isExtensionHidden ]; // チェックボックスの状態取得

◎属性の取得と変更

この処理の続きとしてファイル保存があるわけですが、拡張子の属性を保存したファイルにセットする必要があります。要領は、ファイルタイプやクリエータと同様です。先程のファイル属性の辞書の先頭を見ると、NSFileExtensionHiddenという項目があります。これが、拡張子を隠すかどうかの属性です。値は、論理型なのでnumberWithBool : を使ってNSNumberを生成します。

// ファイル属性の辞書のサンプル
2001-XX-XX 16:31:55.374 FileTypeCreator[428] {
NSFileExtensionHidden = 0;
NSFileGroupOwnerAccountName = staff;
: 省略

// 拡張子を隠すかどうかの属性を変更する

// ファイル属性を取得
NSFileManager *fm = [ NSFileManager defaultManager ];
NSDictionary *dic = [ fm fileAttributesAtPath : filePath
traverseLink : YES ];
// ファイル属性をコピー
NSMutableDictionary *dicNew = [ NSMutableDictionary
dictionaryWithDictionary : dic ];

// NSNumberを準備
NSNumber *extHidden = [ NSNumber numberWithBool : YES or NO ];

// ファイル属性辞書を変更
[ dic setObject : extHidden
forKey : NSFileExtensionHidden ];

// ファイル属性を変更
[ fm changeFileAttributes : dicNew
atPath : filePath ];

拡張子のフラグをファイル属性の辞書から取得するメソッドも用意されています。

★NSDictionary : ファイル属性の辞書から拡張子のフラグを取得
[書式] - (BOOL) fileExtensionHidden
[出力] 返り値 : 拡張子を隠す - YES、隠さない - NO

//拡張子を隠すかどうかの属性を取得する
// ファイル属性を取得
NSFileManager *fm = [ NSFileManager defaultManager ];
NSDictionary *dic = [ fm fileAttributesAtPath : filePath
traverseLink : YES ];
// フラグを取得
BOOL bHidden = [ dic fileExtensionHidden ];


■ まとめ
Mac OS X 10.1において、ドックによる通知や拡張子のガイドラインなど、ユーザーインターフェイスに関する新たな機能が追加されました。その他、パフォーマンスの向上を始めとして、常用OSとして必要なものが随分とそろってきました。ネイティブアプリケーションがまだ少ないというところが、まだ大きな問題として残っていますが、逆に、基盤は整ってきたわけですし、今こそネイティブアプリケーションの開発をスタートするべき時に来ているのではないかと思います。

また、ここに書いた以外にも、さまざまな機能が追加されていますので、リリースノートやDevelolperフォルダーを色々と探ってみると新たな発見があると思います。
関連リンクCocoaはやっぱり!