我有一个二进制文件,当我打开它时,我使用::StgOpenStorage和STGM_READWRITE | STGM_SHARE_DENY_WRITE | STGM_TRANSACTED模式来获得一个名为rootStorage的根存储。然后,我使用rootStorage.OpenStream和STGM_READWRITE | STGM_SHARE_EXCLUSIVE模式来获得一个名为subStream的子流。
接下来,我用subStream.Wirte(...)编写了一些数据,并调用了subStream.Commit(STGC_DEFAULT),但是它无法在文件中写入数据。
我也试过rootStorage.Commit(STGC_DEFAULT),可以写数据。但是当我使用UltraCompare专业-二进制比较来比较原始文件和我打开的文件时,在文件末尾已经写了很多额外的数据。额外的数据似乎是从文件的开始。
我只想在打开文件时将一些数据写入文件中。我该怎么办?
发布于 2015-11-09 10:46:39
我已经知道了为什么我的文件上有额外的数据。
1。我为什么要使用IStorage.Commit()
我使用STGM_READWRITE模式来创建一个存储。这叫做交易模式。在事务处理模式中,在完成显式提交操作之前,更改将被累积,并且不会反映在存储对象中。所以我需要打电话给rootStorage.Commit()。
2。为什么调用IStorage.Commit(STGC_DEFAULT)后会有额外的数据
根据这个网站:
OLE提供的复合文件使用两个阶段提交过程,除非在STGC_OVERWRITE参数中指定了grfCommitFlags。这个两阶段的过程确保了在提交操作失败时数据的鲁棒性。首先,将所有新数据写入基础文件中未使用的空间。如果有必要,将为文件分配新的空间。成功完成此步骤后,将使用单个扇区写入更新文件中的表,以指示将使用新数据代替旧数据。旧数据将成为下一次提交时使用的空闲空间。因此,旧数据是可用的,并且可以在提交更改时发生错误时进行还原。如果指定了STGC_OVERWRITE,则使用单相提交操作。
发布于 2015-11-09 06:04:21
二进制文件比较可能不适用于结构化存储文件。问题是结构化存储文件通常有额外的空间分配给它们--处理事务模式和增长文件。如果您想要进行文件比较,则需要更多的工作。您必须在每个文件中打开根存储,然后打开流,并对流进行二进制比较。
https://stackoverflow.com/questions/33602316
复制相似问题