C # .NET: Будет ли BinaryWriter очищаться при заполнении буфера FileStream? - PullRequest
0 голосов
/ 14 июля 2011

Я сталкиваюсь с чем-то тривиальным, но похоже, что данные сбрасываются на диск (из буфера FileStream), когда данные, которые я буферизирую, достигают размера буфера FileStream.

//use the FileStream buffer to actually buffer the data to be written, so segments are written as desired.
FileStream writeStream = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.None, CommandOperationBufferSize);
BinaryWriter binWriter = new BinaryWriter(writeStream);
byte[] FullSize = new byte[CommandOperationTotalSize];

//the BinaryWriter will flush when the FileStream buffer is hit
binWriter.Write(FullSize); //DATA FLUSHES TO DISK HERE!

//if wait, wait five seconds
if (CommandOperation == "writewait" || CommandOperation == "appendwait")
{
    Thread.Sleep(5000);
    writeStream.Flush();
    Thread.Sleep(5000);
}

writeStream.Close();
writeStream.Dispose();
binWriter.Close();

Кто-нибудь может подтвердить, что это так? Что буфер FileStream является фактическим .Flush (), когда буфер FileStream заполнен?

Я спрашиваю, потому что кажется, что если я установлю CommandOperationTotalSize в 1 МБ, а в CommandOperationBufferSize - 64 КБ, данные будут записаны на диск при заполнении буфера.

Звучит так, будто я ответил на свой вопрос, но странно, что буфер FileStream не переполнится? Но, может быть, разработчики API пытаются быть милыми?

Спасибо

Мэтт

1 Ответ

2 голосов
/ 14 июля 2011

Вы можете легко предположить, что переполнение буфера невозможно. Класс был бы довольно сложен в использовании, если бы это было так, учитывая, что FileStream вообще не имеет свойств, чтобы сказать вам, сколько сейчас буферизуется.

Буфер предназначен только для уменьшения количества обращений к собственному вызову Windows WriteFile (). Важно, когда вы пишете небольшие объемы данных, скажем, один байт за раз. Если вы не укажете явно размер буфера, он будет использовать буфер размером 4096 байт. Что хорошо, очень редко нужно что-то еще. Любые записи в дальнейшем буферизируются кешем файловой системы. Вы должны учитывать нестандартный размер только при использовании FileOptions.WriteThrough

...