当前位置:  开发笔记 > 编程语言 > 正文

如何确保所有数据都已物理写入磁盘?

如何解决《如何确保所有数据都已物理写入磁盘?》经验,为你挑选了2个好方法。

据我所知,.NET FileStream的Flush方法只将当前缓冲区写入磁盘,但依赖于Windows的磁盘驱动程序和硬盘固件,这并不能保证数据实际上是物理写入磁盘的.

是否有.NET或Win32方法可以给我这个保证?因此,如果在调用此方法后一纳秒之后出现断电,我仍然可以确定一切正常吗?



1> jimvfr..:

斯蒂芬S.说:

据我所知,.NET FileStream的Flush方法只将当前缓冲区写入磁盘

不,.NET FileStream的Flush只将.NET缓冲区写入操作系统缓存,它不会将操作系统缓存刷新到磁盘.可悲的是,这个类的MSDN文档并没有这么说.对于.NET <4.0,你必须调用Flush + Win32的FlushFilebuffers:

using System.Runtime.InteropServices;
. . .

// start of class:
[DllImport("kernel32", SetLastError=true)]
private static extern bool FlushFileBuffers(IntPtr handle);
. . .

stream.Flush();     // Flush .NET buffers to OS file cache.
#pragma warning disable 618,612 // disable stream.Handle deprecation warning.
if (!FlushFileBuffers(stream.Handle))   // Flush OS file cache to disk.
#pragma warning restore 618,612
{
  Int32 err = Marshal.GetLastWin32Error();
  throw new Win32Exception(err, "Win32 FlushFileBuffers returned error for " + stream.Name);
}

对于.NET 4.0,您可以改为使用新的flush(true)方法.11/09/2012更新:这里的 MS错误报告说它已损坏,然后修复,但没有说明它修复了哪个版本或服务包!听起来像bug是内部.NET FileStream缓冲区为空,Flush(true)什么也没做?



2> 小智..:

在Windows下,查看FlushFileBuffers(Win32 API).

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有