ज़िप फ़ाइल घटक है कि 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 प्रदान किए गए ज़िप वर्ग में निर्मित क्यों उपयोग करने के लिए अनिच्छुक प्रतीत होते हैं। मैंने यह इंगित करने के लिए कुछ भी नहीं देखा है कि यह आपकी आवश्यकताओं को पूरा नहीं करेगा। असल में, यह धाराओं के साथ सीधे काम करने की क्षमता है जो मुझे महसूस करती है कि इसमें किसी भी आवेदन के लिए पर्याप्त सामान्यता है।
धन्यवाद बहुत डेविड !!! – maxfax
मुझे रीड विधि (मैंने तेज़ी से जांच की) नहीं देखा, इसके बारे में शुद्ध जानकारी http://docwiki.embarcadero.com/VCL/en/System.Zip.TZipFile है। – maxfax
@maxfax पढ़ें डेल्फी का क्या संस्करण है? मुझे प्रो मिल गया है और यह स्रोत के साथ आता है। आपके हाल के ज़िप प्रश्नों के मेरे उत्तर पूरी तरह से स्रोत पढ़ने पर आधारित हैं। मैं ज़िप फ़ाइलों के बारे में कुछ भी नहीं जानता और इस घटक के बारे में कुछ भी नहीं जानता। यदि आपके पास सोर्स कोड है तो मुझे लगता है कि यह आपके लिए एक बड़ी मदद होगी। –