public override Stream GetEntry(string relativePath) { string resolvedPath = ZipLib.ResolvePath(relativePath); if (ZipLib.unzLocateFile(this.handle, resolvedPath, 0) != 0) { throw new ZipEntryNotFoundException("Entry not found:" + relativePath); } ZipEntryInfo entryInfo = new ZipEntryInfo(); int result = ZipLib.unzGetCurrentFileInfo(this.handle, out entryInfo, null, UIntPtr.Zero, null, UIntPtr.Zero, null, UIntPtr.Zero); if (result != 0) { throw new ZipException("Error while reading entry info: " + relativePath + " - Errorcode: " + result); } result = ZipLib.unzOpenCurrentFile(this.handle); if (result != 0) { throw new ZipException("Error while opening entry: " + relativePath + " - Errorcode: " + result); } byte[] buffer = new byte[entryInfo.UncompressedSize.ToUInt64()]; int bytesRead = 0; if ((bytesRead = ZipLib.unzReadCurrentFile(this.handle, buffer, (uint)entryInfo.UncompressedSize)) < 0) { throw new ZipException("Error while reading entry: " + relativePath + " - Errorcode: " + result); } result = ZipLib.unzCloseCurrentFile(handle); if (result != 0) { throw new ZipException("Error while closing entry: " + relativePath + " - Errorcode: " + result); } return(new MemoryStream(buffer, 0, bytesRead)); }
public static extern int unzGetCurrentFileInfo(IntPtr handle, out ZipEntryInfo entryInfoPtr, sbyte[] entryNameBuffer, UIntPtr entryNameBufferLength, byte[] extraField, UIntPtr extraFieldLength, sbyte[] commentBuffer, UIntPtr commentBufferLength);