avr schrieb:
> An dieser Lösung gefällt mir nicht, dass kurzzeitig die Daten doppelt im
> Ram stehen, d.h. das Programm benötigt doppelt so viel Speicher. Und
> Große Wave-Dateien im Ram sind sowieso schon recht groß.
Für solche Infos gibt's die MSDN Doku. ;-) Dort steht ganz klar:
GetBytes() liefert den über die Konstruktoren übergebenen bzw. den
intern erzeugten Buffer falls keiner übergeben wurde. Dagegen liefert
ToArray eine Kopie des Buffers. Bei GetBuffer ist allerdings das
Problem, dass der dieser i.d.R. größer ist, als er Daten enthält. Das
läßt sich aber durch die Properties Position bzw. Length lösen.
Alle anderen Lösungen mit Stream offen halten usw. sind Krampf, da man
bei IDisposable-Objekten (also u.a. bei Streams) unbedingt dafür Sorge
tragen muss, dass diese ordnungsgemäß Disposed werden. Das geht
idealerweise so:
1 | byte[] memoryBuffer;
|
2 | long memoryBufferLength;
|
3 | using (var memStream = new MemoryStream(...))
|
4 | {
|
5 | ...
|
6 | // irgendwas mit memStream veranstalten
|
7 | ...
|
8 | memoryBuffer = memStream.GetBiffer();
|
9 | memoryBufferLength = memStream.Position; // wenn Position am Ende des Stream ist!
|
10 | }
|
11 | ...
|
12 | // hier kann man dann das Byte-Array weiterverarbeiten
|
13 | // und z.B. einen neuen MemoryStream erzeugen
|
14 | using(var memStream = new MemoryStream(memoryBuffer,0,memoryBufferLength))
|
15 | {
|
16 | ...
|
17 | }
|
Viel Erfolg!
Markus