0

你能从 JEDI 代码库 (JCL) 中检测出档案是否受到 JclCompression 的密码保护吗?我想提取各种档案,但显然我不想显示密码提示,除非档案需要密码。我可以正确设置密码,只是无法检测存档是否需要密码。以下 SO 帖子显示了如何设置密码:

使用 Delphi 的 7-Zip?

可能该选项不存在,因为过程中有一个 TODO 似乎获取存档属性,例如ipEncrypted(来自 JCL 2.5):

procedure TJclDecompressItem.CheckGetProperty(
  AProperty: TJclCompressionItemProperty);
begin
  // TODO
end;
4

1 回答 1

3

如果存档中的项目已加密但文件名未加密,则只需调用 ListFiles 并在它返回后循环遍历项目并检查它们的Encrypted属性。如果其中任何一个为真,则提示用户输入密码并在之后分配。

如果文件名也被加密,那么不会,股票 JCL 发行版不支持事先检测。我在 github 上有一个 JCL的分支,sevenzip_error_handling分支包含一堆增强/修复TJclCompressionArchive,包括添加一个OnOpenPassword在文件名被加密时调用的回调。这样,基本负载如下所示:

type
  TMyObject = class
  private
    FArchive: TJcl7zDecompressArchive;
    FEncryptedFilenames: Boolean;
    procedure GetOpenPassword(Sender: TObject;
      var APassword: WideString): Boolean;
  public
    procedure OpenArchive;
  end;

...

procedure TMyObject.GetOpenPassword(Sender: TObject;
  var APassword: WideString): Boolean;
var
  Dlg: TPasswordDialog;
begin
  Dlg := TPasswordDialog.Create(nil);
  try
    Result := Dlg.ShowModal = mrOk;
    if Result then
    begin
      FEncryptedFilenames := True;
      FArchive.Password := Dlg.Password;
    end;
  finally
    Dlg.Free;
  end;        
end;

...

procedure TMyObject.OpenArchive;
begin
  FArchive := TJcl7zUpdateArchive.Create(Filename);
  FArchive.OnOpenPassword := GetOpenPassword;
  while True do
  begin
    FEncryptedFilenames := False;
    try
      FArchive.ListFiles;
      Break;
    except
      on E: EJclCompressionFalse do
        if FEncryptedFilenames then
          // User probably entered incorrect password, loop
        else
          raise;
    end;
  end;
end;
于 2014-02-14T19:17:39.057 回答