sevenzip.pas V1.2.1 Delphi压缩解压ZIP、7z、rar文件处理 2021-02-24 17:31:04

此API使用7-zip dll(7z.dll)读取和写入所有7-zip支持的存档格式。


BUG修改:

1.对于文件名中带有空格的文件, 无法压缩, 原因是1488行, 压缩调用的是TStringList.Delimiter 来拆分文件字符串, 而空格是默认分行符, 导致文件名错误

2.解压缩函数, 如果目标文件已存在并且为只读属性时, 报错, 原因是1105行 创建文件流的时候直接使用了TFileStream.Create(path, fmCreate)导致

3.解压缩函数, 解决如果是空文件夹不会被创建的问题


功能增加:

1.增加了一个WorkPath变量, 用于指定7z.dll文件的绝对路径

2.增加了一个解压缩过程中文件释放失败时的回调T7zProgressExceptCallback, 支持忽略/重试/取消


压缩文件:

procedure TFormMain.btnCompressClick(Sender: TObject);
var
  Arch: I7zOutArchive;
  Counter: Integer;
begin
  if OpenDialog.Files.Count = 0 then begin
    ShowMessage('请添加文件');
    Exit;
  end;
  memoOutput.Lines.Append('开始压缩');
  Arch := CreateOutArchive(CLSID_CFormat7z);
  Arch.SetProgressCallback(nil, ProgressCallback);
  for Counter := 0 to OpenDialog.Files.Count - 1 do
    Arch.AddFile(OpenDialog.Files[Counter], ExtractFileName(OpenDialog.Files[Counter]));
  SetCompressionLevel(Arch, 5);
  SevenZipSetCompressionMethod(Arch, T7zCompressionMethod.m7Deflate64);
  Arch.SaveToFile('.\test.7z');
  memoOutput.Lines.Append('完成压缩');
  Arch := nil;
end;



解压文件:

procedure TFormMain.btnExtractClick(Sender: TObject);
var
  Arch: I7zInArchive;
  Counter: Integer;
begin
  if not FileExists('.\test.7z') then begin
    ShowMessage('请先成生压缩文件');
    Exit;
  end;
  memoOutput.Lines.Append('开始解压缩');
  Arch := CreateInArchive(CLSID_CFormat7z);
  Arch.SetProgressCallback(nil, ProgressCallback);
  Arch.OpenFile('.\test.7z');
  for Counter := 0 to Arch.NumberOfItems - 1 do begin
    if not Arch.ItemIsFolder[Counter] then
      memoOutput.Lines.Append('包含文件:' + Arch.ItemPath[Counter]);
  end;
  if ForceDirectories('.\Extract') then begin
    Arch.ExtractTo('.\Extract');
    memoOutput.Lines.Append('完成解压缩');
    Arch := nil;
  end
  else
    ShowMessage('无法解压到指定目录');
end;


文件列表 大小
sevenzip.pas 58.88KB

文件下载