7-zip Delphi API

官网已经找不到了。
这个地址比较新
https://github.com/zedalaye/d7zip
在这个基础上 融合了 SevenZip.pas BUG修改版 - 20160613 - 堕落恶魔 - 博客园 https://www.cnblogs.com/hs-kill/p/3876160.html 然后再加了一些小的修改。 最后,提供一个比较全面的 例子。 Delphi】从内存读取或解压压缩文件(RARZIPTARGZIP等)(一) - 峋山隐修会 - 博客园 http://www.cnblogs.com/caibirdy1985/archive/2013/05/13/4232949.html Delphi】从内存读取或解压压缩文件(RARZIPTARGZIP等)(二) - 峋山隐修会 - 博客园 http://www.cnblogs.com/caibirdy1985/archive/2013/05/14/4232948.html 7-zip Delphi API This API use the 7-zip dll (7z.dll) to read and write all 7-zip supported archive formats. - Autor: Henri Gourvest <hgourvest@progdigy.com> - Licence: MPL1.1 - Date: 15/04/2009 - Version: 1.2 Reading archive: Extract to path: 解压到目录: with CreateInArchive(CLSID_CFormatZip) do begin OpenFile('c:\test.zip'); ExtractTo('c:\test'); end; Get file list: 获取文件列表: with CreateInArchive(CLSID_CFormat7z, 'Formats\7z.dll') do begin OpenFile('c:\test.7z'); for i := 0 to NumberOfItems - 1 do if not ItemIsFolder[i] then Writeln(ItemPath[i]); end; Extract to stream 解压到流: with CreateInArchive(CLSID_CFormat7z) do begin OpenFile('c:\test.7z'); for i := 0 to NumberOfItems - 1 do if not ItemIsFolder[i] then ExtractItem(i, stream, false); end; Extract "n" Items 解压多项目: function GetStreamCallBack(sender: Pointer; index: Cardinal; var outStream: ISequentialOutStream): HRESULT; stdcall; begin case index of ... outStream := T7zStream.Create(aStream, soReference); Result := S_OK; end; procedure TMainForm.ExtractClick(Sender: TObject); var i: integer; items: array[0..2] of Cardinal; begin with CreateInArchive(CLSID_CFormat7z) do begin OpenFile('c:\test.7z'); // items must be sorted by index! items[0] := 0; items[1] := 1; items[2] := 2; ExtractItems(@items, Length(items), false, nil, GetStreamCallBack); end; end; Open stream 打开流: with CreateInArchive(CLSID_CFormatZip) do begin OpenStream(T7zStream.Create(TFileStream.Create('c:\test.zip', fmOpenRead), soOwned)); OpenStream(aStream, soReference); ... end; Progress bar 进度条回调: function ProgressCallback(sender: Pointer; total:boolean; value: int64): HRESULT; stdcall;beginif total thenMainform.ProgressBar.Max:= value elseMainform.ProgressBar.Position:= value;Result:= S_OK;end; procedure TMainForm.ExtractClick(Sender:TObject);beginwithCreateInArchive(CLSID_CFormatZip)dobeginOpenFile('c:\test.zip');SetProgressCallback(nil,ProgressCallback);...end;end;Password打开含有密码的文件:functionPasswordCallback(sender:Pointer;var password:WideString): HRESULT; stdcall;begin// call a dialog box ... password :='password';Result:= S_OK;end; procedure TMainForm.ExtractClick(Sender:TObject);beginwithCreateInArchive(CLSID_CFormatZip)dobegin// using callbackSetPasswordCallback(nil,PasswordCallback);// or setting password directlySetPassword('password');OpenFile('c:\test.zip');...end;end;Writing archive 压缩存档: procedure TMainForm.ExtractAllClick(Sender:TObject);varArch: I7zOutArchive;beginArch:=CreateOutArchive(CLSID_CFormat7z);// add a fileArch.AddFile('c:\test.bin','folder\test.bin');// add files using willcards and recursive searchArch.AddFiles('c:\test','folder','*.pas;*.dfm',true,true);// add a streamArch.AddStream(aStream, soReference, faArchive,CurrentFileTime,CurrentFileTime,'folder\test.bin',false,false);// compression levelSetCompressionLevel(Arch,5);// compression method if <> LZMASevenZipSetCompressionMethod(Arch, m7BZip2);// add a progress bar ...Arch.SetProgressCallback(...);// set a password if necessaryArch.SetPassword('password');// Save to fileArch.SaveToFile('c:\test.zip');// or a streamArch.SaveToStream(aStream);end;

猜你喜欢

转载自www.cnblogs.com/h2zZhou/p/12503965.html