刷新磁盘写入caching

Windows XP和Vista中的磁盘策略设置为在硬盘上启用写入caching时,是否有办法刷新刚刚写入的文件,并确保它已提交到磁盘?

我想用C ++编程。

closures文件在应用程序级执行flush操作,但不在操作系统级执行flush操作。 如果在closures文件后但在操作系统刷新磁盘写入caching之前将电源从PC中移除,即使该文件已closures,文件也会丢失。

你还没有指定开发环境,所以:

。净

IO流有一个.Flush方法,可以做你想做的事情。

Win32 API

FlushFileBuffers调用,它将文件句柄作为参数。

编辑(基于评论从OA):FlushFileBuffers不需要管理权限; 只有传递给它的句柄是一个卷的句柄,而不是单个文件。

.NET FileStream.Flush()不会刷新该文件内容的Windows缓存; Flush()只刷新.NET内部文件缓冲区。 在.NET 4.0中,Microsoft通过向Flush()添加可选参数来解决该问题,如果设置为true,则会调用FlushFileSystemBuffers。 在.NET 3.5及以下版本中,唯一的选择是通过pinvoke调用FlushFileBuffers。 有关如何执行此操作,请参阅MSDN的FileStream.Flush社区注释。

您在关闭文件时不应该修复此问题。 Windows将缓存,除非您打开文件传递FILE_FLAG_WRITE_THROUGH到CreateFile()。

你也可能想通过FILE_FLAG_NO_BUFFERING ; 这告诉Windows不要在缓存中保留字节的副本。

根据MSDN上的CreateFile文档,这比FlushFileBuffers()更有效。

另请参阅MSDN上的文件缓冲和文件缓存 。

您还应该注意,即使在调用框架API的flush方法时,您的数据也可能不会被刷新到实际的磁盘上。

调用flush方法只会告诉内核将其页面刷新到磁盘。 但是,如果启用了磁盘写入缓存,则可以无限期地延迟实际的写入过程。

为了确保您的数据被写入到物理层,您必须关闭操作系统中的写入缓存。 在处理大量小型Io操作时,这通常会带来一到两个数量级的性能损失。 基于电池的支持(UPS)或接受命令刷新磁盘写缓存的磁盘是解决此问题的另一个选项。

从微软文档你可以使用_flushall和COMMODE.OBJ链接来确保所有的缓冲区都被提交到磁盘。