我有以下C#代码:
private const int APPENDBUFFERSIZE = 65536;
private StreamWriter _streamWriter;
private FileStream _fileStream;
private BufferedStream _bufferedStream;
public void Open(string fileName)
{
_fileStream = File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.Read);
_bufferedStream = new BufferedStream(_fileStream, APPENDBUFFERSIZE);
_streamWriter = new StreamWriter(_bufferedStream);
}
public void Write(string data)
{
_streamWriter.Write(data);
}
public void Close()
{
if (_streamWriter != null)
{
_streamWriter.Flush();
_streamWriter.Dispose();
_streamWriter = null;
}
if (_bufferedStream != null)
{
_bufferedStream.Dispose();
_bufferedStream = null;
}
if (_fileStream != null)
{
_fileStream.Dispose();
_fileStream = null;
}
}
为什么在我调用Close之前数据不会写入磁盘? 技术数据: 我写了9000 KB的数据
StreamWriter
班有:
internal const int DefaultBufferSize = 1024;
FileStream
班有:
internal const int DefaultBufferSize = 4096;
BufferedStream
应为65536
个字节。
filename
是本地驱动器D上文件的完整路径。
filename = "D:\\Folder1\Folder2\\file.txt"
我确实有权写信给它。
要拨打Write
,我会使用类似的内容:
data = "1234567889|ababababababababbabababababababababababab"
另外,我不想摆脱缓冲区,我只是想要不时地刷新流,并在磁盘上看到它。将文件发送到0 KB
并且当你关闭时突然发生这种情况很奇怪,这很奇怪。
因此,通过所有测量,除非写入下一个流/磁盘,否则所有缓冲区都应溢出。尽管如此,在0 KB
之后,Windows仅显示大于Close
的文件大小,尽管在写入文件完成后我已经等了几分钟。
有什么想法吗?
谢谢,Ciprian。
更新:Windows资源管理器大小列中的大小显示为0。如果我查看文件属性,那么大小大于0(这是正确的)。从属性窗口返回并刷新Windows资源管理器窗口后,大小列将更新为大于0的值。只需刷新Windows资源管理器窗口而不查看文件属性,大小列保持为0.此外,如果我打开带有notepad ++的文件,它包含所有数据,并且Windows资源管理器窗口上的刷新显示了size列中的正确值。所以我的问题可能不是由于我写的代码,但你永远不知道。
答案 0 :(得分:2)
直接来自马的嘴(又名MSDN):
添加缓冲层以在另一个流上读取和写入操作。这个类不能被继承。
并在备注部分进一步说明:
缓冲区是内存中的字节块,用于缓存数据,从而减少对操作系统的调用次数
https://msdn.microsoft.com/en-us/library/system.io.bufferedstream(v=vs.110).aspx
因此,根据文档,您的代码的行为符合预期。除非发生以下事件之一,否则不会将任何内容写入磁盘:
Close()
缓冲流Flush()
... HTH
答案 1 :(得分:0)
你使用了BufferedStream,它在缓冲区中达到65536字节之前不会刷新任何东西,或者你调用Flush方法,或者调用Close方法。如果您想要更快地获得结果,请取出BufferedStream或将其大小更改为较小的数字。
仅当StreamWriter刷新(或关闭)时,它才会写入BufferedStream,并且只有当BufferedStream刷新(或关闭)时,它才会写入FileStream。
此外,Windows(设备)文件缓冲区需要进行神奇的AFTER .NET处理,并且最终无法控制它何时将数据实际持久保存到设备。