2013-12-10 4 views
1

난 같은 MemoryStream을 뒷받침하는 binarywriter이액세스베이스 MemoryStream을 binarywriter에서 [읽기]

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

을 : 당신이해야 할 basestream에 대한 핸들을 얻는 다음 .read (OutputArray, 색인, 카운트) 충분할 것이다을하고 있지만, 상기 BinaryWriter 자체에 추구 생각 'BinaryReader'가 아니라'BinaryWriter'가 아니라 ..? –

+0

예, 바이너리 기록기에 데이터를 쓰고 있지만 연속 블록 (일단 BUFFER_SIZE를 지나면)에 대한 액세스를 원합니다. – bge0

+0

'Stream'에서 파생 된 커스텀 클래스를 구현하는 것이 더 나을지도 모르며 클래스의 내부에서 이상한 버퍼링/부분 커밋/로깅 (스트림에서 임의 블록을 읽은 후에 무엇이든간에)을 구현하는 것이 더 좋습니다. –

답변

1

BinaryWriter가 MemoryStream에 의해 백업된다는 것을 항상 알고 있습니까?

그렇다면 MemoryStream에 대한 참조를 유지하거나 적절하게 BaseStream을 캐스팅 한 다음 MemoryStream.ToArray()을 사용하여 MemoryStream 내용의 바이트 배열을 가져옵니다.

+0

예, 항상 그렇습니다 memorystream에 의해 뒷받침된다. 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()를 사용하는 이유입니다. 자, 내가 backend 바이트 배열로 MemoryStream을 초기화해야하는지 아닌지 궁금하다. 'bool WriteAble'플래그가있는 과부하가 있음을 알고 있습니다. 이것을 설정해야합니까? 메모의 또 다른 포인트는 내가 그것에 쓸 때 memorystream의 길이가 증가한다는 것입니다 ... – bge0

0

해결했습니다. BinaryWriter의 현재 색인이 백엔드 스트림의 위치와 다른 것 같습니다! 당신은 당신이하지 않은

m_binaryWriter.Seek(0, SeekOrigin.Begin);