据我了解,.NET FileStream 的 Flush 方法仅将当前缓冲区写入磁盘,但依赖于 Windows 的磁盘驱动程序和硬盘固件,这不能保证数据实际上物理写入磁盘。
有没有 .NET 或 Win32 方法可以给我这样的保证?因此,如果在调用此方法返回后一纳秒断电,我仍然可以确定一切正常吗?
斯特凡·S. 说:
我了解.NET FileStream的Flush方法仅将当前缓冲区写入磁盘
不,.NET FileStream 的 Flush 仅将 .NET 缓冲区写入操作系统缓存,不会将操作系统缓存刷新到磁盘。遗憾的是,MSDN 文档中关于此类的内容并没有这么说。对于 .NET
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) 方法。
2012 年 11 月 9 日更新:MS 错误报告here说它坏了,然后修复了,但没有说明它是在哪个版本或服务包中修复的!听起来好像错误是如果内部 .NET FileStream 缓冲区为空,则 Flush(true) 不会执行任何操作?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)