Macintosh Developer Online (MDOnline)


2001年4月4日発行号 - FSRefでファイル処理



鉄ヲタの方はよく御存じかと思いますが、先月に埼玉高速鉄道という電車が開通しています。その終点、浦和美園駅って我が家から4kmほどのところであり、最寄り駅ではないものの1つの選択肢になりました。営団地下鉄南北線に直通なので、場所によっては乗り換えなしでもいけるので、使ったりもしています。しかし、何もない荒野に近いような場所にこつ然と駅があり、そのすぐそばにワールドカップの会場となる埼玉スタジアム(?)が、さらにこつ然とあります。場所的には東北自動車道浦和インターの少し東側になります。イベントを見越しての駅だけに、やたらスペースばかりが広く、なんじゃここはと思わず叫びたくなりますね。ただ、埼玉高速鉄道の料金がえらく高いのが難点ですが、電車はがらすきです。浦和美園まで乗る人はほとんどいません。この前なんて、夕方で通勤時間に入りかけくらいだったんですけど、最後まで乗っていたのは2人だけでした。ワールドカップがあるからということで、駅の位置をいろいろと画策はして本来の計画よりスタジアム寄りに落ち着いたようなのですが、それにしても、スタジアム以外は何もないところに、車庫と駅がどーんとあるわけです。道路も少しは整備されているのですが、この地域は用地買収が進まないのか、あるいは計画がきちんとしていないのか、広いみちなのに抜けていないというのがけっこうあって、やっぱりこつ然と交通量の少ない広い道路があちこちにあります。その割に田舎道を抜けないと駅にいけないなど、まだまだなんですけどね。ワールドカップのある何試合かは駅はにぎわうのかも知れないけど、その後はどうなるんでしょうね。でまあ、ふつう、こうした駅ができると住宅需要ができると思うのだけど、どうもこの地域は昔から開発されていません。地主が値上がりを待っているのかもしれません。だから、駅の周りにはマンションや住宅はまったくないですし、当然お店なども全然なく、売店すらしまったままだったりします。Mac OS Xもこつ然と売り出されましたけど、浦和美園駅のような状況となるのは避けたいな(などと強引にねたをマックに持って行く…)。
(新居雅行 msyk@mdonline.jp


Browsing Mac OS X》FSRefを使ったプログラムの実際

MDOnlineの「Browsing Mac OS X」のコーナーで、2001/3/31に“Carbonアプリケーションでロングファイルネームに対応するには”、4/3に“FSSpecをFSRefベースに移行させてロングファイル名に対応”として紹介してきた、Carbonアプリケーションをロングファイルネームに対応する手法に関する記事は今回で一通りのけじめとしたい。今回は、ファイル処理でどんなAPIを使えばいいのかを紹介しよう。もちろん、元ネタは、以下のFile Managerのリファレンスである。本来は自信をもってお届けしなければならないのだが、使いこなしたAPIではないので、もれや間違いもあるかも知れないので、御意見などは有り難くちょうだいしたいと考えている。

◇File ManAger Reference
 http://devworld.apple.com/techpubs/macosx/Carbon/Files/FileManager/File_Manager/index.html

さて、Navigation ServicesやAppleEventからFSRefとして得たファイル情報であるが、少なくともファイル名の文字列を得るということはやはり行いたいところだろう。文書ファイルのタイトルなどに表示するためである。そのためのAPIはFSGetCatalogInfoがあるのだが、このAPIではさまざまな情報を取得できる。ファイル名だけでなく、ファイルが存在するフォルダのFSRef、そしてカタログ情報だ。さらに、FSSpecまで得ることができるので、部分的にFSSpecでの処理が残っている場合もここでつなぎを取ることができる。逆に言えば、ファイル情報を得る機能はこれだけであると言ってもいいくらいだ。
FSGetCatalogInfoで得られたファイル名の情報は、UNICODEの文字列である。アルファベットも漢字も同様に2バイトを確保するタイプのUNICODE文字列だ。File ManagerのAPIはこのタイプのUNICODE文字列を使う。この文字列も構造体として記述されるが、16ビットキャラクタを1つの要素とする配列なので、配列の要素を1文字として処理できる。別のAPIにそのまま文字列を渡す場合には問題ないかもしれないが、特定の文字列を取り出したり見つけるようなプログラムの場合には注意が必要だろう。

なお、ファイルタイプやクリエイタなどの情報を得るにもFSGetCatalogInfoを使うが、ここでカタログ情報の構造体を使用する。カタログ情報の中の何の情報を取り出すかと言うことを定数で指定するなど、やや独特のやり方があるので、リファレンスをよく読んできめられた指定を行う。たとえば、ファイルタイプやクリエイタを得るには、次のように行う。


FSRef myFSRef;
FSCatalogInfoBitmap whichInfo;
FSCatalogInfo cInfo;
HFSUniStr255 outName;
FSRef parentRef;
FInfo* fInfoPtr;
OSErr er;

//myFSRefに処理対象となるファイルへの参照が設定されているとする
whichInfo = kFSCatInfoFinderInfo; //取り出す情報はFinder情報のみ
er = FSGetCatalogInfo(&myFSRef, whichInfo, &cInfo, &outName, nil, &parentRef);
fInfoPtr = (FInfo*)&(cInfo.finderInfo); //Finder情報への参照をできるようにしておく
//fInfoPtr->fdTypeでファイルタイプ得られるなど

ポイントは、FSCatalogInfoBitmap型の変数に取り出す情報の種類を定数で指定することだ。そうすると、FSCatalogInfo型構造体の指定のメンバにだけ、データが設定される。なお、FSGetCatalogInfoでは得たくない情報に関する引数にはnilを指定すればいい。前の例では、FSSpec構造体は得る必要はないので、5つ目の引数にはnilを指定した。カタログ情報の設定にはFSSetCatalogInfoを使う。

次に実際のファイルの読み書きの方法を説明しよう。やや独特の方法を使うのであるが、従来のFSSpecだとそれをもとにファイルをオープンすればよかった。Mac OS XのFile Managerでは、オープンする前に、データフォークの名称を取得し、FSRefで指定したファイルのデータフォーク名を指定して、オープンする必要がある。その意味では手順が1つ増えたことになる。ちなみに、以下のようなAPIが用意されているので、これらを使うことになる。


FSRefで指定したファイルを開いて読み出すプログラムの例は次の通りだ。まず、FSGetDataForkNameを使ってデータフォーク名を取り出しておく。ただ、実際には長さが0の文字列が取り出される。ファイルそのものの場合、フォークの名前という概念はないのかもしれない。リソースフォークをまとめて読み出すような場合などにも対応していることや、さまざまなボリューム形式でも複数のフォークに対応していることなどから、いずれにしてもこうした手続きを経る必要があるのだろう。ちなみに、HFSUniStr255型構造体は、lengthというメンバで長さ、unicodeという配列で実際の文字列を得るようになっている。そして、FSOpenForkでファイルを開く。FSRefだけでなくフォーク名を指定するが、さらにファイルのパーミッションを指定する。パーミッションは、FSSpec向けのAPIコールで使われていたのと同じ定義定数を使う。そして、ファイルへの参照値を得る。その参照値を用いて、配列などのバッファにFSReadForkデータを取り出し、最後にFSCloseForkで閉じると言うわけだ。FSReadForkでは読み出す位置の指定方法にいろいろなバリエーションがあり、やはり定義定数で指定することになる。

HFSUniStr255 dataForkName;
SInt16 forkRefNum;
Str255 a;
ByteCount cnt;
FSRef myFSRef
OSErr er;

//myFSRefに処理対象となるファイルへの参照が設定されているとする
er = FSGetDataForkName (&dataForkName);
er = FSOpenFork (&myFSRef, dataForkName.length, &dataForkName.unicode, fsRdPerm, &forkRefNum);
er = FSReadFork (forkRefNum, fsFromStart, 0, 255, &a, &cnt);
er = FSCloseFork(forkRefNum);

その他使いそうなAPIを抜粋してみた。File ManagerのAPIはあいかわらず定義の嵐だが、FSRefしか使わないということであるのなら、実際に使うAPIはごく一部だけになる。FSRef関連のAPIは他にいくつかあるが、代表的なものは、この記事で紹介できていると思う。

ここで、FSRefMakePathというAPIがあり、ファイルのフルパスが得られる。ただし、このフルパスは、コアOSレベルのディレクトリ階層でのフルパスだ。Finderでたどるパスとの違いがあるので注意が必要だ。また、漢字などはUTF-8でエンコードされている。つまり、ファイルシステムのキャラクタがそのままなのだ。文字列としてパスを得るためというよりも、BSDのシステムコールを呼ぶ時などに使うために用意されているのだと思われる。
ファイルを作成するFSCreateFileUnicodeでは、ファイル名などを指定するのはもちろんだが、ファイルタイプなどの付加情報はFSCatalogInfo構造体で指定する。この構造体の理解は、FSRefベースでファイル処理をするときにはとにかく欠かせないと言えるだろう。
作成しているアプリケーションをCarbon化するということで、さまざまな変更を加えてきたかもしれないが、とりあえず動いてしまうファイル関連の最適化は後回しになっていたかもしれない。一連のテキストが参考になれば幸いだ。

カテゴリ:Browsing Mac OS X


CarbonLib SDKのVer.1.3対応で、開発者向けに新しいバージョンがリリース

ADC(Apple Developer Connection)のメンバーに対して、CarbonLib SDK 1.3d11が公開された。CarbonLib SDKには開発に必要なさまざまな素材が含まれている。なお、Mac OS X 10.0に組み込まれているCarbonのバージョンは1.3である。Mac OS 9.1のCarbonLibは1.1.1であるが、Mac OS向けにはVer.1.2.5のCarbonLibがリリースされている。

関連リンク:Develop Great Products
カテゴリ:アップルからの開発資料, Carbon/CF


TIL-J》サードパーティ製ドライブに対応したDisc Burner 1.0.1の日本語版が公開

Finderの操作でCD-R/RWドライブでディスクにファイルの書き込みを行うDisc Burner 1.0.1の日本語版が公開された。英語版は2001年2月末に公開されている。1.0ではApple純正のドライブにしか対応していなかったが、1.0.1では各社のサードパーティのドライブにも対応している。
また、Tech Info Libraryに以下のように、Disc Burner関連の文書が掲載されている。アドレスと要約を示しておく。

◇Disc Burner: ハードディスク空き領域の条件
http://til.info.apple.co.jp/cgi-bin/artnum?id=31316JN
作成するCD-Rディスクでの容量の2倍の空き領域が起動ディスクになければいけない。

◇Disc Burner 1.0.1: SCSI CD-RW ドライブでは動作しない
http://til.info.apple.co.jp/cgi-bin/artnum?id=60816JN
対応しているSCSIタイプのドライブはない。

◇iTunes 1.1/Disc Burner 1.0.1: 他社製ディスク作成ソフトウェアが動作しなくなる
http://til.info.apple.co.jp/cgi-bin/artnum?id=60805JN
機能拡張フォルダにあるUSB Authoring Support、FireWire Authoring Supportを削除しないと、CD-R書き込みソフトが機能しなくなることがある。

関連リンク:Disc Burner 1.0.1
カテゴリ:Tech Info Library-J, 周辺機器


TIL,TIL-J》Mac OS Xでのディスクや起動に関する文書

Tech Info LibraryおよびTech Info Library-Jに掲載された文書のうち、Mac OS Xでのディスクや起動に関する文書として、次のようなものが公開されている。アドレスと要約を示す。

◇Mac OS X 10.0: インストール時に対象とするディスクがグレイ表示されている
http://til.info.apple.co.jp/cgi-bin/artnum?id=106235JC
◇Mac OS X 10.0: Disk Appears Dimmed (or "Grayed Out") in the Installer
http://til.info.apple.com/techinfo.nsf/artnum/n106235
iMacの初期モデルや、Power Macintosh G3の初期モデルなどは、インストール先のパーティションが、最初の8GBに完全に含まれた状態になっていないと、インストールができない。たとえば8GBを超えるディスクを1つのパーティションで使っている場合にインストールができなくなってしまう。状況に応じて場合分けされ症状についての説明が記載されている。

◇Mac OS X 10.0:「ドライブ設定 1.8.1」でフォーマットされた UFS ディスクを認識しない、その上にインストールできない
http://til.info.apple.co.jp/cgi-bin/artnum?id=106229JN
◇Mac OS X 10.0: Does Not Recognize and Cannot Be Installed on UFS Disks Formatted by Drive Setup 1.8.1
http://til.info.apple.com/techinfo.nsf/artnum/n106229
タイトルの通り。初期化をやり直す必要がある。

◇Mac OS X 10.0: 起動ボリューム上のパーティションを取り出すと共有設定に影響する
http://til.info.apple.co.jp/cgi-bin/artnum?id=106230JN
◇Mac OS X 10.0: Ejecting Partitions on the Startup Volume, Effects on Sharing
http://til.info.apple.com/techinfo.nsf/artnum/n106230
起動していないパーティションをアンマウントすると、起動パーティション以外のパーティションがグレーとなって利用できなくなる。ファイル共有に使っていると支障が出るので注意が必要。

◇Mac OS X 10.0: 複数のバージョンをインストールしていると誤ったシステムフォルダから起動する場合がある
http://til.info.apple.co.jp/cgi-bin/artnum?id=106220JN
◇Mac OS X 10.0: May Start Up From Wrong System Folder When Multiple Versions Are Installed
http://til.info.apple.com/techinfo.nsf/artnum/n106220
1台のコンピュータの異なるディスクやパーティションに、Mac OS X Public Betaと、Mac OS X 10.0をインストールすると、起動システムがシステム環境設定で選択したものの通りにならないことがある。そうした複数のインストールは行わないようにする。

◇Mac OS X:「Build 4K78」は「Mac OS X 10.0」と同じ意味です
http://til.info.apple.co.jp/cgi-bin/artnum?id=106176JC
◇Mac OS X: "Build 4K78" Same As "Mac OS X 10.0"
http://til.info.apple.com/techinfo.nsf/artnum/n106176
「Build 4K78」は開発時に使っていた呼称であり、製品版のMac OS X 10.0とは同一のものである。将来的には開発時の名称は表示されなくなるかもしれない。

カテゴリ:Tech Info Library-J, Knowledge Base(旧TIL), Mac OS X


TIL,TIL-J》Mac OS XでのClassic環境に関する文書

Tech Info LibraryおよびTech Info Library-Jに掲載された文書のうち、Mac OS XでのClassic環境に関する文書として、次のようなものが公開されている。アドレスと要約を示す。

◇Mac OS X 10.0: Classic Disables Battery Level in Menu Bar
http://til.info.apple.com/techinfo.nsf/artnum/n106257
Mac OS Xを使った後にMac OS 9.1を起動した時、メニューバーにバッテリのレベルを示すアイコンが表示されなくなってしまう。コントロールパネルの「日付&時刻」で再度表示するように設定しなければならない。

◇Mac OS X 10.0: Disk First Aid Runs When Mac OS 9 Starts up After Using Mac OS X
http://til.info.apple.com/techinfo.nsf/artnum/n106254
Mac OS XでClassic環境を使った後、同じシステムフォルダでMac OS 9.1を起動すると、起動時にDisk First Aidによる修復が行われる。実際にドライブには損傷はなく、単にメッセージが出るだけである。これについては、将来のバージョンで適切に動作するようになる予定である。

◇Mac OS X 10.0: 特定のハードウェアに依存する Classic アプリケーションは動作しません
http://til.info.apple.co.jp/cgi-bin/artnum?id=106184JC
◇Mac OS X 10.0: Access Not Provided in Classic for Certain Hardware Oriented Applications
http://til.info.apple.com/techinfo.nsf/artnum/n106184
オーディオプレイヤやDVDプレイヤなどのハードウエアを利用するためのアプリケーションは、Classicでは機能しない。

◇Mac OS X 10.0: Classic 環境でのスクリーンセーバ
http://til.info.apple.co.jp/cgi-bin/artnum?id=106226JC
◇Mac OS X 10.0: Screen Savers in Classic Environment
http://til.info.apple.com/techinfo.nsf/artnum/n106226
Classic環境で稼動するスクリーンセーバーは機能しないようにしておくのが望ましい。

◇Mac OS X 10.0: Classic を使った後に Conflict Catcher が登録情報を要求する
http://til.info.apple.co.jp/cgi-bin/artnum?id=106149JN
◇Mac OS X 10.0: Conflict Catcher Requests Registration Information After Using Classic
http://til.info.apple.com/techinfo.nsf/artnum/n106149
パーティションをわけてそれぞれにMac OS 9.1をインストールすることで、回避することができる。その方法が記載されている。

◇Mac OS X 10.0: Classic 環境で AOL に接続できない
http://til.info.apple.co.jp/cgi-bin/artnum?id=106155JC
◇Mac OS X 10.0: Cannot Connect to AOL in Classic Environment
http://til.info.apple.com/techinfo.nsf/artnum/n106155
ClassicでAOLのアプリケーションを起動してモデムを利用しての接続はできない。別のプロバイダに接続してTCP/IP接続をするか、Mac OS 9.1で起動して使うようにする。

◇Mac OS X 10.0: Classic 環境ではハードウェアネットワーキングに直接アクセスできません
http://til.info.apple.co.jp/cgi-bin/artnum?id=106170JC
◇Mac OS X 10.0: Classic Does Not Allow Direct Hardware Networking Access
http://til.info.apple.com/techinfo.nsf/artnum/n106170
ネットワークのトラフィックを直接見るSnifferや、モデムを使ってダイアリングするソフトウエアはClassicでは使えない。ネットワーク機器を直接使うようなアプリケーションは、ネイティブなものを使うしかない。

◇Mac OS X 10.0: Classic 環境ではデバッガを開くことができません
http://til.info.apple.co.jp/cgi-bin/artnum?id=106180JN
◇Mac OS X 10.0: Cannot Open Debugger in Classic
http://til.info.apple.com/techinfo.nsf/artnum/n106180
MacsBugなどのデバッガは利用できるが、Command+パワーボタンによるデバッガの呼び出しもできる。ただし、Apple Pro Keyboardではそれができない。

◇Mac OS X 10.0: Tomb Raider、Star Wars: Episode 1 Racer、Myth II を Classic 環境で使用する
http://til.info.apple.co.jp/cgi-bin/artnum?id=106181JN
◇Mac OS X 10.0: Using Classic With Tomb Raider, Star Wars: Episode 1 Racer, Myth II
http://til.info.apple.com/techinfo.nsf/artnum/n106181
OpenGLが使えないとか、メモリが足りないというエラーが出る。これらのゲームはアップデートしないとClassic環境では使えないことがある。

◇Mac OS X 10.0: Some Classic Applications Require Installation of System Folder Components
http://til.info.apple.com/techinfo.nsf/artnum/n106183
Classicアプリケーションの中には、システムフォルダに必要なファイルをインストールしていないと機能しない場合がある。たとえば、AppleWorks 5でのスペルチェックの機能などがそれにあたる。

カテゴリ:Tech Info Library-J, Knowledge Base(旧TIL), Classic


TIL-J》2001/3/29,4/2に公開された文書、iTunes for Mac OS Xなど

日本語で技術情報を提供するTech Info Library-Jにおいて、2001年3月29日および4月2日に掲載された文書のうち、別掲の記事以外に以下の文書が公開されている。アドレスと要約を示す。

□ソフトウエア関連
◇60814JN:Mac OS 9: ヘルプビューアの「メモリ不足」メッセージ
 http://til.info.apple.co.jp/cgi-bin/artnum?id=60814
「初期設定」フォルダにある「Apple ヘルプ初期設定」フォルダから「ヘルプビューアアクセス」ファイルを削除することで回避できる。

◇75118JC:iTunes for Mac OS X について
 http://til.info.apple.co.jp/cgi-bin/artnum?id=75118
ダウンロードするためのリンクと、付属の文書の内容が参照できる。

◇60818JN:Final Cut Pro: Targa Cine System で 20 ビットオーディオを書き込む際の長い遅延
 http://til.info.apple.co.jp/cgi-bin/artnum?id=60818
20ビットオーディオでは数十分もの遅延を生じさせるが、これは16ビットにコンバートしているためである。8ないしは16ビットのサウンドを利用するようにする。

◇60817JN:Final Cut Pro: オフラインのメディアクリップを接続すると応答しなくなる場合がある
 http://til.info.apple.co.jp/cgi-bin/artnum?id=60817
他のアプリケーションで開いているメディアクリップを開くと応答しなくなるので、他のアプリケーションで開いたものは利用しないようにする。

◇25197JN:シアターモードが「モニタ」コントロールパネルに表示されません
 http://til.info.apple.co.jp/cgi-bin/artnum?id=25197
「シアターモード」機能拡張がオフになっていないかを確認する。

◇25200JC:iTools HomePage、iCard: グレイスケール画像の歪み
 http://til.info.apple.co.jp/cgi-bin/artnum?id=25200
グレースケール画像は正しく処理されないことがあるので、カラー画像を使うようにする。

◇106031JN:Macintosh Manager: ボリュームをマウントする方法
 http://til.info.apple.co.jp/cgi-bin/artnum?id=106031
Macintosh Manager環境下でのボリュームをマウントする方法について、かなり詳しく記載されている。

□ハードウエア関連
◇58735JN:Power Mac G4: ギガビット Ethernet について
 http://til.info.apple.co.jp/cgi-bin/artnum?id=58735
1000BASE-Tについての技術的なスペックが簡単にまとめられている。

◇58815JN:iMac (Early 2001): メモリの仕様とアップグレード
 http://til.info.apple.co.jp/cgi-bin/artnum?id=58815
2001年の2月にリリースされたiMacの内蔵メモリに関する使用で、PC-100ないしは133、168ピンのDIMM、高さは50mmまでなどが記載されている。

◇25187JN:PowerBook: ファームウェア・アップデート 2.7 が必要かどうかを判断する方法
 http://til.info.apple.co.jp/cgi-bin/artnum?id=25187
Apple システム・プロフィールを使って、判別する方法が記載されている。

◇30890JN:VGA Port: ピン配置について
 http://til.info.apple.co.jp/cgi-bin/artnum?id=30890
15ピンのVGAコネクタのピン配置表。

◇25184JN:他社製の USB ドライブから起動できない
 http://til.info.apple.co.jp/cgi-bin/artnum?id=25184
ハードディスクにあるドライバが古いと、起動できないことがある。ハードディスクのメーカーに問い合わせる。

カテゴリ:Tech Info Library-J


AirMacをMac OS Xで使うことを説明した文書が公開、内容は簡単なもの

Appleから「Mac OS XでAirMacを使う」という文書が公開された。AirMacをMac OS Xで利用する方法が記載されているが、すでに利用している方は御存じの通り、AirMacが使えるという以上のことはない。この文書も2ページの短いもので、使えるという説明に加えて、Mac OS 9.1で起動してAirMac 1.3をインストールしてベースステーションをアップデートする方法が記載されているだけだ。なお、英語版とともに日本語版もほぼ同時に公開されている。

関連リンク:AirMac Networks with Mac OS X
カテゴリ:ネットワーク