Почему текст не записывается на диск?

У меня есть следующий код 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 КБ

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, после Close, хотя я ждал несколько минут после завершения записи в файл.

Есть идеи?

Спасибо, Киприан.

ОБНОВЛЕНИЕ: Размер отображается в столбце размера проводника Windows. Если я смотрю на свойства файла, то размер больше 0(что правильно). После того, как я вернусь из окна свойств и обновлю окно проводника Windows, столбец размера будет обновлен до значения больше 0. Я просто обновлю окно проводника Windows, не просматривая свойства файла, столбец размера останется равным 0. Также, если я открою файл с notepad++, в нем есть все данные, и обновление в окне проводника Windows показывает правильное значение в столбце размера. Так что моя проблема, вероятно, не в том, что я написал код, но вы никогда не знаете.

2 ответа

Прямо изо рта лошади (он же MSDN):

Добавляет слой буферизации для операций чтения и записи в другом потоке. Этот класс не может быть унаследован.

И далее внизу в разделе замечаний:

Буфер - это блок байтов в памяти, используемый для кеширования данных, что уменьшает количество обращений к операционной системе.

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

Итак, основываясь на документации, ваш код ведет себя так, как ожидалось. Ничто не будет записано на диск, если не произойдет одно из 3 событий:

  1. Вы Close() буферизованный поток
  2. Вы Flush() Это
  3. Буфер заполнен

НТН...

Вы использовали BufferedStream, который не собирается ничего сбрасывать, пока не достигнете 65536 байт в буфере, ИЛИ вы не вызовете метод Flush, ИЛИ не вызовете метод Close. Если вы хотите получить результаты раньше, удалите BufferedStream или измените его размер на меньшее число.

ТОЛЬКО когда StreamWriter сбрасывает (или закрывает), он записывает в BufferedStream, и ТОЛЬКО когда BufferedStream сбрасывает (или закрывает), он записывает в FileStream.

Кроме того, файловый буфер Windows (устройство) должен выполнять свою магическую обработку ПОСЛЕ.NET, и в конечном итоге вы не можете контролировать, когда он фактически сохраняет данные на устройстве.

Другие вопросы по тегам