IPropertySetStorage-NTFS 文件系统实现

当文件本身不是复合文件时,NTFS 版本 5.0 为 NTFS 卷上的文件提供 IPropertySetStorage 的实现。 NTFS 实现等效于 复合文件实现。 有关异常的详细信息,请参阅备注。

获取指向 IPropertySetStorage 的 NTFS 实现的指针

  1. 调用 StgCreateStorageEx 并在 grfFlags 参数中指定STGFMT_FILE以创建新文件。
  2. 调用 StgOpenStorageEx 并在 grfFlags 参数中指定STGFMT_FILESTGFMT_ANY枚举值以打开现有文件。

但是,无法获取复合文件的 IPropertySetStorage 的 NTFS 实现。 使用 StgOpenStorage 打开复合文件时,指定 STGFMT_FILE 枚举值会导致错误。

此外,无法处理简单属性集。 也就是说,除非还在 grfFlags 参数中指定PROPSETFLAG_NONSIMPLE,否则不能在 CreateOpen 方法的 grfmode 参数中指定STGM_TRANSACTED。 属性集存储对象本身不支持事务处理。

何时使用

调用 IPropertySetStorage 方法以在当前 NTFS 属性集存储中创建、打开或删除属性集。 还有一个方法 IPropertySetStorage::Enum,该方法提供指向可用于枚举存储中的属性集的枚举器的指针。

兼容性

从 Windows 2000 开始, 可以使用 IPropertySetStorageIPropertyStorage 的 NTFS 实现。 早期版本无法访问这些属性集。

NTFS 实现将属性集存储在 NTFS 文件的备用流中。 复制main文件时,必须复制备用流。

注意

并非所有文件系统都支持此类流。 如果将具有属性集的 NTFS 文件复制到 FAT 卷,则仅复制该文件中的数据;属性集丢失。 在这种情况下 ,CopyFile 函数不返回错误。

 

注意

如果执行文件复制的计算机不是在 Windows 2000 或更高版本上运行的计算机,则属性集可能会丢失。 例如,如果在 Windows 95 操作系统上运行的计算机复制 NTFS 文件,则即使目标文件也位于 NTFS 卷上,属性集也会丢失。

 

方法

IPropertySetStorage 的 NTFS 文件系统实现支持以下方法。

IPropertySetStorage::Create

在当前 NTFS 文件存储中创建一个新属性集,并在返回时提供指向 IPropertyStorage NTFS 文件实现的接口指针。 必须在 grfmode 参数中指定的共享模式 STGM_SHARE_EXCLUSIVE

IPropertySetStorage::Open

打开当前属性存储中的现有属性集。 返回时,它提供指向 IPropertyStorage 的 NTFS 文件实现的接口指针。 必须在 grfmode 参数中指定的共享模式 STGM_SHARE_EXCLUSIVE

IPropertySetStorage::D elete

删除当前属性存储中的属性集。

IPropertySetStorage::Enum

创建用于枚举 STATPROPSETSTG 结构的 对象。 每个 STATPROPSETSTG 结构都提供有关单个属性集的数据。

备注

IPropertySetStorageIPropertyStorage 的 NTFS 实现在文件中设置存储属性,而不会影响该文件的内容。 例如,如果在名为 Default.htm 的 HTML 文件中创建属性集,则该文件仍会在 Web 浏览器中正确显示。 也就是说,在使用 CreateFile 函数访问文件时,无法检测到使用这两个接口对文件所做的更改。

当用于将属性集写入 NTFS 版本 5.0 卷上的文件时, IPropertySetStorage 的 NTFS 实现提供安全实现。 即使发生系统故障,实现也无法损坏此类属性集。 例如,如果在将属性集刷新到磁盘时调用 IPropertyStorage::Commit 期间系统电源失败,则属性集永远不会处于中间状态。 保留以前版本的属性集,或者保存所有更新。

IPropertySetStorage 的 NTFS 实现在以下方面不同于复合文件实现:

  • IEnumSTATPROPSETSTG 接口获取的 STATPROPSETSTG 结构包含 clsid 成员,其值始终为零 (CLSID_NULL) 。 使用复合文件实现,为非简单 (请参阅属性集的存储和流对象) 属性集返回正确的 clsid 成员。

  • 使用 StgCreateStorageEx 或 StgOpenStorageEx 函数获取 IPropertySetStorage 接口指针的 NTFS 实现时,grfmode 参数必须遵循与复合文件实现相同的规则。

    此外,可能不使用以下标志:

    STGM_SIMPLESTGM_TRANSACTEDSTGM_CONVERTSTGM_PRIORITYSTGM_DELETEONRELEASE

  • StgCreateStorageEx 或 StgOpenStorageEx 函数获取 NTFS IPropertySetStorage 接口时,共享模式主要应用于该接口的其他实例,而不适用于打开文件本身的实例。 例如,如果通过调用 StgOpenStorageEx 函数打开 NTFS IPropertySetStorage 接口,且 grfmode 参数设置为 STGM_READWRITE|STGM_SHARE_EXCLUSIVE,可以使用 CreateFile 函数打开文件。

    打开此接口的此类同时实例受以下约束:CreateFile 函数中的 dwShareMode 参数必须指定FILE_SHARE_READ标志,而 dwAccess 参数不得指定 DELETE 标志。 此外,不能在打开这些属性集接口的文件上调用 DeleteFileMoveFile 函数,因为这些函数需要对文件 进行 DELETE 访问。

  • 如果 NTFS IPropertySetStorage 方法以只读方式打开,并且文件当前没有属性集,则返回的对象实际上不会保留打开该文件。 因此,即使原始打开操作的共享模式会拒绝该文件,该文件的其他打开也会成功。

    例子;如果在模式中打开 NTFS IPropertySetStorageSTGM_READ|STGM_SHARE_EXCLUSIVE,并且文件没有属性集,可以同时打开文件 STGM_READWRITE|STGM_SHARE_EXCLUSIVE

IPropertyStorage-NTFS 文件系统实现

IPropertySetStorage

IPropertyStorage

IStorage::EnumElements

PROPSETFLAG 常量

STATPROPSETSTG