当前位置: 首页 > 编程语言 > C#

关闭没有Flush()的文件流分享

时间:2023-04-10 20:33:14 C#

C#学习教程:不使用Flush()关闭文件流我知道Close和Dispose调用Flush方法。MSDN不是100%清楚,但JonSkeet说“冲洗”,所以在关闭/处置之前这样做。它不会受伤,是吗?来自FileStream.Close方法:之前写入缓冲区的任何数据都会在文件流关闭之前复制到文件中,因此在调用Close之前无需调用Flush。调用Close后,对文件流的任何操作都可能抛出异常。在调用close一次后,如果再次调用它什么也不做。处置不是很清楚:此方法通过将任何更改写入后备存储并关闭流以释放资源来处置流。备注:评论者可能是对的,Flush并不是100%清楚:在实现缓冲区的流上覆盖Flush。使用此方法将任何信息从底层缓冲区移动到其目的地,清除缓冲区,或两者兼而有之。根据对象的状态,您可能必须修改流中的当前位置(例如,如果底层流支持查找)。有关更多信息,请参阅CanSeek。使用StreamWriter或BinaryWriter类时,不要刷新底层Stream对象。相反,请使用类的Flush或Close方法,以确保数据首先刷新到基础流,然后写入文件。测试:vartextBytes=Encoding.ASCII.GetBytes("Test123");使用(varfileTest=System.IO.File.Open(@"c:tempfileNoCloseNoFlush.txt",FileMode.CreateNew)){fileTest.Write(textBytes,0,textBytes.Length);}使用(varfileTest=System.IO.File.Open(@"c:tempfileCloseNoFlush.txt",FileMode.CreateNew)){fileTest.Write(textBytes,0,textBytes.Length);文件测试.Close();}使用(varfileTest=System.IO.File.Open(@"c:tempfileFlushNoClose.txt",FileMode.CreateNew)){fileTest.Write(textBytes,0,textBytes.Length);文件测试.Flush();}使用(varfileTest=System.IO.File.Open(@"c:tempfileCloseAndFlush.txt",FileMode.CreateNew)){fileTest.Write(textBytes,0,textBytes.Length);文件测试.Flush();文件测试.Close();}我能说什么...所有文件都有文字–也许这只是太少的数据?TEST2varrnd=newRandom();变量大小=1024*1024*10;varrandomBytes=newbyte[大小];rnd.NextBytes(randomBytes);使用(varfileTest=System.IO.File.Open(@"c:tempfileNoCloseNoFlush.bin",FileMode.CreateNew)){fileTest.Write(randomBytes,0,randomBytes.Length);}使用(varfileTest=System.IO.File.Open(@"c:tempfileCloseNoFlush.bin",FileMode.CreateNew)){fileTest。写(randomBytes,0,randomBytes.Length);文件测试.Close();}使用(varfileTest=System.IO.File.Open(@"c:tempfileFlushNoClose.bin",FileMode.CreateNew)){fileTest.Write(randomBytes,0,randomBytes.Length);文件测试.Flush();}使用(varfileTest=System.IO.File.Open(@"c:tempfileCloseAndFlush.bin",FileMode.CreateNew)){fileTest.Write(randomBytes,0,randomBytes.Length);文件测试.Flush();文件测试.Close();再次-每个文件都有它的字节......对我来说它看起来像是在做内容:在处理之前调用Flush或Close并不重要......对此有什么想法吗?您不必在Close()上调用Flush()/在Flush()上调用Dispose(),FileStream会为您做这件事,您可以从它的源代码中看到:http://referencesource.microsoft.com/#mscorlib/system/io/filestream.cs,e23a38af5d11ddd3[System.Security.SecuritySafeCritical]//自动生成的受保护覆盖??voidDispose(booldisposing){//根据我们是在处置还是在终结,没有什么会有所不同。这是利用//普通可终结对象和关键可终结对象之间的弱排序,我将其包含在SafeHandle//FileStream的设计中,这通常会在//最终确定时“正常工作”。try{if(_handle!=null&&!_handle.IsClosed){//如果我们正在写入,则将数据刷新到磁盘。在//考虑到这一点之后,我们也不需要刷新//我们的读取位置,无论句柄//是否暴露给用户。他们可能不会//希望我们这样做。如果(_writePos>0){FlushWrite(!处理);//因为你已经声明你理解关闭和处理调用flush方法,如果它没有被用户代码显式调用,我相信(通过关闭而不刷新)你实际上想要放弃对FileStream所做的事情的可能性必要时更改如果这是正确的,单独使用FileStream将无济于事。您需要将此文件加载到MemoryStream(或数组,具体取决于您修改其内容的方式),然后决定何时完成是否要保存更改。显然,问题是文件大小。FileStream使用有限大小的写入缓冲区来加速操作,但一旦耗尽,就需要刷新更改。由于.NET内存限制,如果您需要保留较小的文件,则只能将它们加载到内存中。一个更简单的替代方法是制作文件的磁盘副本,并使用普通的FileStream处理它。完成后,如果需要放弃更改,只需删除临时文件,否则用修改后的副本替换原始文件。我一直在追踪一个新引入的错误,该错误似乎表明.NET4在流式传输时不能可靠地将更改刷新到磁盘(与.NET2.0和3.5不同,它们始终可靠地执行此操作)。.NET4FileStream类在.NET4中进行了大量修改,虽然Flush*()方法已被覆盖,但.Dispose()似乎已被遗忘。这会导致文件不完整。将FileStream包装在BufferedStream中并在缓冲流之前关闭文件流。varfs=newFileStream(...);varbs=newBufferedStream(fs,buffersize);bs.Write(datatosend,0,长度);fs.Close();尝试{bs.Close();}catch(IOException){}在大循环中使用Flush()是值得的。当你必须循环读写一个大文件时。在其他情况下,缓冲区或计算机足够大,在进行Flush()之前关闭()也没有关系。示例:您必须读取大文件(以一种格式)并将其写入.txtStreamWritersw=....//使用StreamWriter//您读取文件...//现在您想要将每一行写入这个大文件使用WriteLine();for(.....)//这是一个大循环,因为文件很大并且有很多行{sw.WriteLine(*whateveriread*);//我们在这里写某处ex。一个.txt任何地方sw.Flush();//每次调用sw.flush()时,都会执行sw.WriteLine}sw.Close();在这里使用Flush()很重要;因为否则每个每个writeLine都保存在缓冲区中,并且在缓冲区满或程序到达sw.close()之前不会写入它。我希望这有助于理解Flush的作用。我认为使用简单的using语句在调用GetBytes()后关闭流是安全的;以上就是C#学习教程:ClosingaFileStreamwithoutFlush()的全部内容,如果对你有用还需要进一步了解C#学习教程,希望大家多多关注---publicstaticbyte[]GetBytes(字符串文件名){byte[]buffer=newbyte[4096];使用(FileStreamfs=newFileStream(fileName))使用(MemoryStreamms=newMemoryStream()){fs.BlockCopy(ms,buffer,4096);//Stream类的扩展方法fs.Close();返回ms.ToByteArray();}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: