タイトル今から始めるCocoaプログラミング》文書ファイルを扱うアプリケーションを作る(14)Cocoaでのファイル情報-2カテゴリーユーザインタフェース, Cocoa, 今から始めるCocoaプログラミング
作成日2002/1/8 15:54:10作成者新居雅行
NSPathUtilitiesに次のような機能がある。ちなみにNSPathUtilitiesクラスは、パスを扱う場合に便利なメソッドがいろいろあるので、Cocoa-Javaでのファイル処理では有用に使えることも多いだろう。

☆指定したファイルにファイル情報を設定する(Static)
 boolean NSPathUtilities.setFileAttributes( String path, NSDictionary attributes);
 戻り値:設定できればtrue、失敗すればfalse
 引数:path:設定を行うファイルのパス
    attributes:ファイル属性をNSDictionaryクラスで指定する

☆指定したファイルの情報を取得する(Static)
 NSDictionary NSPathUtilities.fileAttributes( String path, boolean flag);
 戻り値:ファイル情報が含まれたNSDictionaryクラスのインスタンス
     (ファイルが存在しない場合、戻り値がnullとなる)
 引数:path:情報を得たいファイルのパスを指定する
    flag:pathで指定したファイルがシンボリックリンクの場合、flagがtrue
       ならリンク先のファイルの情報を得る。falseなら、シンボリックリ
       ンクファイル自体の情報を得る

ここでファイルの属性は、NSDictionayクラスで管理される(このクラスは記事の末尾で説明する)。キーワードと情報についての対応は次の表のようになっている。データのクラスのIntegerやBooleanはjava.langパッケージにあるものだ。

◇属性データのNSDictionaryのキーとデータ
setFileAttributesメソッドで設定できる属性
↓ fileAttributesメソッドで取得できる属性
↓ ↓ キーワード(データのクラス)データの内容
↓ ↓ ―――――――――――――――――――――――――――
× ○ FileSize(Integer)ファイルのサイズのバイト数
○ ○ FileModificationDate(NSDate)ファイルの修正日
× ○ FileOwnerAccountName(String)ファイルのオーナー
× ○ FileGroupOwnerAccountName(string)ファイルのグループ
× ○ FileReferenceCount(Integer)ハードリファレンスの個数
× ○ FileIdentifier(Integer)ファイルID
× ○ FileDeviceIdentifier(Integer)ファイルデバイスのID
○ ○ FilePosixPermissions(Integer)アクセス権
× ○ FileType(String)ファイルの種類(別表参照)
○ ○ FileExtensionHidden(Integer)0なら拡張子を非表示、1なら表示
○ ○ FileHFSCreatorCode(Integer)クリエイタ(未設定なら0)
○ ○ FileHFSTypeCode(Integer)ファイルタイプ(未設定なら0)

◇ファイル情報でキー「FileType」に対応するデータとして取り得る文字列
 FileTypeDirectory
 FileTypeRegular
 FileTypeSymbolicLink
 FileTypeSocket
 FileTypeCharacterSpecial
 FileTypeBlockSpecial
 FileTypeUnknown

setFileAttributesメソッドでは当然ながら設定可能な情報は限られているけど、さらに、実際に設定できるのは、実行しているプロセスのアカウントと同じオーナーのものに限られる。あるいはルート権限で実行しているプロセスからの変更となる。自分で保存したファイルについては通常はファイルの情報を変更できるはずだ。setFileAttributesメソッドではすべての属性を設定する必要はなく、設定をしたい属性だけ、NSDictionayのキーとして設定すればいい。具体的には次回にプログラムを紹介しよう。
なお、ドキュメントでは整数で得られるデータはintegerと記載があるが、実際には、java.lang.Integerというintのラッパークラスとなっている。拡張子を隠しているかどうかはFileExtensionHiddenというキーで得られるはずとなっていてドキュメントではクラスについてはbooleanとなっているが実際にはjava.lang.Integerである。

さて、ファイルタイプやクリエイタは、Integerクラスである(つまりはint型)。C言語だと、‘TEXT’と書けばlong型が得られたのでいいのであるが、Javaではこの書き方ができない。そこで、テキストで記述した4バイトのコードを整数にしたり、あるいは逆を行う必要がある。そのために用意されたのが、NSHFSFileTypesクラスのメソッドである。

☆4バイトの文字列から対応する整数値を得る(Static)
 int NSHFSFileTypes.hfsTypeCodeFromFileType(String fileType);
 戻り値:タイプやクリエイタに対応した整数値
 引数:fileType:ファイルタイプやクリエイタを示す文字列(以下の本文を参照)

☆整数値から4バイトのコードを得る(Static)
 String NSHFSFileTypes.fileTypeForHFSTypeCode(int typeCode);
 戻り値:ファイルタイプやクリエイタを示す文字列(以下の本文を参照)
 引数:typeCode:タイプやクリエイタに対応した整数値

☆指定したファイルのファイルタイプを取得する(Static)
 String NSHFSFileTypes.hfsTypeOfFile(String filePath);
 戻り値:ファイルタイプを示す文字列(以下の本文を参照、未設定なら‘’のみ)
 引数:filePath:調べたいファイルのパスを文字列で指定する

ここで、ファイルタイプをTEXTにしたいのなら、そのTEXTに対応した整数値を得るために、4バイトのコードの前後にシングルクォーテーションを付けた文字列を指定する必要がある。つまり、

int theCode = NSHFSFileTypes.hfsTypeCodeFromFileType("‘TEXT’");

とするのである(実際にはシングルクォーテーションは半角)。また、fileTypeForHFSTypeCodeやhfsTypeOfFileで得られる文字列も前後にシングルクォーテーションがついているので、結果的に得られる文字列は6バイトということになる。

いずれにしても、具体的なプログラムを示さないと、まったく初めてこれらのクラスに遭遇した場合には理解しづらいだろう。NSDictionaryクラスのことを説明した後に、実際のプログラムを紹介しよう。
(この項、続く)
関連リンク