コンテナー : 複合ファイル

ここでは、複合ファイルの構成要素とその実装について説明します。また、OLE アプリケーションで複合ファイルを使う場合の複合ファイルの長所と短所についても説明します。

複合ファイルは OLE にとって不可欠な部分です。 複合ファイルはデータの転送および OLE ドキュメントの保存をサポートします。 複合ファイルは、Active 構造化記憶モデルを実装したものです。 記憶オブジェクト、ストリーム オブジェクト、またはファイル オブジェクトに対するシリアル化をサポートする一貫したインターフェイスを提供します。 複合ファイルは、Microsoft Foundation Class ライブラリの COleStreamFile クラスおよび COleDocument クラスでサポートされています。

注意

複合ファイルを使っても、OLE ドキュメントまたは複合ドキュメントからの情報が使われるとは限りません。 複合ファイルは複合ドキュメントや OLE ドキュメントなどのデータを保存する方法の 1 つにすぎません。

複合ファイルの構成要素

複合ファイルは OLE で実装 3 つのオブジェクトの種類を使用します。ストリーム オブジェクトは、ストレージ ・ オブジェクト、およびILockBytesオブジェクト。 これらのオブジェクトは次のように、標準ファイル システムの構成要素に似ています。

  • ストリーム オブジェクトは、ファイルのように、どの型のデータでも格納します。

  • 記憶オブジェクトは、ディレクトリのように、ほかの記憶オブジェクトおよびストリーム オブジェクトを格納します。

  • LockBytes オブジェクトは、ストレージ オブジェクトと物理的なハードウェア間のインターフェイスです。 LockBytes オブジェクトにより、ハード ディスク ドライブやグローバル メモリ領域などの記憶装置に対して実際にデータが書き込まれる方法が決まります。 LockBytes オブジェクトと ILockBytes インターフェイスの詳細については、『OLE Programmer's Reference』を参照してください。

複合ファイルの長所と短所

複合ファイルを使うと、従来のファイルによるデータの保存法と比べて、次の利点があります。

  • ファイルへのインクリメンタル アクセス

  • ファイル アクセス モード

  • ファイル構造の標準化

欠点としては、フロッピー ディスクにとってはサイズが大きいことや速度が遅いことなどがあります。アプリケーションで複合ファイルを使うかどうか判断するときにはこれらの点を考慮する必要があります。

ファイルへのインクリメンタル アクセス

複合ファイルを使うと、自動的にファイルに対してインクリメンタル アクセスが行われます。 複合ファイルは "ファイルの中のファイル システム" と考えられるので、ファイル全体を読み込まなくても、ストリームや記憶装置などのオブジェクトに個別にアクセスできます。 したがって、新しいオブジェクトにアクセスするときの所要時間が大幅に短縮します。 更新時も同じように、ファイル全体を保存せずにオブジェクト単位で変更し、保存できます。 OLE では、ユーザーが編集したストリーム オブジェクトまたは記憶オブジェクトだけが保存されます。

ファイル アクセス モード

複合ファイル内のオブジェクトに加えられた変更内容をディスクにコミットする時期を決めることができるのも利点の 1 つです。 ファイルへのアクセス方法 (直接アクセスまたは一括アクセス) に応じて、変更内容のコミット時期が決まります。

  • 一括モードでは、2 段階のコミット処理によって、複合ファイル内のオブジェクトに変更が加えられます。したがって、ユーザーが変更内容を保存するか取り消すまで、ドキュメントの新旧両方のコピーが保持されます。

  • 直接モードではドキュメントへの変更は即座に書き込まれるので、取り消すことはできません。

アクセス モードの詳細については、『OLE Programmer's Reference』を参照してください。

標準化

複合ファイルの構造は標準化されているので、実際に複合ファイルを作成した OLE アプリケーションに関する情報がなくても、ほかの OLE アプリケーションからその内容を参照できます。

サイズと速度の問題

複合ファイルの記憶構造は複雑であり、またデータをインクリメンタル方式で保存できるので、複合ファイルは構造化されていない普通の "フラットな" ファイルより大きくなりがちです。 また、頻繁に保存と読み込みを繰り返すと、複合ファイルのサイズは普通のファイルに比べて、急速に大きくなります。 したがって、フロッピー ディスクに複合ファイルを保存すると、保存時および読み込み時のアクセス時間が長くなります。

性能に影響する別の問題として、複合ファイルの断片化があります。 複合ファイルの大きさは、ファイルの最初と最後のセクターの差で決まります。 断片化されたファイルには多くの空き領域がありますが、このような空き領域も複合ファイルのサイズとして計算されてしまいます。 複合ファイルを使っていて、記憶オブジェクトの挿入や削除を繰り返すうちに、このような領域ができます。

複合ファイルへのデータの保存

COleDocument クラスの派生クラスをドキュメント クラスとして持つアプリケーションを作成したときは、主ドキュメント クラスのコンストラクターから関数 EnableCompoundFile を呼び出します。 アプリケーション ウィザードで OLE コンテナー アプリケーションを作成した場合は、この関数は自動的に呼び出されます。

『OLE Programmer's Reference』の「IStream」、「IStorage」、および「ILockBytes」を参照してください。

参照

参照

COleStreamFile クラス

COleDocument クラス

概念

コンテナー

コンテナー : ユーザー インターフェイスの問題