2010-06-05 33 views
10

Tôi muốn sao chép một phần của một FileStream vào luồng bộ nhớ.Delphi, FileStream và MemoryStream

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

Có đúng không? nó không làm việc cho tôi.

+5

để định dạng mã của bạn, chọn nó trong trình chỉnh sửa và nhấn Control-K. –

Trả lời

15

Bạn phải đọc() từ FileStream vào một bộ đệm riêng biệt và sau đó Viết() đó đến MemoryStream, ví dụ:

var 
    Buffer: PByte; 

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

Vì bạn đang đối phó với hai đối tượng TStream, nó sẽ dễ dàng hơn để sử dụng phương thức TStream.CopyFrom() để thay thế, ví dụ:

MemoryStream.CopyFrom(FileStream, NumberOfBytes); 
+2

Cảm ơn rất nhiều! Tôi đã sử dụng CopyFrom, nhưng tôi nghĩ solutin của bạn sẽ cho tôi hiệu suất tốt hơn. Cảm ơn bạn lần nữa. –

+0

Phương thức TStream.CopyFrom() sử dụng phương pháp đọc-vào-đệm-viết-viết-tương tự trong nội bộ tương tự, nhưng làm như vậy với việc xử lý lỗi và quản lý bộ đệm nhiều hơn những gì tôi đã trình bày. –

+0

ReadBuffer nên được sử dụng khi số byte để đọc được biết và cố định, tốt hơn để sử dụng Đọc - nó thực sự có thể trả lại ít byte hơn kích thước bộ đệm khi không còn nữa. Tôi muốn viết: BytesRead: = FileStream.Read (Buffer ^, NumberOfBytes); MemoryStream.Write (Bộ đệm ^, BytesRead); –