コンテナー : 複合ファイル
この記事では、複合ファイルのコンポーネントと実装、および OLE アプリケーションで複合ファイルを使用する場合の長所と短所について説明します。
複合ファイルは OLE の不可欠な部分です。 これらは、データ転送と OLE ドキュメント ストレージを容易にするために使用されます。 複合ファイルは、アクティブな構造化ストレージ モデルの実装です。 ストレージ、ストリーム、またはファイル オブジェクトに対するシリアル化をサポートする一貫性のあるインターフェイスがあります。 複合ファイルは、クラス COleStreamFile
および COleDocument
によって、Microsoft Foundation Class ライブラリでサポートされています。
Note
複合ファイルを使用することは、その情報が OLE ドキュメントや複合ドキュメントから取得されることを意味するものではありません。 複合ファイルは、複合ドキュメント、OLE ドキュメント、およびその他のデータを格納するための方法の 1 つに過ぎません。
複合ファイルのコンポーネント
複合ファイルの OLE 実装では、ストリーム オブジェクト、ストレージ オブジェクト、および ILockBytes
オブジェクトという 3 種類のオブジェクトを使用します。 これらのオブジェクトは、次の点で標準ファイル システムのコンポーネントに似ています。
ファイルなどのストリーム オブジェクトは、任意の型のデータを格納します。
ディレクトリなどのストレージ オブジェクトには、他のストレージ オブジェクトとストリーム オブジェクトを含めることができます。
LockBytes
オブジェクトは、ストレージ オブジェクトと物理ハードウェア間のインターフェイスを表します。 これらは、ハード ドライブやグローバル メモリの領域など、LockBytes
オブジェクトがアクセスしている記憶装置に実際のバイトがどのように書き込まれるかを決定します。LockBytes
オブジェクトとILockBytes
インターフェイスの詳細については、「OLE プログラマーズ リファレンス」を参照してください。
複合ファイルの長所と短所
複合ファイルには、以前のファイル ストレージのメソッドでは利用できないメリットがあります。 これには次のようなものがあります。
ファイルへの増分アクセス。
ファイル アクセス モード。
ファイル構造の標準化。
複合ファイルをアプリケーションで使用するかどうかを決定する際には、複合ファイルの潜在的な短所、つまり、フロッピー ディスク上の記憶域に対するサイズの大きさとパフォーマンスの問題を考慮する必要があります。
ファイルへの増分アクセス
ファイルへの増分アクセスは、複合ファイルを使用すると自動的に得られるメリットです。 複合ファイルは「ファイル内のファイル システム」として表示できるため、ストリームやストレージなどの個々のオブジェクトの種類にアクセスする場合に、ファイル全体を読み込む必要がありません。 これにより、ユーザーが編集できるように、アプリケーションが新しいオブジェクトにアクセスするために必要な時間が大幅に短縮されます。 同じ概念に基づく増分更新でも、同様のメリットを得られます。 OLE は、1 つのオブジェクトに加えられた変更を保存するためだけにファイル全体を保存するのではなく、ユーザーが編集したストリームまたはストレージ オブジェクトのみを保存します。
ファイル アクセス モード。
複合ファイル内のオブジェクトに対する変更がディスクにコミットされる時期を判断できることが、複合ファイルを使用するもう 1 つの利点です。 ファイルがアクセスされるモード (トランザクションまたはダイレクト) によって、変更がコミットされる時期が決まります。
トランザクション モードでは、2 フェーズ コミット操作を使用して複合ファイル内のオブジェクトを変更します。これにより、ユーザーが変更を保存するか元に戻すように選択するまで、ドキュメントの古いコピーと新しいコピーの両方を使用できるようになります。
ダイレクト モードでは、ドキュメントが変更されると変更がドキュメントに組み込まれます。後で元に戻すことはできません。
アクセス モードの詳細については、「OLE プログラマーズ リファレンス」を参照してください。
標準化
複合ファイルは標準化された構造であるため、実際にファイルを作成したアプリケーションを認識していなくても、OLE アプリケーションで作成された複合ファイルをさまざまな OLE アプリケーションで参照できます。
サイズおよびパフォーマンスに関する注意点
複合ファイルのストレージ構造は複雑であり、データを段階的に保存できるため、この形式を使用するファイルは、非構造化または「フラットファイル」ストレージを使用する他のファイルよりも大きくなる傾向があります。 アプリケーションでファイルの読み込みと保存が頻繁に行われる場合に複合ファイルを使用すると、複合ファイル以外を使用したときよりも、ファイル サイズがはるかに短時間で増加する可能性があります。 複合ファイルは大きくなる可能性があるため、フロッピー ディスクに格納されているファイルやディスクから読み取られるファイルに対するアクセス時間も影響を受ける可能性があり、その結果、ファイルへのアクセスが遅くなります。
パフォーマンスに影響を与えるもう 1 つの問題は、複合ファイルの断片化です。 複合ファイルのサイズは、ファイルで使用されている最初と最後のディスク セクターの違いによって決まります。 断片化されたファイルには、データが含まれていない多数の空きスペースの領域が含まれる可能性がありますが、それらはサイズを計算するときにカウントされます。 複合ファイルの有効期間中、これらの領域はストレージオブジェクトの挿入または削除によって作成されます。
データに複合ファイル形式を使用する
COleDocument
から派生したドキュメント クラスを持つアプリケーションを正常に作成した後、メイン ドキュメント コンストラクターが EnableCompoundFile
を呼び出すようにします。 アプリケーション ウィザードで OLE コンテナー アプリケーションを作成するときに、この呼び出しが挿入されます。
「OLE プログラマーズ リファレンス」で、「IStream」、「IStorage」、および「ILockBytes」を参照してください。
関連項目
Containers
コンテナー: ユーザー インターフェイスの問題
COleStreamFile クラス
COleDocument クラス