Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';FileStream.Flush()和FileStream.Flush(True)之间的区别是什么?_C#_.net_Filestream - Fatal编程技术网

C# 什么';FileStream.Flush()和FileStream.Flush(True)之间的区别是什么?

C# 什么';FileStream.Flush()和FileStream.Flush(True)之间的区别是什么?,c#,.net,filestream,C#,.net,Filestream,表示“还清除所有中间文件缓冲区。” “所有中间文件缓冲区”的确切含义是什么?这将额外调用以将缓冲区刷新到文件: Win32Native.FlushFileBuffers(this._handle); 调用Flush()或Flush(false)时,FileStream“将以前写入缓冲区的任何数据复制到文件中,并清除缓冲区(编码器状态除外)”。这里的Buffer是指FileStream类的内部缓冲区。复制到文件并不是将数据写入光盘。它只是将数据传递给操作系统 但是,Windows操作系统中的I

表示“还清除所有中间文件缓冲区。”


“所有中间文件缓冲区”的确切含义是什么?

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

 Win32Native.FlushFileBuffers(this._handle);
调用
Flush()
Flush(false)
时,
FileStream
“将以前写入缓冲区的任何数据复制到文件中,并清除缓冲区(编码器状态除外)”。这里的Buffer是指
FileStream
类的内部缓冲区。复制到文件并不是将数据写入光盘。它只是将数据传递给操作系统

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


顺便说一句,当您关闭文件时,所有缓冲数据将自动写入光盘。因此,只有当您需要在关闭文件句柄之前刷新数据时,才需要此功能。

它会导致缓冲在文件系统缓存中的文件数据写入磁盘。根据磁盘写入头的位置,该数据通常是延迟写入的。拥有千兆字节的缓存数据在技术上是可能的,因此可能需要相当长的时间。如果这对你很重要,那么就考虑<代码>文件选项。它完全禁用写缓存。这可能非常昂贵;您将发现硬盘的速度有多慢。

发布MS实现的源代码可以吗?(尽管事实上,我认为这里的整个代码并没有为答案增加价值)我使用reflector进行逆向工程。发布源代码-这在Meta上已经讨论了很多。例如,@Aliostad:你可以合法地阅读代码并不意味着在这里发布代码是合法的。据我所知,这个问题还没有得到明确的回答。MS共享源许可证允许出于教育目的进行分发。“您也可以将本软件与书籍或其他教材一起分发,或在网站上发布本软件,以教授软件的使用。”注意:根据MS bug报告,在某些情况下,Flush(true)会被破坏。MS修复了它,但没有说明它是在哪个.NET版本中修复的。有关于这个错误是在哪个.NET版本中修复的吗?在
文件流中没有“编码器状态”
,它需要字节,而不是字符,并将它们从磁盘传输到磁盘。您是否考虑过
StreamWriter
?似乎在关闭文件时,所有缓冲数据都会写入操作系统,而不是磁盘。性能测试表明:
File.AppendAllText()
的持续时间与
fileStream.Write()的持续时间具有相同的数量级;Flush(false),而
fileStream.Write();Flush(true)的速度慢一个数量级。由于
File.AppendAllText()
会立即再次关闭该文件,并且只要
fileStream.Flush(true)
,就可以假定关闭该文件会将缓冲数据写入操作系统,而不是强制操作系统将其写入磁盘。请记住,fileStream本身有一个缓冲区。因此,除非还将BufferSize设置为1,否则使用FileOptions.WriteThrough不是调用FileStream.Flush(True)的替代方法。