为什么不将文本写入磁盘?

时间:2015-10-14 17:51:23

标签: c# filestream streamwriter flush bufferedstream

我有以下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列中的正确值。所以我的问题可能不是由于我写的代码,但你永远不知道。

2 个答案:

答案 0 :(得分:2)

直接来自马的嘴(又名MSDN):

  

添加缓冲层以在另一个流上读取和写入操作。这个类不能被继承。

并在备注部分进一步说明:

  

缓冲区是内存中的字节块,用于缓存数据,从而减少对操作系统的调用次数

https://msdn.microsoft.com/en-us/library/system.io.bufferedstream(v=vs.110).aspx

因此,根据文档,您的代码的行为符合预期。除非发生以下事件之一,否则不会将任何内容写入磁盘:

  1. Close()缓冲流
  2. Flush()
  3. 缓冲区已满
  4. ... HTH

答案 1 :(得分:0)

你使用了BufferedStream,它在缓冲区中达到65536字节之前不会刷新任何东西,或者你调用Flush方法,或者调用Close方法。如果您想要更快地获得结果,请取出BufferedStream或将其大小更改为较小的数字。

仅当StreamWriter刷新(或关闭)时,它才会写入BufferedStream,并且只有当BufferedStream刷新(或关闭)时,它才会写入FileStream。

此外,Windows(设备)文件缓冲区需要进行神奇的AFTER .NET处理,并且最终无法控制它何时将数据实际持久保存到设备。