首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么IStream::提交未能将数据写入文件?

为什么IStream::提交未能将数据写入文件?
EN

Stack Overflow用户
提问于 2015-11-09 03:59:07
回答 2查看 524关注 0票数 1

我有一个二进制文件,当我打开它时,我使用::StgOpenStorageSTGM_READWRITE | STGM_SHARE_DENY_WRITE | STGM_TRANSACTED模式来获得一个名为rootStorage的根存储。然后,我使用rootStorage.OpenStreamSTGM_READWRITE | STGM_SHARE_EXCLUSIVE模式来获得一个名为subStream的子流。

接下来,我用subStream.Wirte(...)编写了一些数据,并调用了subStream.Commit(STGC_DEFAULT),但是它无法在文件中写入数据。

我也试过rootStorage.Commit(STGC_DEFAULT),可以写数据。但是当我使用UltraCompare专业-二进制比较来比较原始文件和我打开的文件时,在文件末尾已经写了很多额外的数据。额外的数据似乎是从文件的开始。

我只想在打开文件时将一些数据写入文件中。我该怎么办?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-09 10:46:39

我已经知道了为什么我的文件上有额外的数据。

1。我为什么要使用IStorage.Commit()

我使用STGM_READWRITE模式来创建一个存储。这叫做交易模式。在事务处理模式中,在完成显式提交操作之前,更改将被累积,并且不会反映在存储对象中。所以我需要打电话给rootStorage.Commit()

2。为什么调用IStorage.Commit(STGC_DEFAULT)后会有额外的数据

根据这个网站

OLE提供的复合文件使用两个阶段提交过程,除非在STGC_OVERWRITE参数中指定了grfCommitFlags。这个两阶段的过程确保了在提交操作失败时数据的鲁棒性。首先,将所有新数据写入基础文件中未使用的空间。如果有必要,将为文件分配新的空间。成功完成此步骤后,将使用单个扇区写入更新文件中的表,以指示将使用新数据代替旧数据。旧数据将成为下一次提交时使用的空闲空间。因此,旧数据是可用的,并且可以在提交更改时发生错误时进行还原。如果指定了STGC_OVERWRITE,则使用单相提交操作。

票数 0
EN

Stack Overflow用户

发布于 2015-11-09 06:04:21

二进制文件比较可能不适用于结构化存储文件。问题是结构化存储文件通常有额外的空间分配给它们--处理事务模式和增长文件。如果您想要进行文件比较,则需要更多的工作。您必须在每个文件中打开根存储,然后打开流,并对流进行二进制比较。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33602316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档