JEDI JCL 压缩库不会打开跨区存档文件

Posted

技术标签:

【中文标题】JEDI JCL 压缩库不会打开跨区存档文件【英文标题】:JEDI JCL Compression library wont open spanned archive files 【发布时间】:2011-07-04 02:09:46 【问题描述】:

总结:

我无法让 JCL 压缩库打开任何跨区存档。 它显示了 borlands 'windows.pas' 中定义的错误“(0000001) Incorrect Function”;

场景:

使用 JCL 压缩示例压缩的单个存档。 - 将在 JCL 示例和 7zip gui 中解压缩。

使用 JCL 压缩示例压缩超过 7 个文件的跨区存档。 - 将仅在 7zip gui 中解压缩。使用 JCL 示例解压失败。

使用 7zip gui 压缩的单个存档。 - 将在 JCL 示例和 7zip gui 中解压缩。

使用 7zip gui 压缩超过 7 个文件的跨区存档。 - 将仅在 7zip gui 中解压缩。使用 JCL 解压失败

额外信息

JCL 压缩演示是 JCL 库中包含的演示。 JCL:2.2.1.3970 7zip dll:9.20.0.0 和 9.65.0.0 跨区存档集中的示例文件名:“Test Archive.7z.002” 尝试使用 .tar 和 .7z 压缩 使用了不同的文件大小。 2048 字节和 2048KB 德尔福 2009.

这是我正在使用的代码。 它来自 JCL 压缩演示。 'TJclDecompressArchive(FArchive).ListFiles' 行发生错误。

procedure TFormMain.ActionOpenROExecute(Sender: TObject);
var
  ArchiveFileName, Password: string;
  AFormat: TJclDecompressArchiveClass;
  SplitArchive: Boolean;
begin
  if OpenDialogArchiveRO.Execute then
  begin
    CloseArchive;

ArchiveFileName := OpenDialogArchiveRO.FileName;
SplitArchive := AnsiSameText(ExtractFileExt(ArchiveFileName), '.001');
if SplitArchive then
  ArchiveFileName := ChangeFileExt(ArchiveFileName, '');

AFormat := GetArchiveFormats.FindDecompressFormat(ArchiveFileName);

if AFormat <> nil then
begin
  if SplitArchive then
    ArchiveFileName := ArchiveFileName + '.%.3d';

  InputQuery('Archive password', 'Value', Password);

  FArchive := AFormat.Create(ArchiveFileName, 0, SplitArchive);
  FArchive.Password := Password;
  FArchive.OnProgress := ArchiveProgress;

  if FArchive is TJclDecompressArchive then
    TJclDecompressArchive(FArchive).ListFiles
  else
  if FArchive is TJclUpdateArchive then
    TJclUpdateArchive(FArchive).ListFiles;

  ListView1.Items.BeginUpdate;
  try
    while ListView1.Items.Count < FArchive.ItemCount do
      ListView1.Items.Add;
  finally
    ListView1.Items.EndUpdate;
  end;
end
else
  ShowMessage('not a supported format');
  end;
end;

JCL 示例确实知道文件并打开它们。 (图像中使用的 zip 格式。同样的问题)。

也许有人以前遇到过这种情况? 谁能指出我正确的方向吗? 感谢您抽出宝贵时间。

斯科特 M.

【问题讨论】:

FArchive 的类名是什么。方法TxxxDecompressArchive.ListFiles哪里出现异常? @Lieven 异常来自procedure TJclSevenzipDecompressArchive.OpenArchiveSevenzipCheck() 调用。 【参考方案1】:

Project JEDI - 问题跟踪器中存在此错误。

http://issuetracker.delphi-jedi.org/bug_view_advanced_page.php?bug_id=5137

两种可能的解决方法

将您的 JCL 安装升级到 latest daily build

procedure TJclSevenzipDecompressArchive.OpenArchive;JclCompression.pas 中注释以下行并重建包。

// 注释这一行! SevenzipCheck(InArchive.Open(AInStream, @MaxCheckStartPosition, OpenCallback));

【讨论】:

以上是关于JEDI JCL 压缩库不会打开跨区存档文件的主要内容,如果未能解决你的问题,请参考以下文章

Delphi JCL JEDI使用

zip -9 压缩不会减小文件大小

使用 javascript 压缩文件 - 损坏的存档

使用 MiniZip 库读取 omni.jar 存档文件

bundle文件压缩库的使用

JclUnicode.pas(8000行),JclAnsiStrings.pas(4000行),JclWideStrings.pas(2300行),JclStrings.pas(5400行),JclC