Delphi JEDI JCL JCL压缩:检测受密码保护的存档

Delphi JEDI JCL JCL压缩:检测受密码保护的存档,delphi,passwords,archive,jedi,Delphi,Passwords,Archive,Jedi,您能否检测到一个存档文件是否受到来自绝地代码库(JCL)的JclCompression的密码保护?我想提取各种归档文件,但显然我不想显示密码提示,除非归档文件需要密码。我可以正确设置密码,但无法检测存档是否需要密码。以下SO帖子显示了如何设置密码: 该选项可能不存在,因为过程中出现了一个TODO,用于获取存档属性,例如ipEncrypted(来自JCL 2.5): 如果归档文件中的项目已加密,但文件名未加密,则只需调用ListFiles,然后在它返回对项目的循环并检查其加密的属性即可。如果其中

您能否检测到一个存档文件是否受到来自绝地代码库(JCL)的JclCompression的密码保护?我想提取各种归档文件,但显然我不想显示密码提示,除非归档文件需要密码。我可以正确设置密码,但无法检测存档是否需要密码。以下SO帖子显示了如何设置密码:

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


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

如果文件名也被加密了,那么不,股票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;

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

如果文件名也被加密了,那么不,股票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;

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

如果文件名也被加密了,那么不,股票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;

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

如果文件名也被加密了,那么不,股票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;


为什么你没有选择tpAbbrevia,类中最好的
JCL
是一个不正确的标记,它指的是完全不同的东西。@DavidHeffernan不支持7-Zip、RAR和7z.dll支持的许多其他东西,据我所知。为什么你没有选择tpAbbrevia,类中最好的
JCL
是一个不正确的标记,它指的是完全不同的东西。@DavidHeffernan不支持7-Zip、RAR和许多其他7z.dll支持的东西,据我所知。你为什么不选择tpAbbrevia,一流的
JCL
是一个不正确的标签,它指的是完全不同的东西。@DavidHeffernan不支持7-Zip、RAR,据我所知,7z.dll还支持很多其他功能。你为什么不选择tpAbbrevia,最好的
JCL
是一个不正确的标记,它指的是完全不同的东西。@DavidHeffernan不支持7-Zip、RAR和7z.dll支持的许多其他功能,据我所知。谢谢,我还没有尝试JCL fork,但是
TJclCompressionItem
Encrypted
属性是有效的。Craig终于能够尝试fork——它适用于我对文件名加密的密码保护档案的测试用例。非常感谢。谢谢,我还没有尝试JCL fork,但是
TJclCompressionItem
Encrypted
属性可以工作。Craig终于能够尝试使用该fork——它适用于我的密码保护档案测试案例,其中文件名是加密的。非常感谢。谢谢,我还没有尝试JCL fork,但是
TJclCompressionItem
Encrypted
属性可以工作。Craig终于能够尝试使用该fork——它适用于我的密码保护档案测试案例,其中文件名是加密的。非常感谢。谢谢,我还没有尝试JCL fork,但是
TJclCompressionItem
Encrypted
属性可以工作。Craig终于能够尝试使用该fork——它适用于我的密码保护档案测试案例,其中文件名是加密的。多谢。