2008-09-16 19 views

答えて

26

リリース1.102では、JEDI Code Libraryはユニットに組み込まれた7-Zipをサポートしています。しかし、まだそれを自分で使用していない。

1

zipとunzipにのみ7Zipを使用する場合は、TZipコンポーネントを参照してください。 私は自分自身の目的のために小さなラッパーを書いています。これはZipper.pasファイルにありますので、気軽に再利用してください。

+0

。それ以外の場合は、ピンチのビットです。 300メガバイトのジップを作ってから、その300メガバイトのジップを90個ジップしてTZipの別のジップに入れてみると面白い時間があります。 –

23

JEDIコードライブラリの多くと同様に、オリバーギーゼンの答えを拡張し、私はまともなドキュメントを見つけることができませんでしたが、これは私の作品:

uses 
    JclCompression; 

procedure TfrmSevenZipTest.Button1Click(Sender: TObject); 
const 
    FILENAME = 'F:\temp\test.zip'; 
var 
    archiveclass: TJclDecompressArchiveClass; 
    archive: TJclDecompressArchive; 
    item: TJclCompressionItem; 
    s: String; 
    i: Integer; 
begin 
    archiveclass := GetArchiveFormats.FindDecompressFormat(FILENAME); 

    if not Assigned(archiveclass) then 
     raise Exception.Create('Could not determine the Format of ' + FILENAME); 

    archive := archiveclass.Create(FILENAME); 
    try 
     if not (archive is TJclSevenZipDecompressArchive) then 
     raise Exception.Create('This format is not handled by 7z.dll'); 

     archive.ListFiles; 

     s := Format('test.zip Item Count: %d'#13#10#13#10, [archive.ItemCount]); 

     for i := 0 to archive.ItemCount - 1 do 
     begin 
     item := archive.Items[i]; 
     case item.Kind of 
      ikFile: 
       s := s + IntToStr(i+1) + ': ' + item.PackedName + #13#10; 
      ikDirectory: 
       s := s + IntToStr(i+1) + ': ' + item.PackedName + '\'#13#10;//' 
     end; 
     end; 

     if archive.ItemCount > 0 then 
     begin 
//   archive.Items[0].Selected := true; 
//   archive.ExtractSelected('F:\temp\test'); 

     archive.ExtractAll('F:\temp\test'); 
     end; 

     ShowMessage(s); 
    finally 
     archive.Free; 
    end; 
end; 
4

Delphiは今持っていますXE2でTZipFileとネイティブ、クロスプラットフォームのzipサポート:

How to extract zip files with TZipFile in Delphi XE2 and FireMonkey

+0

リンクが無効です。しかし、これは、おそらく、助けることができます。 http://docwiki.embarcadero.com/Libraries/XE2/en/System.Zip.TZipFile – EMBarbosa

+1

これはLZMA圧縮アーカイブをサポートしていません – kbickar

0

私は多くのソリューションを試してみましたが、問題があった、これは働いていました。

ダウンロードhttps://github.com/zedalaye/d7zip 7z.dllとsevenzip.pasをプロジェクトdiroctoryにコピーし、プロジェクトにsevenzip.pasを追加します。

次にあなたが解凍し、これを使用することができます。

using sevenzip; 

procedure Unzip7zFile (zipFullFname:string); 
    var 
    outDir:string; 
    begin 
    with CreateInArchive(CLSID_CFormat7z) do 
    begin 
     OpenFile(zipFullFname); 
     outDir := ChangeFileExt(zipFullFname, ''); 
     ForceDirectories (outDir); 
     ExtractTo(outDir); 
    end; 
    end; 

使用法:すべての圧縮されたオブジェクトがメモリに収まる場合は正常に動作しますTZip

Unzip7zFile(ExtractFilePath(Application.ExeName) + 'STR_SI_FULL_1000420.7z'); 
関連する問題