2012-01-17 18 views
7

क्या ऐसी सुविधाओं के साथ कोई ज़िप घटक हैं? मुझे इंटरनेट से एक स्ट्रीम में एक ज़िप संग्रह डाउनलोड करने की आवश्यकता है, फिर स्ट्रीम से संग्रह खोलने के लिए और फिर फ़ाइलों को किसी अन्य स्ट्रीम में निकालने के लिए।डेल्फी: स्ट्रीम से एक ज़िप संग्रह खोलें -> एक स्ट्रीम में निकालें

उदा। ज़िपफोर्ज स्ट्रीम ZipForge.OpenArchive(MyStream, false); से एक संग्रह खोल सकता है लेकिन किसी अन्य को निकालने के लिए कैसे ...?

procedure ExtractToStream(FileName: WideString; Stream: TStream); 

विवरण

उपयोग ExtractToStream TFileStream, TMemoryStream या TBlobStream की तरह एक TStream वंशज वस्तु को संग्रहण के भीतर फ़ाइल में संग्रहीत डेटा को संपीड़ित।

फ़ाइल नाम पैरामीटर निकाला जा रहा फ़ाइल नाम निर्दिष्ट करता है।

और क्या OpenArchive(MyStream, false) पद्धति के उपयोग करता है, तो निष्कर्षण समर्थित नहीं है ...

उत्तर

19

ज़िप फ़ाइल घटक है कि XE2 में बनाया गया है यह कर देगा।

एक ओवरलोडेड Open विधि है जो TStream को इसके इनपुट पैरामीटर के रूप में प्राप्त करती है।

व्यक्तिगत फ़ाइलों को निकालने के लिए आप उस फ़ाइल के नाम को पारित करने के लिए एक अधिभारित Read विधि को कॉल कर सकते हैं जिसे आप निकालना चाहते हैं। निकाली गई फ़ाइल को TStream के नए उदाहरण के रूप में वापस कर दिया गया है। आप निकालने वाली फ़ाइल को अपनी स्ट्रीम में स्थानांतरित करने के लिए उस उदाहरण पर CopyFrom का उपयोग कर सकते हैं।

var 
    ZipFile: TZipFile; 
    DownloadedStream, DecompressionStream, MyStream: TStream; 
    LocalHeader: TZipHeader; 
... 
ZipFile := TZipFile.Create; 
try 
    ZipFile.Open(DownloadedStream, zmRead); 
    ZipFile.Read('myzippedfile', DecompressionStream, LocalHeader); 
    try 
    MyStream.CopyFrom(DecompressionStream, DecompressionStream.Size); 
    finally 
    DecompressionStream.Free; 
    end; 
finally 
    ZipFile.Free; 
end; 

ध्यान दें कि मैं इस कोड का परीक्षण नहीं किया गया है, मैं सिर्फ यह TZipFile के लिए स्रोत कोड और प्रलेखन है कि स्रोत कोड में निहित के आधार पर लिखा है। इसमें कुछ झुर्रियाँ हो सकती हैं लेकिन यदि कोड विज्ञापित के रूप में व्यवहार करता है तो यह आपकी आवश्यकताओं को पूरी तरह से पूरा करता है।


ठीक है, अब मैंने इसका परीक्षण किया क्योंकि मैं उत्सुक था।

program ZipTest; 

{$APPTYPE CONSOLE} 

uses 
    System.SysUtils, 
    System.Classes, 
    System.Zip; 

procedure ExtractToFile(
    const ZipFileName: string; 
    const ZippedFileIndex: Integer; 
    const ExtractedFileName: string 
); 
var 
    ZipFile: TZipFile; 
    DownloadedStream, DecompressionStream, OutputStream: TStream; 
    LocalHeader: TZipHeader; 
begin 
    DownloadedStream := TFileStream.Create(ZipFileName, fmOpenRead); 
    try 
    ZipFile := TZipFile.Create; 
    try 
     ZipFile.Open(DownloadedStream, zmRead); 
     ZipFile.Read(ZippedFileIndex, DecompressionStream, LocalHeader); 
     try 
     OutputStream := TFileStream.Create(ExtractedFileName, fmCreate); 
     try 
      OutputStream.CopyFrom(DecompressionStream, DecompressionStream.Size); 
     finally 
      OutputStream.Free; 
     end; 
     finally 
     DecompressionStream.Free; 
     end; 
    finally 
     ZipFile.Free; 
    end; 
    finally 
    DownloadedStream.Free; 
    end; 
end; 

begin 
    try 
    ExtractToFile('C:\desktop\test.zip', 0, 'C:\desktop\out.txt'); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

ध्यान दें कि मैं फ़ाइल नाम के बजाय सूचकांक द्वारा निकाले के बाद से वह मेरे लिए और अधिक सुविधाजनक था: यहाँ कार्यक्रम से पता चलता है कि उस के रूप में यह सब काम करता है विज्ञापित है। और मैंने मेमोरी स्ट्रीम की बजाय फ़ाइल स्ट्रीम का उपयोग किया जो मुझे लगता है कि आप इसका उपयोग करेंगे। हालांकि, TZipFile विधियों TStream के साथ काम करते हैं, इसलिए मुझे यकीन है कि कोड किसी भी रूप की धाराओं के साथ काम करेगा।


यह ज़िप फ़ाइलों के बारे में प्रश्नों की एक श्रृंखला में नवीनतम है। मुझे पता है कि आप XE2 का उपयोग कर रहे हैं और मुझे आश्चर्य है कि आप XE2 प्रदान किए गए ज़िप वर्ग में निर्मित क्यों उपयोग करने के लिए अनिच्छुक प्रतीत होते हैं। मैंने यह इंगित करने के लिए कुछ भी नहीं देखा है कि यह आपकी आवश्यकताओं को पूरा नहीं करेगा। असल में, यह धाराओं के साथ सीधे काम करने की क्षमता है जो मुझे महसूस करती है कि इसमें किसी भी आवेदन के लिए पर्याप्त सामान्यता है।

+1

धन्यवाद बहुत डेविड !!! – maxfax

+0

मुझे रीड विधि (मैंने तेज़ी से जांच की) नहीं देखा, इसके बारे में शुद्ध जानकारी http://docwiki.embarcadero.com/VCL/en/System.Zip.TZipFile है। – maxfax

+0

@maxfax पढ़ें डेल्फी का क्या संस्करण है? मुझे प्रो मिल गया है और यह स्रोत के साथ आता है। आपके हाल के ज़िप प्रश्नों के मेरे उत्तर पूरी तरह से स्रोत पढ़ने पर आधारित हैं। मैं ज़िप फ़ाइलों के बारे में कुछ भी नहीं जानता और इस घटक के बारे में कुछ भी नहीं जानता। यदि आपके पास सोर्स कोड है तो मुझे लगता है कि यह आपके लिए एक बड़ी मदद होगी। –