Outlook Express のファイル構造
 Becky のファイル構造のことを書いたついでに、私が利用できるもう一つのメール環境・Outlook Express のファイル構造についても書いてみたい。


 Outlook Expressには、Folders.dbxと受信トレイ.dbxなどの2種類のファイルがある。

 同じdbxファイルだが、Folders.dbxは他のdbxファイルと異なり、Outlook Expressのフォルダー一覧を表示するのに用いられる。

 Folders.dbxには
  ① フォルダー名と、各フォルダーの階層関係
  ② フォルダーに対応するdbxファイル名の指定
      受信トレイ⇒受信トレイ.dbxなどフォルダー名と同じ。
      Outlook Express・ローカルフォルダーにはdbxファイルはない。
  ③ 各フォルダー毎のメールの総件数・未読件数
 などが保存されている。


 受信トレイ.dbx・送信済みアイテム.dbxなどのファイルには、送受信したメールが保存される。

 各dbxファイルは【ディレクトリ情報】、【ファイル情報】、【メッセージ情報】の3つの情報で、メールを管理する。
 Outlook Expressのメッセージ一覧は【ディレクトリ情報】と【ファイル情報】の2つを組み合わせて表示される。
 【ディレクトリ情報】はファイル情報へのポインタ(=ヒモ付け)だけを持つ。 1対複数。
 メールの件名・差出人・送信日時などの情報は【ファイル情報】が持ち、【メッセージ情報】への1対1のポインタを持つ。


f0066555_831838.jpg それぞれの関係は、左図のようになる。

 ルートディレクトリからは、最大51件のファイル情報がヒモ付けされる。
 件数が51件を超えた時は、子ディレクトリが作成され、ルートディレクトリからヒモ付けされる。
 ルートディレクトリから子ディレクトリのヒモ付けも最大51件。
 51×51を超えると、さらに孫ディレクトリが…。

 ルートディレクトリへのポインタは、アドレス 0x00E4番地に保存されている。

 【メッセージ情報】は1つのメールのサイズが大きい時、複数に分割されヒモ付けされる。


  【ディレクトリ】
f0066555_841557.jpg
 ※1 親から子、子から孫へのポインタ
 ※2 子および孫からはすぐ上のディレクトリへのポインタ
 ※3 ボディ(1)、ボディ(2)…の組の数(最大51個)
 ※4 子の格納データ数 (子の※3と同じ数)

 ディレクトリはルート・子・孫とも、同形式・同サイズ
(ヘッド 24バイト+ボディ 612バイト(=12バイト×51件) =636バイト)


 前にも書いたように【ディレクトリ情報】にはポインタしか持っていない。 次の【ファイル情報】が持っている「件名」などとセットで、メッセージ一覧を構成する。

  【ファイル情報】
f0066555_865256.jpg
 ファイル情報のサイズは可変長
 =ヘッド(固定)12バイト+ボディ(※1のバイト数)
 ボディ=インデックス部(4バイト×件数 ※2) + 補足情報

 ずいぶん分かりにくいが、各インデックスあるいは各インデックス+捕捉情報の組み合わせで、件名・差出人・送信日時などの情報を保存する。


 インデックス4バイトは 1ビット7ビット+3バイトと分かれている。

    先頭の1ビット
 メールの優先順位などの短い情報は、’1’にして直接インデックスに持たせる。 
 件名など3バイトに収まらない情報は、、’0’にして補足情報に書き込む。
 そしてインデックスには、その補足情報へのポインタを持たせる。

    次の7ビットの意味
f0066555_888100.jpg
    最後の3バイト

 必要な情報が3バイト以内なら、ここに直接値が書き込まれる。
 3バイトを超える情報は補足情報に書き込まれ、そのポインタを保存。
    ともに、最初の1ビットとの組み合わせ。


例1) 91(=1+0x11) 24 08 00 ⇒メッセージ長が2084バイト(=0x000824)
例2) 08(=0+0x08) 53 00 00 で、かつ補足情報の 0x53バイト目に8E 6C 8D
     91 97 B7 8D 73 (=シフトジスコードで四国旅行)の文字列があれば、
     ⇒ 件名が「四国旅行」

 補足情報の各項目の区切りは、文字項目の後ろに0x00が、数字項目の後には0x01がセパレータとして用いられる。

 送信日時などは、Beckyとは異なり64ビットの(C#DateTime型)の日付。 文字列ではなく、バイナリ値。

 インデックスの中で最も重要なのは0x04で、続くメッセージブロックへのポインタとなっている。


    【メッセージ情報】
f0066555_884063.jpg
 メッセージブロックは固定長
  ヘッダ16バイト+ボディ512バイト=528バイト

 長いメッセージたとえば2000バイトの情報を保存する場合は、512×3+464に分割される。
 最初の3つのブロックの※2=512、※3には続きのブロックへのポインタ、最後のブロックの※2=464、※3=0となる。
 いずれのブロックにも※1=512の固定値、最後のブロックの※4の465バイト以降には0が詰められる。


    オブジェクトマーク

 【ディレクトリ情報】、【ファイル情報】、【メッセージ】の各先頭にあるオブジェクトマークは、そこから情報が始まることを示すもの。
 ファイルの先頭からのアドレスそのものが書かれる。
[PR]
by t_ichib | 2009-05-03 08:36 | 今日もまた老年プログラマー
<< 2度の計算違い Beckyのインデックス >>