private void WriteArchive() { if (this.Mode == ZipArchiveMode.Update) { foreach (ZipArchiveEntry zipArchiveEntry in this.entries.Values) { zipArchiveEntry.Dispose(); } } long position1 = this.Writer.BaseStream.Position; foreach (ZipArchiveEntry zipArchiveEntry in this.entries.Values) { zipArchiveEntry.WriteCentralDirectoryHeader(); } long num = this.Writer.BaseStream.Position - position1; bool flag = false; if (position1 >= (long)uint.MaxValue || num >= (long)uint.MaxValue || this.entries.Count >= (int)ushort.MaxValue) { flag = true; } if (flag) { long position2 = this.Writer.BaseStream.Position; if (this.zip64EndOfCentralDirectoryRecord == null) { this.zip64EndOfCentralDirectoryRecord = new Zip64EndOfCentralDirectoryRecord(); } this.zip64EndOfCentralDirectoryRecord.NumberOfEntriesInTheCentralDirectory = (ulong)this.entries.Count; this.zip64EndOfCentralDirectoryRecord.NumberOfEntriesInTheCentralDirectoryOnThisDisk = (ulong)this.entries.Count; this.zip64EndOfCentralDirectoryRecord.OffsetOfStartOfCentralDirectoryWithRespectToTheStartingDiskNumber = (ulong)position1; this.zip64EndOfCentralDirectoryRecord.SizeOfCentralDirectory = (ulong)num; this.zip64EndOfCentralDirectoryRecord.WriteBlock(this.Writer); if (this.zip64EndOfCentralDirectoryLocator == null) { this.zip64EndOfCentralDirectoryLocator = new Zip64EndOfCentralDirectoryLocator(); } this.zip64EndOfCentralDirectoryLocator.NumberOfTheDiskWithTheStartOfTheZip64EndOfCentralDirectory = 0U; this.zip64EndOfCentralDirectoryLocator.NumberOfDisks = 1U; this.zip64EndOfCentralDirectoryLocator.RelativeOffsetOfTheZip64EndOfCentralDirectoryRecord = (ulong)position2; this.zip64EndOfCentralDirectoryLocator.WriteBlock(this.Writer); } if (this.endOfCentralDirectoryRecord == null) { this.endOfCentralDirectoryRecord = new EndOfCentralDirectoryRecord(); } this.endOfCentralDirectoryRecord.NumberOfThisDisk = (ushort)0; this.endOfCentralDirectoryRecord.NumberOfTheDiskWithTheStartOfTheCentralDirectory = (ushort)0; this.endOfCentralDirectoryRecord.NumberOfEntriesInTheCentralDirectoryOnThisDisk = this.entries.Count < (int)ushort.MaxValue ? (ushort)this.entries.Count : ushort.MaxValue; this.endOfCentralDirectoryRecord.NumberOfEntriesInTheCentralDirectory = this.entries.Count < (int)ushort.MaxValue ? (ushort)this.entries.Count : ushort.MaxValue; this.endOfCentralDirectoryRecord.OffsetOfStartOfCentralDirectoryWithRespectToTheStartingDiskNumber = position1 > (long)uint.MaxValue ? uint.MaxValue : (uint)position1; this.endOfCentralDirectoryRecord.SizeOfCentralDirectory = num > (long)uint.MaxValue ? uint.MaxValue : (uint)num; this.endOfCentralDirectoryRecord.WriteBlock(this.Writer); if (this.Mode != ZipArchiveMode.Update) { return; } this.workingStream.Seek(0L, SeekOrigin.Begin); this.originalStream.Seek(0L, SeekOrigin.Begin); ZipFile.CopyStreamTo(this.workingStream, this.originalStream); this.originalStream.SetLength(this.workingStream.Length); }
private void ReadEndOfCentralDirectory() { try { this.Reader.BaseStream.Seek(-18L, SeekOrigin.End); if (!ZipHelper.SeekBackwardsToSignature(this.Reader.BaseStream, 101010256U)) { throw new InvalidDataException("End of central directory not found."); } long position = this.Reader.BaseStream.Position; this.endOfCentralDirectoryRecord = new EndOfCentralDirectoryRecord(); if (!this.endOfCentralDirectoryRecord.TryReadBlock(this.archiveReader)) { throw new InvalidDataException("End of central directory not found."); } if ((int)this.endOfCentralDirectoryRecord.NumberOfThisDisk != (int)this.endOfCentralDirectoryRecord.NumberOfTheDiskWithTheStartOfTheCentralDirectory) { throw new InvalidDataException("Splitted archive is not supported."); } if ((int)this.endOfCentralDirectoryRecord.NumberOfEntriesInTheCentralDirectory != (int)this.endOfCentralDirectoryRecord.NumberOfEntriesInTheCentralDirectoryOnThisDisk) { throw new InvalidDataException("Splitted archive is not supported."); } if (this.endOfCentralDirectoryRecord.NumberOfThisDisk == ushort.MaxValue || this.endOfCentralDirectoryRecord.OffsetOfStartOfCentralDirectoryWithRespectToTheStartingDiskNumber == uint.MaxValue || this.endOfCentralDirectoryRecord.NumberOfEntriesInTheCentralDirectory == ushort.MaxValue) { this.Reader.BaseStream.Seek(position - 16L, SeekOrigin.Begin); if (ZipHelper.SeekBackwardsToSignature(this.Reader.BaseStream, 117853008U)) { this.zip64EndOfCentralDirectoryLocator = new Zip64EndOfCentralDirectoryLocator(); if (!this.zip64EndOfCentralDirectoryLocator.TryReadBlock(this.archiveReader)) { throw new InvalidDataException("ZIP64 End of central directory locator not found."); } if (this.zip64EndOfCentralDirectoryLocator.RelativeOffsetOfTheZip64EndOfCentralDirectoryRecord > (ulong)long.MaxValue) { throw new InvalidDataException("Relative offset of the Zip64 End Of Central Directory Record is too big."); } this.Reader.BaseStream.Seek((long)this.zip64EndOfCentralDirectoryLocator.RelativeOffsetOfTheZip64EndOfCentralDirectoryRecord, SeekOrigin.Begin); this.zip64EndOfCentralDirectoryRecord = new Zip64EndOfCentralDirectoryRecord(); if (!this.zip64EndOfCentralDirectoryRecord.TryReadBlock(this.archiveReader)) { throw new InvalidDataException("Zip64 End Of Central Directory Record not found."); } if (this.zip64EndOfCentralDirectoryRecord.NumberOfEntriesInTheCentralDirectory > (ulong)long.MaxValue) { throw new InvalidDataException("Number of entries is too big."); } if (this.zip64EndOfCentralDirectoryRecord.OffsetOfStartOfCentralDirectoryWithRespectToTheStartingDiskNumber > (ulong)long.MaxValue) { throw new InvalidDataException("Relative offset of the Central Directory Start is too big."); } if ((long)this.zip64EndOfCentralDirectoryRecord.NumberOfEntriesInTheCentralDirectory != (long)this.zip64EndOfCentralDirectoryRecord.NumberOfEntriesInTheCentralDirectoryOnThisDisk) { throw new InvalidDataException("Splitted archive is not supported."); } } } if (this.CentralDirectoryStart > this.Reader.BaseStream.Length) { throw new InvalidDataException("Relative offset of the Central Directory Start is too big."); } } catch (EndOfStreamException ex) { throw new InvalidDataException("Archive corrupted", (Exception)ex); } catch (IOException ex) { throw new InvalidDataException("Archive corrupted", (Exception)ex); } }