转自:https://blog.csdn.net/warrially/article/details/8039915
//7-zip Delphi API
//这个API使用了 7z.dll 并支持所有7z所支持的压缩算法和格式
- Autor: Henri Gourvest <hgourvest@progdigy.com>
- Licence: MPL1.1
- Date: 15/04/2009
- Version: 1.1
//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) 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;
begin
if total then
Mainform.ProgressBar.Max := value else
Mainform.ProgressBar.Position := value;
Result := S_OK;
end;
procedure TMainForm.ExtractClick(Sender: TObject);
begin
with CreateInArchive(CLSID_CFormatZip) do
begin
OpenFile('c:\test.zip');
SetProgressCallback(nil, ProgressCallback);
...
end;
end;
//Password(密码回调函数)
function PasswordCallback(sender: Pointer; var password: WideString): HRESULT; stdcall;
begin
// call a dialog box ...
password := 'password';
Result := S_OK;
end;
procedure TMainForm.ExtractClick(Sender: TObject);
begin
with CreateInArchive(CLSID_CFormatZip) do
begin
// using callback
SetPasswordCallback(nil, PasswordCallback);
// or setting password directly
SetPassword('password');
OpenFile('c:\test.zip');
...
end;
end;
//Writing archive( 添加文件并压缩)
procedure TMainForm.ExtractAllClick(Sender: TObject);
var
Arch: I7zOutArchive;
begin
Arch := CreateOutArchive(CLSID_CFormat7z);
// add a file(添加单个文件)
Arch.AddFile('c:\test.bin', 'folder\test.bin');
// add files using willcards and recursive search(添加文件,带通配符? * )
Arch.AddFiles('c:\test', 'folder', '*.pas;*.dfm', true);
// add a stream(添加流)
Arch.AddStream(aStream, soReference, faArchive, CurrentFileTime, CurrentFileTime, 'folder\test.bin', false, false);
// compression level(压缩率 0 - 5, 越大效果越好,时间越慢 )
SetCompressionLevel(Arch, 5);
// compression method if <> LZMA(压缩算法)
SevenZipSetCompressionMethod(Arch, m7BZip2);
// add a progress bar ...(进度条)
Arch.SetProgressCallback(...);
// set a password if necessary(密码)
Arch.SetPassword('password');
// Save to file
Arch.SaveToFile('c:\test.zip');
// or a stream
Arch.SaveToStream(aStream);
end;