为什么文本不写入磁盘?

本文关键字:磁盘 文本 为什么 | 更新日期: 2023-09-27 18:17:47

我有以下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;

BufferedStream65536字节。filename是我本地驱动器d上文件的完整路径。

filename = "D:''Folder1'Folder2''file.txt"

我确实有权限写它。对于Write的调用,我使用类似的东西:

data = "1234567889|ababababababababbabababababababababababab"

同样,我不想摆脱缓冲区,我只想让流时不时地被刷新,并在磁盘上看到它。把文件放到0 KB很奇怪,当你关闭它的时候,它突然变大了。因此,通过所有测量,除非写入下一个流/磁盘,否则所有缓冲区都应该溢出。但是,在Close之后,Windows只显示大于0 KB的文件大小,尽管我在写入文件完成后等待了几分钟。

任何想法?

谢谢,Ciprian。

UPDATE: windows资源管理器大小列中的大小显示为0。如果我查看文件属性,那么大小大于0(这是正确的)。从属性窗口返回并刷新windows资源管理器窗口后,size列更新为大于0的值。如果我只是刷新windows资源管理器窗口,而不查看文件属性,大小列保持为0。此外,如果我用notepad++打开文件,它具有所有数据,并且在windows资源管理器窗口上刷新会在大小列中显示正确的值。所以我的问题可能不是由于我写的代码,但你永远不会知道。

为什么文本不写入磁盘?

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

增加一个缓冲层,用于对另一个流进行读写操作。这个类不能被继承。

再往下,在备注部分:

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

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

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

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

HTH…

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

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

此外,Windows(设备)文件缓冲区需要做它的神奇AFTER . net处理,最终你无法控制它何时实际将数据持久化到设备。