2013-12-10 2 views
1

У меня есть BinaryWriter, что подкреплено MemoryStream как таковой:Доступ к базовой MemoryStream [для чтения] в BinaryWriter

BinaryWriter m_binaryWriter = new BinaryWriter(new MemoryStream(BUFFER_SIZE)); 

Я хочу, чтобы получить базовый читателя и прочитать его в массив байтов:

long DataLength = m_binaryWriter.BaseStream.Length; 
byte[] MemoryStrData = new byte[DataLength]; 
int BytesRead = m_binaryWriter.BaseStream.Read(MemoryStrData, 0, (int)DataLength); 

Однако BytesRead всегда 0 (и, очевидно, MemoryStrData содержит все 0). Я попытался использовать BinaryReader для чтения потока из базового потока, но это привело к тому же. Я что-то упустил?

+0

Вы уверены, что вы не после 'BinaryReader', а не' BinaryWriter' ..? –

+0

Да, я пишу данные в бинарный журнал, но хочу получить доступ к смежному блоку (как только он пересечет BUFFER_SIZE). – bge0

+0

Возможно, вам лучше реализовать пользовательский класс, полученный из 'Stream', и реализовать любую странную буферизацию/частичную фиксацию/ведение журнала (независимо от того, что вы делаете после чтения случайного блока из потока) внутри вашего класса ... –

ответ

1

Вы всегда знаете, что BinaryWriter будет поддерживаться MemoryStream?

Если это так, либо держите ссылку на MemoryStream вокруг, либо при необходимости примените базовый поток, а затем используйте MemoryStream.ToArray(), чтобы получить массив байтов содержимого MemoryStream.

+0

Да, это всегда будет поддерживаемый запоминающим устройством. Когда достигается значение buffer_size, я очищаю двоичный файл и удаляю его. После этого я воссоздаю его. Я не думаю, что .ToArray() поддерживается в Compact Framework, но я могу проверить. – bge0

+0

Согласно документации, она поддерживается, по крайней мере, в .NET 3.5 ['MemoryStream'] (http://msdn.microsoft.com/en-us/library/vstudio/system.io.memorystream.toarray (v = VS.90) .aspx). Я мало что знаю о .NET Compact Framework, поэтому, пожалуйста, подтвердите, есть ли у вас шанс. –

+0

Спасибо за предложение. Не существует ни одного члена, называемого .ToArray(), и фабрики под названием MemoryStream.ToArray() в компактной структуре. Именно по этой причине я использую .Read(). Теперь мне любопытно, нужно ли инициализировать мой MemoryStream с помощью массива байтов или нет. Я знаю, что есть перегрузка с флагом 'bool WriteAble'. Нужно ли это устанавливать? Еще один момент заключается в том, что когда я пишу ему, длина memystream DOES увеличивается ... – bge0

0

Я решил. Текущий индекс BinaryWriter, похоже, отличается от местоположения бэкэнд-потока! Я понял, что получить дескриптор BaseStream, а затем делать .read (OutputArray, Index, Count) будет достаточно, но вы должны сделать искать на самой BinaryWriter:

m_binaryWriter.Seek(0, SeekOrigin.Begin);