2010-06-05 2 views
10

Я хочу скопировать часть FileStream в поток памяти.Delphi, FileStream и MemoryStream

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

Это правильно? это не работает для меня.

+5

Чтобы отформатировать код, выделите его в редакторе и нажмите Control-K. –

ответ

15

Вы должны читать() из FileStream в отдельный буфер, а затем Write(), что в MemoryStream, а именно:

var 
    Buffer: PByte; 

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

Поскольку вы имеете дело с двумя объектами TStream, было бы легче используйте вместо этого метод TStream.CopyFrom(), то есть:

MemoryStream.CopyFrom(FileStream, NumberOfBytes); 
+2

Спасибо большое! Я использовал CopyFrom, но я думаю, что ваш solutin даст мне лучшую производительность. Еще раз спасибо. –

+0

Метод TStream.CopyFrom() использует аналогичный подход «читать-в-буфере-чем-писать-внутри», но делает это с большей обработкой ошибок и управлением буферами, чем показанный мной. –

+0

ReadBuffer следует использовать, когда количество прочитанных байтов известно и исправлено, лучше использовать Read - он может фактически вернуть меньше байтов, чем размер буфера, когда их больше нет. Я бы написал: BytesRead: = FileStream.Read (Buffer ^, NumberOfBytes); MemoryStream.Write (Buffer ^, BytesRead); – 2010-06-16 07:49:21

Смежные вопросы