AppleSingle

AppleSingleとAppleDoubleは、Mac OSのファイルシステムHFS及びHFS+上のファイルを他のファイルシステムと交換する際に、様々なファイル属性(特にリソースフォーク)が欠落するのを防ぐ目的でApple Computer（当時）が考案したフォーマットである。バージョン1とバージョン2が存在するが、現在のmacOSは互換性のない拡張をおこなったバージョン2のAppleDoubleを用いる。
概要.
Mac OSではひとつのファイルに、データフォーク、リソースフォークという2つのフォークがあり、更に様々なメタデータ(コメント、ファイル時刻、Finder情報等)がある。特にファイル時刻には作成時刻、変更時刻、バックアップ時刻、アクセス時刻がある。Finder情報はクリエータとファイルタイプを含んでいる。
これらを扱えるのはHFSやHFS+といったファイルシステムやファイル共有プロトコルのAFPしかない。それ以外のファイルシステムではデータフォーク程度しか扱えない。
AppleSingleは2つのフォークと様々なメタデータを1つのファイルにまとめて保存するフォーマットである。
AppleDoubleは2つのファイルに分離して保存するフォーマットである。1つ目はAppleDouble Data fileといい、データフォークそのものである。2つ目はAppleDouble Header fileといい、データフォーク以外を全て含む。これはAppleSingleからデータフォークを除き、マジックナンバーを変えただけのものである。
利点と欠点.
Mac OSではデータフォーク以外の情報が必要とされる場合があるため、AppleSingleまたはAppleDoubleで転送及び保存することには大きな利点がある。
Mac OS以外では事情が複雑である。AppleSingleの場合、ファイルが1つであるため情報の欠落がない。しかしながら、AppleSingleを理解するソフトウェアでなければ取り扱う事が出来ない。AppleDoubleの場合、AppleDouble Data fileの方でデータフォークを扱うことが出来る。しかしながら運用に注意しなければAppleDouble Header fileを損失してしまう危惧がある。
歴史.
初期のバージョン1は、AppleComputer社(当時)の最初のUNIX系OSであるA/UX上のファイルシステムで使うために考案された。
AppleSingleと似たフォーマットにMacバイナリがあり、当時はこちらの方が多用された。しかしながらHFS+の拡張に伴い、Macバイナリでは不十分になってきた。
バージョン2はHFS+の拡張にあわせて1990年に発行された。
2005年に発売されたMac OS X v10.4以降では、バージョン2を拡張し互換性のなくなったAppleDoubleを用いる。これの仕様書は発行されていないが、Appleの公開するカーネルソースコードで仕様を知ることができる。
実装例.
macOS.
macOSがHFS、HFS+、AFP以外のファイルシステム、すなわちUFS、FAT、SMB、NFS、WebDAVといったファイルシステムにファイルを保存する際、AppleDouble バージョン2を用いる。すなわちAppleDouble Data file (データフォーク)を本来のファイル名で保存し、AppleDouble Header fileを「._」を先頭に付けたファイル名で保存する。
Mac OS X v10.3 Panther以降のFinderの機能(BOMArchiveHelper)でZIP圧縮した場合、__MACOSXという名前のフォルダを作ってその中にAppleDouble Header fileを保存する。ただしコマンドラインの/usr/bin/zipだとデータフォークのみが扱われる。
Mac OS X v10.4 Tiger以降の/usr/bin/tarコマンドでは、AppleDouble Header fileを「._」を先頭に付けたファイル名で保存する。また、このバージョン以降は拡張属性 (EA)を使うことができるため、AppleDouble バージョン2を拡張してEAも保存できるようになった。これは本来32バイトであるFinder情報の保存領域を拡張し、Finder情報の後ろにEAを追加記録するというものである。これにより従来のバージョン2と互換性がない。
Mac OS X v10.5迄は、拡張属性をサポートしないAFPサーバにファイルを保存すると拡張属性が失われた。Mac OS X v10.6では、こうしたサーバに保存する際、先頭に「._」を付けたファイル名でバージョン2のファイルをつくり、これに拡張属性を格納する。
電子メール.
RFC 1740 では、主に電子メールで使われるフォーマットMIMEでAppleSingle及びAppleDouble バージョン2を扱う方法を定義している。これはMac OS用の電子メールクライアントの多くで実装されている。
AppleSingleのMIMEタイプはapplication/applefileを用いる。AppleDoubleの場合、MIMEタイプはmultipart/appledoubleを用いてマルチパート化し、AppleDouble Headerの方にapplication/applefileを用いる。
Mac同士でメールをやりとりする分にはなんら問題は生じないが、ほかのOSを相手にするとデータフォーク以外が邪魔になって本来のデータが得られなくなってしまう場合が多い。そのため、Mac以外とやりとりする際はデータフォークのみを送信するか、multipart/appledoubleを用いるのが望ましいだろう。
netatalk.
Unix系OSでAFPサーバ機能を提供するnetatalkでは、AppleDoubleを用いている。
netatalk 1.xでは、AppleDouble Data file（データフォーク）を本来のファイル名で保存し、.AppleDoubleなるディレクトリを作成してその中に同じファイル名でバージョン1のAppleDouble Header fileを保存する。netatalk 2.xではこれをバージョン2のAppleDouble Header fileにおきかえた。netatalk 3.xでは拡張属性の中にAppleDouble Header fileのデータを保存するが、リソースフォークが拡張属性に入りきらない場合は別途「._」を前置したファイル名で保存する。