2011-08-09 2 views
7

मैंने पहले TJcl7zCompressArchive/TJcl7zDecompressArchive का उपयोग आर्काइव ऑपरेशन करने के लिए किया था।क्या डेल्फी जेसीएल 7zCompression फ़ाइल ऑपरेशन के बिना इन-मेमोरी स्ट्रीम को संपीड़ित/डिकंप्रेस करने के लिए उपयोग किया जा सकता है?

अब मैं फ़ाइल ऑपरेशन के बिना सीधे मेमोरी स्ट्रीम को संपीड़ित/डिकंप्रेस करना चाहता हूं। हालांकि, जब वेब पर खोज रहे जेसीएल डेमो के उदाहरण देख रहे हैं, तो मुझे उस lib का उपयोग करने का कोई तरीका नहीं मिल रहा है। मुझे ऐसा करने के लिए अन्य टूल्स मिल गए लेकिन संपीड़न अनुपात 7zip जितना अच्छा नहीं लगता है।

कोई भी कुछ दिशा-निर्देश या नमूना कोड दे सकता है जो इसे प्राप्त करने के तरीके को दिखाता है। आपका बहुत बहुत धन्यवाद!

+0

7z dll आवरण धारा कार्यक्षमता या कॉलबैक किसी भी तरह शामिल हैं:

procedure _CompressStreamGZIP(const ASourceStream, ADestinationStream: TStream); var LArchive : TJclCompressArchive; begin ADestinationStream.Position := 0; ASourceStream.Position := 0; LArchive := TJclGZipCompressArchive.Create(ADestinationStream, 0, False); try LArchive.AddFile('..\Stream.0', ASourceStream, false); LArchive.Compress(); finally if (Assigned(LArchive)) then FreeAndNil(LArchive); end; end; 

धारा को संपीड़ित करने के लिए: एक धारा निम्नलिखित का उपयोग मैं सेक करने के लिए? –

+0

इंस्ट्रीम/आउटस्ट्रीम के साथ-साथ कुछ कॉलबैक ऑब्जेक्ट्स भी हैं। हालांकि, मैं यह नहीं समझ सकता कि उन उच्च स्तरीय उपलब्ध वस्तुओं का उपयोग किये बिना सीधे उनका उपयोग कैसे किया जा सकता है। – Justmade

उत्तर

10

मैं एक जीजेपीआईपी स्ट्रीम को संपीड़ित करने के लिए जेसीएल रैपर का उपयोग करता हूं - यह सुनिश्चित नहीं है कि यह केवल TJcl7ziCompresspArchive का उपयोग करके काम करेगा।

procedure _DecompressStreamGZIP(const ASourceStream, ADestinationStream : TStream); 
var 
    LArchive : TJclDecompressArchive; 
begin 
    ADestinationStream.Position := 0; 
    ASourceStream.Position := 0; 
    LArchive := TJclGZipDecompressArchive.Create(ASourceStream, 0, false); 

    try 
    LArchive.ListFiles(); 
    LArchive.Items[0].Stream := ADestinationStream; 
    LArchive.Items[0].OwnsStream := false; 
    LArchive.Items[0].Selected := True; 
    LArchive.ExtractSelected(); 
    finally 
    if (Assigned(LArchive)) then FreeAndNil(LArchive); 
    end; 
end; 
+0

बिल्कुल सही! मैंने गजिप को 7z में बदलने का परीक्षण किया और यह एक आकर्षण की तरह काम करता है! आपका बहुत बहुत धन्यवाद! – Justmade

+3

आपको TRY के बाहर TRY/FINALLY ब्लॉक में पहली तीन पंक्तियों को स्थानांतरित करना चाहिए। यदि क्रिएट कन्स्ट्रक्टर में कोई त्रुटि उत्पन्न होती है और अपवाद उठाया जाता है, तो लार्चीव को असाइन नहीं किया जाता है (और शून्य नहीं है) और फिर आप एक आवंटित क्लास इंस्टेंस को रिलीज़ करने का प्रयास करते हैं। हमेशा ट्रस्ट/अंतिम रूप से ब्लॉक करने से पहले कन्स्ट्रक्टर को कॉल करें। इसके अलावा - आपको FreeAndNIL को कॉल करते समय असाइन किए गए (LArchive) के लिए परीक्षण करने की आवश्यकता नहीं है, क्योंकि यह परीक्षण FreeAndNIL प्रक्रिया के अंदर किया जाता है। – HeartWare

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

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