IStorage-Compound 文件实现
IStorage 的复合文件实现允许在驻留在复合文件对象的存储对象中创建和管理子存储和流。 若要创建复合文件对象并获取 IStorage 指针,请 StgCreateStorageEx调用 API 函数。 若要打开现有复合文件对象并获取其根 IStorage 指针,请调用 StgOpenStorageEx。
使用复合存储的应用程序应在 HKEY_CLASSES_ROOT\SystemFileAssociations 中注册,并应提供自己的属性处理程序。 有关详细信息,请参阅 应用程序注册的“注册谓词和其他文件关联信息”部分。
何时使用
大多数应用程序使用此实现来创建和管理存储和流。
方法
-
创建并打开具有此存储对象中包含的指定名称的流对象。 名称长度不得超过 31 个字符(不包括字符串终止符)。 000 到 01f 字符(用作流/存储名称的第一个字符)保留供 OLE 使用。 这是复合文件限制,而不是结构化存储限制。 IStorage::CreateStream 方法的 COM 提供的复合文件实现不支持以下行为:
- 不支持STGM_DELETEONRELEASE标志。
- 流对象不支持事务处理模式(STGM_TRANSACTED)。
- 不支持从同一存储多次打开同一流。 必须在 grfMode 参数中指定STGM_SHARE_EXCLUSIVE共享模式标志。
-
使用 grfMode 参数中指定的访问模式打开此存储对象中的现有流对象。 000 到 01f 字符(用作流/存储名称的第一个字符)保留供 OLE 使用。 这是复合文件限制,而不是结构化存储限制。 IStorage::OpenStream 方法的 COM 提供的复合文件实现不支持以下行为:
- STGM_DELETEONRELEASE标志。
- 流对象的事务处理模式(STGM_TRANSACTED)。
- 从同一存储多次打开同一流。 必须指定STGM_SHARE_EXCLUSIVE标志。
-
在指定的访问模式下创建并打开具有指定名称的新存储对象。 名称长度不得超过 31 个字符(不包括字符串终止符)。 000 到 01f 字符(用作流/存储名称的第一个字符)保留供 OLE 使用。 这是复合文件限制,而不是结构化存储限制。 IStorage::CreateStorage 方法的 COM 提供的复合文件实现不支持以下行为:
- 非根存储的STGM_PRIORITY标志。
- 从同一父存储多次打开同一存储对象。 必须指定STGM_SHARE_EXCLUSIVE标志。
- STGM_DELETEONRELEASE标志。 如果指定了此标志,该函数将返回STG_E_INVALIDFLAG。
-
在指定的访问模式下打开具有指定名称的现有存储对象。 000 到 01f 字符(用作流/存储名称的第一个字符)保留供 OLE 使用。 这是复合文件限制,而不是结构化存储限制。 IStorage::OpenStorage 方法的 COM 提供的复合文件实现不支持以下行为:
- 非根存储的STGM_PRIORITY标志。
- 从同一父存储多次打开同一存储对象。 必须指定STGM_SHARE_EXCLUSIVE标志。
- STGM_DELETEONRELEASE标志。 如果指定了此标志,该函数将返回STG_E_INVALIDFUNCTION。
-
仅将此打开的存储对象的子存储和流复制到另一个存储对象中。 rgiidExclude 参数可以设置为IID_IStream仅复制子存储,也可以设置为仅复制流IID_IStorage。
-
将子存储或流从此存储对象复制到另一个存储对象或流。
-
确保对在事务处理模式下打开的存储对象所做的任何更改都反映在父存储中;对于根存储,反映实际设备中的更改;例如,磁盘上的文件。 对于在直接模式下打开的根存储对象,此方法不起作用,只不过将所有内存缓冲区刷新到磁盘。 对于直接模式下的非根存储对象,此方法不起作用。
COM 提供的复合文件实现使用两阶段提交过程,除非在 grfCommitFlags 参数中指定了STGC_OVERWRITE。 此两阶段过程可确保数据的可靠性,以防提交作失败。 首先,所有新数据都写入基础文件中未使用的空间。 如有必要,会将新空间分配给文件。 完成此步骤后,将使用单扇区写入作更新文件中的表,以指示将使用新数据代替旧数据。 旧数据将成为在下一个提交作中使用的可用空间。 因此,旧数据可用,如果提交更改时出错,则可以还原这些数据。 如果指定了STGC_OVERWRITE,则使用单阶段提交作。 有关事务处理模式标志的详细信息,请参阅 STGC 枚举。
-
放弃自上次提交作以来对存储对象所做的所有更改。
-
创建并检索指向枚举器对象的指针,该枚举器对象可用于枚举此存储对象中包含的存储和流对象。 COM 提供的复合文件实现将拍摄该信息的快照。 因此,在获取新的枚举器之前,流和存储的更改不会反映在枚举器中。
-
从此存储对象中删除指定的元素(子存储或流)。
-
重命名此存储对象中的指定子存储或流。 000 到 01f 字符(用作流/存储名称的第一个字符)保留供 OLE 使用。 这是复合文件限制,而不是结构化存储限制。
-
设置指定存储元素的修改、访问和创建时间。 COM 提供的复合文件实现维护内部存储对象的修改和更改时间。 根存储对象支持基础文件系统支持的任何内容(或 ILockBytes)。 复合文件实现不维护内部流的任何时间戳。 不支持的时间戳报告为零,这允许调用方测试支持。
-
将指定的 CLSID 分配给此存储对象。
-
在此存储对象中存储最多 32 位的状态信息。 此方法设置的状态仅用于外部使用。 COM 提供的复合文件实现不基于状态执行任何作。
-
检索此打开存储对象的 STATSTG 结构。
言论
如果存储对象以简单模式打开,则上述方法的使用受到限制。 如果使用 StgCreateStorageEx 或 StgOpenStorageEx 函数的 grfMode 参数中指定的STGM_SIMPLE元素打开存储,则存储处于简单模式。 有关简单模式存储的详细信息,请参阅 STGM 常量。 如果从 StgCreateStorageEx 函数获取了简单模式存储对象,则可以调用 CreateStream 方法,但 OpenStream 方法无法。 如果从 StgOpenStorageEx 函数获取了简单模式存储对象,则可以调用 OpenStream 方法,但 CreateStream 方法无法调用。
当使用简单模式存储对象创建流时,该流的最小大小通常为 4096 字节。 如果将更少的数据写入流,则大小将向上舍入为 4096 字节。
相关主题