2010-06-05 20 views
10

Quiero copiar una parte de un FileStream a una secuencia de memoria.Delphi, FileStream y MemoryStream

FileStream.Write(Pointer(MemoryStream)^, MemoryStream.Size); 
FileStream.Read(Pointer(MemoryStream)^, count); 

¿Es eso correcto? no funciona para mí

+5

para formatear su código, selecciónelo en el editor y presione Control-K. –

Respuesta

15

usted tiene que leer() desde el FileStream en un búfer separado y luego escribir() que a la MemoryStream, es decir:

var 
    Buffer: PByte; 

GetMem(Buffer, NumberOfBytes); 
try 
    FileStream.ReadBuffer(Buffer^, NumberOfBytes); 
    MemoryStream.WriteBuffer(Buffer^, NumberOfBytes); 
finally 
    FreeMem(Buffer); 
end; 

Dado que se trata de dos objetos TStream, sería más fácil utilice el método TStream.CopyFrom() en su lugar, es decir:

MemoryStream.CopyFrom(FileStream, NumberOfBytes); 
+2

¡Muchas gracias! Usé el CopyFrom, pero creo que tu solución me dará un mejor rendimiento. Gracias de nuevo. –

+0

el método TStream.CopyFrom() utiliza un enfoque similar de lectura en memoria intermedia que escritura internamente, pero lo hace con más manejo de errores y gestión de búfer de lo que mostré. –

+0

Se debe usar ReadBuffer cuando se conoce y se repara el número de bytes que se deben leer, mejor para leer: en realidad puede devolver menos bytes que el tamaño del búfer cuando ya no hay más. Escribiría: BytesRead: = FileStream.Read (Buffer ^, NumberOfBytes); MemoryStream.Write (Buffer ^, BytesRead); –