The archives I’m having trouble with were all created by merging a working archive with a non-existant archive, thereby effectively copying the contents of one into the other. It’s part of a merging process we do. Like this…
ZipDestination := TZipForge.Create(nil);
if FileExists(DestinationZipFileName) then
ZipDestination.OpenArchive(fmOpenReadWrite + fmShareDenyWrite)
else
ZipDestination.OpenArchive(fmCreate);
ZipDestination.Zip64Mode := zmAuto;
ZipDestination.MergeWith(SourceZipFileName);
ZipDestination.CloseArchive;
and this is the code that gets a blob from the archive, uncompresses it, and makes it ready for the viewer.
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;
but I’m encountering “Native error 00035” sometimes.
Now the strange thing is that I’m getting these errors when I try to view the first blob within the merged archive (ie. trying to view other blobs within the merged archive doesn’t raise any exception)
It could be something about ZipForge.MergeWith that I haven’t catered for, or it could be a bug in my GetCompressedStream (but if I switch the order of blobs within the archive, it always happens to the first one only). Look like it’s time for a test project to see what’s really going on.
EDIT
Original question was simply asking for guidance on these Native Errors, for which I’m satisfied with the answer I’ve chosen. As for my problem, well I’m convinced it’s an issue with the CompressedStream I’m passing into OpenArchive.
Native error 00035 is “Invalid archive file”. It occurs when ZipForge can’t find either the local or central directory headers (that is, when you try to open a file that isn’t a zip).
I don’t think they’re documented in the help, but the translation tables for native error to error code occur in ZFConst.pas. There’s a NativeToErrorCode table that converts from the “native” error into an index in the error string array. If that isn’t enough to tell you what the problem is just look through ZipForge.pas for the error code in a
raisestatement. They consistently use the full 5-digit code, so you can search for00035instead of just35to avoid spurious results.