MSDN 不是 100% 清楚,但 Jon Skeet 说“冲洗”,所以在关闭/处置之前这样做。不会痛吧?
来自FileStream.Close Method:
之前写入缓冲区的任何数据都会在之前复制到文件中
文件流是关闭的,所以之前不需要调用 Flush
调用关闭。在调用 Close 之后,对文件的任何操作
流可能会引发异常。在 Close 被调用一次后,它
如果再次调用,则什么也不做。
处置不是很清楚:
此方法通过将任何更改写入支持来处理流
存储和关闭流以释放资源。
备注:评论员可能是对的,不是 100% 从同花顺中清楚:
在实现缓冲区的流上覆盖 Flush。使用此方法
将任何信息从底层缓冲区移动到其目的地,
清除缓冲区,或两者兼而有之。根据对象的状态,您
可能必须修改流中的当前位置(对于
例如,如果底层流支持查找)。对于额外的
信息见 CanSeek。
当使用 StreamWriter 或 BinaryWriter 类时,不要刷新
基本流对象。相反,使用类的 Flush 或 Close 方法,
确保将数据刷新到底层流
先写入文件。
测试:
var textBytes = Encoding.ASCII.GetBytes("Test123");
using (var fileTest = System.IO.File.Open(@"c:\temp\fileNoCloseNoFlush.txt", FileMode.CreateNew))
{
fileTest.Write(textBytes,0,textBytes.Length);
}
using (var fileTest = System.IO.File.Open(@"c:\temp\fileCloseNoFlush.txt", FileMode.CreateNew))
{
fileTest.Write(textBytes, 0, textBytes.Length);
fileTest.Close();
}
using (var fileTest = System.IO.File.Open(@"c:\temp\fileFlushNoClose.txt", FileMode.CreateNew))
{
fileTest.Write(textBytes, 0, textBytes.Length);
fileTest.Flush();
}
using (var fileTest = System.IO.File.Open(@"c:\temp\fileCloseAndFlush.txt", FileMode.CreateNew))
{
fileTest.Write(textBytes, 0, textBytes.Length);
fileTest.Flush();
fileTest.Close();
}
我能说什么...所有文件都有文本 - 也许这只是数据太少?
测试2
var rnd = new Random();
var size = 1024*1024*10;
var randomBytes = new byte[size];
rnd.NextBytes(randomBytes);
using (var fileTest = System.IO.File.Open(@"c:\temp\fileNoCloseNoFlush.bin", FileMode.CreateNew))
{
fileTest.Write(randomBytes, 0, randomBytes.Length);
}
using (var fileTest = System.IO.File.Open(@"c:\temp\fileCloseNoFlush.bin", FileMode.CreateNew))
{
fileTest.Write(randomBytes, 0, randomBytes.Length);
fileTest.Close();
}
using (var fileTest = System.IO.File.Open(@"c:\temp\fileFlushNoClose.bin", FileMode.CreateNew))
{
fileTest.Write(randomBytes, 0, randomBytes.Length);
fileTest.Flush();
}
using (var fileTest = System.IO.File.Open(@"c:\temp\fileCloseAndFlush.bin", FileMode.CreateNew))
{
fileTest.Write(randomBytes, 0, randomBytes.Length);
fileTest.Flush();
fileTest.Close();
}
再一次 - 每个文件都有它的字节......对我来说,它看起来就像我从 MSDN 中读到的一样:在 dispose 之前调用 Flush 或 Close 都没关系......对此有什么想法吗?