2010-06-05 19 views
10

मैं एक फ़ाइल स्ट्रीम के एक भाग को स्मृति स्ट्रीम में कॉपी करना चाहता हूं।डेल्फी, फ़ाइलस्ट्रीम और मेमोरीस्ट्रीम

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

क्या यह सही है? यह मेरे लिए काम नहीं कर रहा है।

+5

अपने कोड को प्रारूपित करने के लिए, इसे संपादक में चुनें और नियंत्रण-K दबाएं। –

उत्तर

15

आप()) MemoryStream के लिए एक अलग बफर में FileStream से पढ़ने के लिए और उसके बाद लिखें (कि है अर्थात्:

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 का उपयोग किया, लेकिन मुझे लगता है कि आपका सोल्यूटिन मुझे बेहतर प्रदर्शन देगा। फिर से धन्यवाद। –

+0

TStream.CopyFrom() विधि एक समान रीड-इन-बफर-से-लिखने-आंतरिक रूप से दृष्टिकोण का उपयोग करती है, लेकिन जो मैंने दिखाया उससे अधिक त्रुटि प्रबंधन और बफर प्रबंधन के साथ ऐसा करता है। –

+0

रीडबफर का उपयोग तब किया जाना चाहिए जब पढ़ने के बाइट्स की संख्या ज्ञात और तय की जाती है, उपयोग करने के लिए बेहतर पढ़ें - यह वास्तव में बफर आकार की तुलना में कम बाइट्स लौटा सकता है जब और नहीं होता है। मैं लिखूंगा: बाइट्स रीड: = फाइलस्ट्रीम। पढ़ें (बफर ^, संख्याऑफबाइट्स); मेमोरीस्ट्रीम। राइट (बफर ^, बाइट्स रीड); –

संबंधित मुद्दे