2015-10-14 2 views
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; 
    } 
} 

Почему не данные будут записаны на диск, пока я не позову Закрыть? Технические данные: я пишу 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, после Close, хотя я ждал несколько минут после того, как запись в файл закончилась.

Любые идеи?

Спасибо, Ciprian.

UPDATE: размер отображается 0 в столбце размера проводника Windows. Если я посмотрю на свойства файла, размер больше 0 (это верно). После того, как я вернусь из окна свойств и обновляю окно проводника Windows, столбец размера обновляется до значения, большего чем 0. Я просто обновляю окно проводника Windows, не глядя на свойства файла, столбец размера остается равным 0. Также, если я открываю файл с блокнотом ++, он имеет все данные, а обновление в окне проводника Windows показывает правильное значение в столбце размера. Поэтому моя проблема, вероятно, не из-за кода, который я написал, но вы никогда не знаете.

+0

где вы пишете данные, вы просто пытаетесь написать пустой charcter для всего? –

+0

На моем собственном ПК. filename имеет вид smth: D: \ Folder1 \ Folder2 \ file.txt данные похожи на «09890890 | ajhdjaskdhaskdjhaskdhasjkdhasksjdha» для каждого вызова Write – MciprianM

+0

нет, что вы пытаетесь записать в него? –

ответ

0

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

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

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

+0

Он заявил, что пишет 9000 КБ данных и задается вопросом, почему он не сбрасывается, поскольку буфер составляет 65536 байт. –

+0

Существует ТАКЖЕ буфер файловой системы, с которым мы не имеем прямого контроля. –

+0

Пишите ... и это, вероятно, проблема, поэтому, вероятно, вы должны добавить это к своему ответу. –

2

из первоисточника (ака MSDN):

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

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

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

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

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

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

HTH ...

Смежные вопросы