ZipForge本机错误

时间:2011-08-24 06:20:18

标签: delphi archive

我遇到问题的档案都是通过将工作档案与不存在的档案合并而创建的,从而有效地将一个档案的内容复制到另一个档案。这是我们合并过程的一部分。像这样......

ZipDestination := TZipForge.Create(nil);
if FileExists(DestinationZipFileName) then
  ZipDestination.OpenArchive(fmOpenReadWrite + fmShareDenyWrite)
else
  ZipDestination.OpenArchive(fmCreate);

ZipDestination.Zip64Mode := zmAuto;
ZipDestination.MergeWith(SourceZipFileName);
ZipDestination.CloseArchive;

这是从存档中获取blob,解压缩并为查看器做好准备的代码。

CompressedStream := TMemoryStream.Create;
UnCompressedStream := TMemoryStream.Create;
GetCompressedStream(CompressedStream);  // this fetches the blob from the zipfile
ZipForge.InMemory := True;
// Native Error 00035 on next line (sometimes)
ZipForge.OpenArchive(CompressedStream, False);  
ZipForge.FindFirst('*.*', ArchiveItem, faAnyFile - faDirectory);
sZipFileName := ArchiveItem.FileName;
sZipPath := ArchiveItem.StoredPath;
ZipForge.ExtractToStream(sZipPath + sZipFileName, UnCompressedStream);
ZipForge.CloseArchive;

但我遇到“原生错误00035”有时

现在奇怪的是,当我尝试查看合并存档中的第一个blob时,我收到了这些错误(即,尝试查看合并存档中的其他blob不会引发任何例外)

可能是ZipForge.MergeWith的东西,我没有提供,或者它可能是我的GetCompressedStream中的一个错误(但是如果我在存档中切换blob的顺序,它总是发生在第一个) 。 看起来是时候让测试项目看看到底发生了什么。

修改

原始问题只是要求就这些原生错误提供指导,对此我对我选择的答案感到满意。至于我的问题,我确信这是我在传入OpenArchive的CompressedStream的一个问题。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

原生错误00035是“无效的存档文件”。当ZipForge找不到本地或中央目录标题时(即,当您尝试打开非zip文件时),就会发生这种情况。

我认为它们没有记录在帮助中,但是ZFConst.pas中出现了本机错误到错误代码的转换表。有一个NativeToErrorCode表,它将“本机”错误转换为错误字符串数组中的索引。如果这还不足以告诉你问题是通过ZipForge.pas查看raise语句中的错误代码。他们始终使用完整的5位数代码,因此您可以搜索00035而不是35来避免虚假结果。