yapacak XE2'de yerleşik zip dosyası bileşeni.
Giriş parametreleri olarak bir TStream
alan aşırı yüklenmiş Open
yöntemi var.
Tek tek dosyaları ayıklamak için, ayıklamak istediğiniz dosyanın adını geçirerek aşırı yüklenmiş bir Read
yöntemini çağırabilirsiniz. Ayıklanan dosya TStream
'un yeni bir örneği olarak döndürülür. Ayıklanan dosyayı akışınıza aktarmak için bu örnekte CopyFrom
kullanabilirsiniz. Bu kodu test ettik
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;
Not Sadece TZipFile
için kaynak kodu ve bu kaynak kodunda bulunan belgelere dayanarak yazdım. Bu konuda birkaç kırışıklık olabilir, ancak kod reklamı yapılan gibi davrandığında ihtiyaçlarınızı mükemmel bir şekilde karşılar.
Tamam, şimdi test ettim çünkü merak ediyordum. bu benim için daha uygun olduğu için ben indeksi yerine dosya adına göre çıkarılan
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.
Not: Burada bu tüm eserler reklamı gösterir program. Ve kullanacağını hayal ettiğim bellek akışları yerine dosya akışları kullandım. Ancak, TZipFile
yöntemleri, TStream
ile çalıştığından, kodun herhangi bir form akışıyla çalışacağından emin olabilirim.
Bu, ZIP dosyaları hakkında bir dizi soru ile ilgilidir. XE2 kullandığınızı biliyorum ve neden XE2'nin sağladığı yerleşik ZIP sınıfını kullanmakta isteksiz davrandığını merak ediyorum. Gereksinimlerinizi karşılamayacağını belirtmek için hiçbir şey görmedim. Aslında, herhangi bir uygulama için yeterli genelliğe sahip olduğumu hissettiren akışlarla doğrudan çalışabilme yeteneğidir.
Çok teşekkürler David !!! – maxfax
Okuma yöntemini (hızlıca kontrol ettim) görmedim, bunun hakkında saf bilgi var http://docwiki.embarcadero.com/VCL/en/System.Zip.TZipFile.Oku – maxfax
@maxfax Delphi'nin hangi sürümü var? Pro'yu aldım ve bu kaynakla geliyor. Son ZIP sorularınızın her ikisine de cevaplarım tamamen kaynağı okumaya dayanıyor. ZIP dosyaları hakkında hiçbir şey bilmiyorum ve bu bileşenle ilgili hiçbir şey bilmiyorum. Kaynak kodunuz varsa o zaman size büyük bir yardımcı olacak. –