1

我有以下 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当你关闭时突然间,它很大。因此,通过所有测量,除非写入下一个流/磁盘,否则所有缓冲区都应该溢出。尽管如此,Windows 仅显示大于0 KB, after的文件大小Close,尽管我在写入文件完成后等待了几分钟。

有任何想法吗?

谢谢,西普里安。

更新:大小在 Windows 资源管理器大小列中显示为 0。如果我查看文件属性,则大小大于 0(这是正确的)。从属性窗口返回并刷新 Windows 资源管理器窗口后,大小列更新为大于 0 的值。我只是刷新 Windows 资源管理器窗口而不查看文件属性,大小列保持在 0。另外,如果我打开带有记事本++的文件,它包含所有数据,并且在Windows资源管理器窗口中刷新会在大小列中显示正确的值。所以我的问题可能不是因为我写的代码,但你永远不知道。

4

2 回答 2

2

直接从马的嘴里(又名 MSDN):

添加缓冲层以对另一个流进行读写操作。这个类不能被继承。

并在备注部分进一步向下:

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

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

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

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

HTH...

于 2015-10-14T18:15:57.910 回答
0

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

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

此外,Windows(设备)文件缓冲区需要在 .NET 处理之后发挥其魔力,最终您无法控制它何时将数据实际持久保存到设备。

于 2015-10-14T18:03:10.980 回答