提交写

时间:2009-02-25 08:03:19

标签: c windows windows-xp

我在C中使用fopen fread fwrite编程win32。

如何强制Windows将数据写入磁盘?是否需要API调用?

我有一个程序必须绝对确保数据在保存到不同的索引文件之前保存到磁盘,否则如果崩溃,索引文件有时会更新,但另一个文件不会导致错误的不一致。

5 个答案:

答案 0 :(得分:2)

在每个fwrite之后使用fflush函数

答案 1 :(得分:2)

fflush()做你想要的。如果您决定使用Win32 API来执行文件IO而不是C STDIO lib,那么请将FILE_FLAG_WRITE_THROUGH标志提供给CreateFile(),它完全符合您的要求。

答案 2 :(得分:0)

请参阅_commit功能。也在this other MSDN page。这仅适用于_open和其他函数,因此请参阅this article - 您可以将程序与commode.obj相关联,以使fflush提交到磁盘。

答案 3 :(得分:0)

请注意,无论您使用哪种功能,都无法避免断电或硬重置。硬盘播放智能,即使他们刚刚将数据放入缓存并且实际上没有将其写入表面,也可以报告写入已完成。

答案 4 :(得分:0)

请参见this archived KB article.

最初使用fopen打开文件时,请在最后一个选项中加入“ c”模式选项:

fopen( path, "wc") // w - write mode, c - allow immediate commit to disk

然后,当您要强制刷新到磁盘时,调用

_flushall()

我们在致电

之前先打了这个电话
fclose()

在我们发现这种方法之前,写操作未持久保存到磁盘的问题引起了我们的实际问题。

从上述网站上

“ Microsoft C / C ++ 7.0版为fopen()引入了” c“模式选项 功能。当应用程序打开文件并指定“ c”模式时, 当运行库将文件缓冲区的内容写入磁盘时, 应用程序调用fflush()或_flushall()函数。 “