FileStream.Flush()和FileStream.Flush(True)之间有什么区别?

MSDN说FileStream.Flush(True) “也清除了所有中间文件缓冲区。”

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

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

当您调用Flush()Flush(false)FileStream “将先前写入缓冲区的任何数据复制到文件中并清除缓冲区(编码器状态除外)”。 这里的缓冲区表示FileStream类的内部缓冲区。 并且复制到文件不会将数据写入光盘。 它只是将数据传递给操作系统。

但是,Windows操作系统中的IO操作也会被缓冲 – 将数据写入磁盘可能会被推迟,直到系统准备就绪。 因此,清除所有中间缓冲区会强制将缓冲数据写入光盘。 这里的缓冲区意味着Windows内部缓冲区[文件系统缓存]。

BTW关闭文件时,所有缓冲的数据将自动写入光盘。 因此,只有在文件句柄关闭之前需要刷新数据时才需要这些东西。

这将进行额外调用以将缓冲区刷新到文件:

  Win32Native.FlushFileBuffers(this._handle);