2011-02-07 140 views
20

MSDNFileStream.Flush(True)“还清除所有中间文件缓冲区”。FileStream.Flush()和FileStream.Flush(True)有什么区别?

“所有中间文件缓冲区”究竟意味着什么?

+1

注在每个MS错误报告的某些条件下,刷新(true)被破坏http://connect.microsoft.com/VisualStudio/feedback/details/634385/filestream-flush-flushtodisk-true-call-does-not-flush -the-缓存到磁盘#细节。 MS修复了它,但是不会说它修复了什么.NET版本。 – jimvfr 2013-02-15 21:58:09

+0

这个bug在哪个版本的.NET中被修复? – BaltoStar 2014-02-06 22:52:35

回答

23

它导致缓冲在文件系统缓存中的文件数据被写入磁盘。根据磁盘写入磁头的位置,该数据通常是懒惰地写入的。拥有千兆字节的缓存数据在技术上是可行的,因此可能需要相当长一段时间。如果这对您很重要,请考虑FileOptions.WriteThrough选项。它完全禁用写入缓存。这可能非常昂贵;你会发现硬盘的速度有多慢。

0

这将使额外调用刷新缓冲区到文件:

Win32Native.FlushFileBuffers(this._handle); 
+2

可以发布MS实现的源代码吗? (尽管我认为这里的整个代码并没有增加答案的价值) – 2011-02-07 13:00:03

4

当你调用Flush()Flush(false)FileStream“复制到任何数据之前写入缓冲区和文件清除缓冲区(除对于其编码器状态)“。此处的缓冲区表示FileStream类的内部缓冲区。并且复制到文件不是将数据写入光盘。它只是将数据传递给操作系统。

但是,Windows操作系统中的IO操作也被缓冲 - 将数据写入磁盘可能会被推迟,直到系统准备好执行它为止。因此,清除所有中间缓冲区会强制将缓冲数据写入光盘。这里的缓冲区表示Windows内部缓冲区[文件系统缓存]。

顺便说一下,当你关闭文件时,所有缓存的数据都会自动写入光盘。所以,只有在文件句柄关闭之前需要刷新数据时才需要这些东西。