为什么我必须在C#中关闭()一个文件?我知道这可能看起来很愚蠢,但为什么以下代码仅在我关闭()文件时才有效?如果我不关闭文件,则不会写入整个流。步骤:在表单加载时运行此代码。显示后,用鼠标关闭窗体。程序终止。当文件对象超出范围时,它不应该自动刷新或关闭吗?我是C#的新手,但我习惯于在C++析构函数中添加对Close()的调用。//注意:完整的输出大约是87KB。如果没有Close(),最后会丢失大约2KB。//转换为png,然后将其转换为base64编码的字符串。字符串b64img=ImageToBase64(img,ImageFormat.Png);//将base64图像保存到文本文件以进行更多测试和外部验证。StreamWriteroutfile=newStreamWriter("../../file.txt");outfile.Write(b64img);//如果我们不关闭文件,Windows将不会将其全部写入磁盘。不知道为什么//那会是。outfile.Close();C#没有自动确定性清理。如果要控制运行时,必须确保调用清理函数。using块是最常用的方法。如果您不自己进行清理调用,则清理将在垃圾收集器决定其他东西需要内存时进行,这可能需要很长时间。使用(StreamWriteroutfile=newStreamWriter("../../file.txt")){outfile.Write(b64img);}//一切正常,using块调用Dispose关闭文件为避免循环引用问题,运行时不会尝试以“正确”顺序终结对象,因此在StreamWriter终结器运行并尝试刷新缓冲输出时,FileStream实际上已失效。如果处置需要清理的对象,则可以使用using(对于本地范围)或通过调用IDisposable.Dispose(对于长期存在的对象,例如类成员的引用)显式地执行此操作。因为Write()被缓冲并且缓冲区被Close()显式刷新。流是“管理”或“处理”非垃圾收集资源的对象。因此,它们(Streams)实现了IDisposable接口,当与“using”一起使用时,将确保清理非垃圾收集的资源。试试这个:使用(StreamWriteroutfile=newStreamWriter("../../file.txt")){outfile.Write(b64img);}如果没有#Close,则无法确定底层文件句柄何时正确关闭。有时这可以在应用程序中关闭。因为您使用的是流编写器,并且在您关闭()编写器之前它不会刷新缓冲区。您可以通过将streamwriter的AutoFlush属性设置为true来指定希望编写器在每次调用write时刷新。查看文档。http://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx如果您想在不“关闭”的情况下写入文件,我会使用:System.IO.File操作系统缓存写入块设备使操作系统具有更好的性能。将写入器设置为自动刷新后,通过刷新缓冲区强制写入。因为C#设计者克服的是Java而不是C++,尽管名称如此。在我看来,他们真的错过了机会。在作用域退出时进行C++风格的销毁会好得多。更好的是它不必释放内存,只需自动运行终结器或IDisposable方法即可。以上是C#学习教程:WhydoIhavetoclose()afileinC#?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
