C++ 刷新已写入文件上的文件缓冲区

C++ 刷新已写入文件上的文件缓冲区,c++,file,winapi,io,flush,C++,File,Winapi,Io,Flush,我有一个组件将他的结构写入文件。 问题在于,他编写的数据在任何系统故障时都需要保持一致。 所以我需要物理写入数据。 问题是组件没有这样的选项,从组件数据生成filesaver函数需要一些时间,并且会使程序复杂化 问题是: 如果我使用组件(例如:ComponentX->WriteToFile(文件名))编写数据,那么我可以使用Handle=OpenFile(文件名)然后使用FlushFileBuffers(句柄)来确保数据的一致性吗?还是这个把戏行不通 我认为这可能会起作用,因为在OpenFile

我有一个组件将他的结构写入文件。 问题在于,他编写的数据在任何系统故障时都需要保持一致。 所以我需要物理写入数据。 问题是组件没有这样的选项,从组件数据生成filesaver函数需要一些时间,并且会使程序复杂化

问题是: 如果我使用组件(例如:ComponentX->WriteToFile(文件名))编写数据,那么我可以使用Handle=OpenFile(文件名)然后使用FlushFileBuffers(句柄)来确保数据的一致性吗?还是这个把戏行不通

我认为这可能会起作用,因为在OpenFile中,系统可能会使用缓存中已经存在的句柄,刷新它将导致保存以前操作(组件文件保存)中的缓存数据,但我不确定


如果这可能不起作用,有没有其他方法,而不是通过我自己(使用CreateFile,…)从组件生成数据?

没有刷新可以解决您的问题。如果在刷新缓冲区时系统冻结怎么办

存在多种解决方案。您可以写入2个(或更多)交替文件,例如:您知道,如果其中一个文件已损坏,则前一个文件很可能会损坏(除非在恢复过程中出现一些难看的冻结)。如果您的检查点文件很小,这将非常有效。使用数据写入校验和有助于在恢复时避免怀疑

使用
file\u FLAG\u NO\u缓冲打开文件
要求直接写入磁盘,避免通过缓存进行系统写入。这可能与前面的选项配合得更好,因为系统在检查点期间仍可能失败,从而损坏整个文件

其次,Windows具有良好的性能和易用性


最后,如果您无法访问检查点的写入方式,只需设置一些备份例程,以便在检查点之间将检查点文件保存到另一个驱动器。如果文件是lagre,您可能会使用一些热备份程序,这些程序的价格从0美元到100美元不等。Windows Robocopy实用程序可能非常适合您的要求。

任何刷新都无法解决您的问题。如果在刷新缓冲区时系统冻结怎么办

存在多种解决方案。您可以写入2个(或更多)交替文件,例如:您知道,如果其中一个文件已损坏,则前一个文件很可能会损坏(除非在恢复过程中出现一些难看的冻结)。如果您的检查点文件很小,这将非常有效。使用数据写入校验和有助于在恢复时避免怀疑

使用
file\u FLAG\u NO\u缓冲打开文件
要求直接写入磁盘,避免通过缓存进行系统写入。这可能与前面的选项配合得更好,因为系统在检查点期间仍可能失败,从而损坏整个文件

其次,Windows具有良好的性能和易用性


最后,如果您无法访问检查点的写入方式,只需设置一些备份例程,以便在检查点之间将检查点文件保存到另一个驱动器。如果文件是lagre,您可能会使用一些热备份程序,这些程序的价格从0美元到100美元不等。Windows Robocopy实用程序可能非常适合您的要求。

您可以刷新整个卷。也可以使用FlushFileBuffers()完成,使用卷的句柄。目前还不清楚在应用程序关闭文件后,你希望如何做到这一点。有人在电源线中间绊倒了。找一个UPS进行真正(快速)的修复。谢谢,完整的音量可能会很慢。数据保存时间间隔为5分钟以上。UPS无法解决此问题,这不是内部程序,其功能是通过备份解决这些问题。您可以刷新整个卷。也可以使用FlushFileBuffers()完成,使用卷的句柄。目前还不清楚在应用程序关闭文件后,你希望如何做到这一点。有人在电源线中间绊倒了。找一个UPS进行真正(快速)的修复。谢谢,完整的音量可能会很慢。数据保存时间间隔为5分钟以上。UPS不会解决问题,这不是一个内部程序,它的功能是解决其他hanks备份的问题,我已经做了2个文件备份(备份的备份或换句话说备份的副本)。对于FILE_FLAG_NO_缓冲,我需要使用CreateFile,这是我不想使用的第二个选项(如上所述,我自己创建结构)。据我所知,在从组件编写之后,并没有其他方法可以做到这一点。现在我将使用2 files方法,也许以后会使用CreateFile实现我的写函数。@Spider:我知道你不经常做检查点,5分钟左右?在这种情况下,2个文件的旋转应该足够健壮。在一个没有过载的系统上,缓冲区仍然会以秒为单位刷新。谢谢,我已经做了2个文件备份(备份的备份或者换句话说,备份的副本)。对于FILE_FLAG_NO_缓冲,我需要使用CreateFile,这是我不想使用的第二个选项(如上所述,我自己创建结构)。据我所知,在从组件编写之后,并没有其他方法可以做到这一点。现在我将使用2 files方法,也许以后会使用CreateFile实现我的写函数。@Spider:我知道你不经常做检查点,5分钟左右?在这种情况下,2个文件的旋转应该足够健壮。在未过载的系统上,缓冲区仍将以秒为单位刷新。