如果存档中的项目已加密但文件名未加密,则只需调用 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;