2012-01-17 22 views
7

Bu tür özelliklere sahip sıkıştırılmış bileşenler var mı? İnternetten bir zip arşivini bir akışa indirmem, ardından arşivi akıştan açıp dosyaları başka bir akışa ayıklamam gerekiyor.Delphi: bir akıştan bir zip arşivi açın -> bir akışa ayıkla

E.g. ZipForge bir arşivden bir akış açabilir ZipForge.OpenArchive(MyStream, false); ancak başka birine nasıl ayıklanır ...?

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

Açıklama

Kullanım ExtractToStream TFileStream, TMemoryStream veya TBlobStream gibi TStream soyundan nesnesine arşiv içinde dosyasında saklanan veri sıkıştırmasını.

DosyaAdı parametresi, ayıklanan dosya adını belirtir.

Ve OpenArchive(MyStream, false) yöntemin kullanılması çıkarma desteklenmiyorsa

...

cevap

19

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.

+1

Çok teşekkürler David !!! – maxfax

+0

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

+0

@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. –