您能否从JEDI代码库(JCL)中检测存档是否受JclCompression密码保护?我想提取各种档案,但显然我不想显示密码提示,除非档案需要密码。我可以正确设置密码,只是不检测存档是否需要密码。以下SO帖子显示了如何设置密码:
该选项可能不存在,因为在该过程中有一个TODO似乎可以获取归档属性,例如ipEncrypted
(来自JCL 2.5):
procedure TJclDecompressItem.CheckGetProperty(
AProperty: TJclCompressionItemProperty);
begin
// TODO
end;
答案 0 :(得分:3)
如果存档中的项目已加密但文件名不是,则只需调用ListFiles,然后返回项目循环并检查其Encrypted
属性。如果其中任何一个为真,则提示用户输入密码并在之后进行分配。
如果文件名也被加密,那么库存JCL发行版不支持事先检测到。我有一个fork of the JCL on github, 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;