● ToolBox API徒然草(2003/12/01)

  このニュースは、MOSAの会員にのみ配布されているデベロッパー向けの
  デジタルマガジンMOSADeNのに掲載された記事です。ほぼ一ヶ月遅れで
  ここに掲載されて行きます

 〜 パス名とエンコーディング 〜


Carbonアプリケーションでファイル保存場所を確定するのには、FSRefやFSSpec構造体を利用します。現在採用されているUnicodeベースの長いファイル名に対応するにはFSRefの方を使うのがベストです。FSRefの取り扱いで注意することは、「存在しないファイルやフォルダ(ディレクトリ)のFSRefは得ることが出来ない」という点です。これと比較して、FSSpec構造体の方は存在しないファイルの保存場所を代入しAPIに渡すことがありました。例えば、ファイル作成に使うFSpCreate()では、ファイルの保存場所をFSSpec構造体に記述して渡すことで機能します。

ですから、ファイル保存場所をFSSpec構造体に代入してから以下のようなルーチンをを実行すると、そのファイル(ディレクトリ)が存在しているかどうかを簡単に判断することが出来ます。FSpMakeFSRef()は、ファイルが存在していないとFSRefを求めることができないのでエラーを返すわけです。



さて、Mac OS XがUNIX環境となったため、最近になってCarbonアプリケーションでもパス名でファイル保存場所を確定するケースが出てきました。Mac OS 9時代であれば、Alias Managerなどを利用することで(Alias Managerが使えなくなったわけではない)ほとんどパス名を気にする必要はなかったわけですが...。その代わりと言っては何ですが、File Managerにはパス名を効率良く取り扱うために、FSPathMakeRef()やFSRefMakePath()といった便利なAPIが追加されています。

FSPathMakeRef()は、UNIX(POSIX)表記のパス名が渡されると、そのファイル(ディレクトリ)のFSRefを返します(ただしファイルが存在していれば...)。この場合のパス名は、"/Users/koike/Pictures/Image.jpg"といった表記です。この時、FSPathMakeRef()に渡すパス名は、UTF-8でエンコードされたCストリングスでなければいけません。詳しい解説は省略しますが、UTF-8エンコーディンによりプログラム環境でUnicode文字列が取り扱いやすくなります。UTF-8は、16ビットのUncode文字とは異なり1オクテット8ビットで表記されています。ASCII文字は今までと同様な取り扱いが可能であり、文字列中にNULL(ゼロ)も存在しないのでCストリングスとして扱うこともできます。

以下のpathToFSRef()は、EditUnicodeTextコントロール(ControlRefで指示)に記入されているパス名を使い、そのFSRefを求めるルーチンです。まず最初に、GetControlData()でパス名を抽出します。パス名はCFStringRefで参照します。CFStringの中身はUnicode文字列なので、CFStringGetBytes()にエンコーディング種類としてkCFStringEncodingUTF8を指示し、UTF-8文字列へと変換しておきます。それをFSPathMakeRef()に渡せば、無事にFSRefが得られるというわけです。対象がディレクトリであればdirにtrueが代入され、もしパス名が間違っていて対象ファイルがなければエラーが返されます。



得られたCFStringRef(cref)は内部で使用されているだけなので、最後にCFRelease()で開放しておくことを忘れないでください。CFRangeの方は構造体ですので開放する必要はありません。CFRangeMake()は構造体に値を代入するマクロとして定義されています。

次のfSRefToPath()ルーチンは、pathToFSRef()とまったく逆の処理を実行します。つまり、FSRefを渡してEditUnicodeTextコントロールにそのパス名を表示させるわけです。



まず最初に、FSRefMakePath()にFSRefを渡しUTF-8文字列で表記されたパス名を得ます。CFStringCreateWithBytes()にエンコーディング種類としてkCFStringEncodingUTF8を渡すと、UTF-8文字列がUnicode文字列へと変換されてCFStringが作成されます。得られたCFStringRef(cref)をSetControlData()経由でEditUnicodeTextコントロールに渡せば、パス名の内容がそこに表示されます。

FSPathMakeRef()やFSRefMakePath()についてはUniversal InterfacesのFile.hを参照してください。また、CFStringを取り扱うための数々のAPIは、CoreFoundation FrameworkのCFString.hに記載されています。

copyright 2003 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp