private void CloseStreams() { if (!_leaveOpen) { ArchiveStream1.Close(); if (_backingStream != null) { _backingStream.Close(); } if (_archiveReader != null) { _archiveReader.Close(); } } else if (_backingStream != null) { ArchiveStream1.Close(); } }
private void WriteFile() { List <ZipArchiveEntry> .Enumerator enumerator; if (_mode == ZipArchiveMode.Update) { List <ZipArchiveEntry> list = new List <ZipArchiveEntry>(); foreach (ZipArchiveEntry entry in _entries) { if (!entry.LoadLocalHeaderExtraFieldAndCompressedBytesIfNeeded()) { list.Add(entry); } } using (enumerator = list.GetEnumerator()) { while (enumerator.MoveNext()) { enumerator.Current.Delete(); } } ArchiveStream1.Seek(0L, SeekOrigin.Begin); ArchiveStream1.SetLength(0L); } using (enumerator = _entries.GetEnumerator()) { while (enumerator.MoveNext()) { enumerator.Current.WriteAndFinishLocalEntry(); } } long position = ArchiveStream1.Position; using (enumerator = _entries.GetEnumerator()) { while (enumerator.MoveNext()) { enumerator.Current.WriteCentralDirectoryFileHeader(); } } long sizeOfCentralDirectory = ArchiveStream1.Position - position; WriteArchiveEpilogue(position, sizeOfCentralDirectory); }
private void ReadCentralDirectory() { try { ZipCentralDirectoryFileHeader header; ArchiveStream1.Seek(_centralDirectoryStart, SeekOrigin.Begin); long num = 0L; bool saveExtraFieldsAndComments = Mode == ZipArchiveMode.Update; while (ZipCentralDirectoryFileHeader.TryReadBlock(_archiveReader, saveExtraFieldsAndComments, out header)) { AddEntry(new ZipArchiveEntry(this, header)); num += 1L; } if (num != _expectedNumberOfEntries) { throw new InvalidDataException(Messages.NumEntriesWrong); } } catch (EndOfStreamException exception) { throw new InvalidDataException(Messages.CentralDirectoryInvalid, exception); } }
private void ReadEndOfCentralDirectory() { try { ZipEndOfCentralDirectoryBlock block; ArchiveStream1.Seek(-18L, SeekOrigin.End); if (!ZipHelper.SeekBackwardsToSignature(ArchiveStream1, 0x6054b50)) { throw new InvalidDataException(Messages.EOCDNotFound); } long position = ArchiveStream1.Position; ZipEndOfCentralDirectoryBlock.TryReadBlock(_archiveReader, out block); if (block.NumberOfThisDisk != block.NumberOfTheDiskWithTheStartOfTheCentralDirectory) { throw new InvalidDataException(Messages.SplitSpanned); } _numberOfThisDisk = block.NumberOfThisDisk; _centralDirectoryStart = block.OffsetOfStartOfCentralDirectoryWithRespectToTheStartingDiskNumber; if (block.NumberOfEntriesInTheCentralDirectory != block.NumberOfEntriesInTheCentralDirectoryOnThisDisk) { throw new InvalidDataException(Messages.SplitSpanned); } _expectedNumberOfEntries = block.NumberOfEntriesInTheCentralDirectory; if (_mode == ZipArchiveMode.Update) { _archiveComment = block.ArchiveComment; } if (((block.NumberOfThisDisk == 0xffff) || (block.OffsetOfStartOfCentralDirectoryWithRespectToTheStartingDiskNumber == uint.MaxValue)) || (block.NumberOfEntriesInTheCentralDirectory == 0xffff)) { ArchiveStream1.Seek(position - 0x10L, SeekOrigin.Begin); if (ZipHelper.SeekBackwardsToSignature(ArchiveStream1, 0x7064b50)) { Zip64EndOfCentralDirectoryLocator locator; Zip64EndOfCentralDirectoryRecord record; Zip64EndOfCentralDirectoryLocator.TryReadBlock(_archiveReader, out locator); if (locator.OffsetOfZip64EOCD > 0x7fffffffffffffffL) { throw new InvalidDataException(Messages.FieldTooBigOffsetToZip64EOCD); } long offset = (long)locator.OffsetOfZip64EOCD; ArchiveStream1.Seek(offset, SeekOrigin.Begin); if (!Zip64EndOfCentralDirectoryRecord.TryReadBlock(_archiveReader, out record)) { throw new InvalidDataException(Messages.Zip64EOCDNotWhereExpected); } _numberOfThisDisk = record.NumberOfThisDisk; if (record.NumberOfEntriesTotal > 0x7fffffffffffffffL) { throw new InvalidDataException(Messages.FieldTooBigNumEntries); } if (record.OffsetOfCentralDirectory > 0x7fffffffffffffffL) { throw new InvalidDataException(Messages.FieldTooBigOffsetToCD); } if (record.NumberOfEntriesTotal != record.NumberOfEntriesOnThisDisk) { throw new InvalidDataException(Messages.SplitSpanned); } _expectedNumberOfEntries = (long)record.NumberOfEntriesTotal; _centralDirectoryStart = (long)record.OffsetOfCentralDirectory; } } if (_centralDirectoryStart > ArchiveStream1.Length) { throw new InvalidDataException(Messages.FieldTooBigOffsetToCD); } } catch (EndOfStreamException exception) { throw new InvalidDataException(Messages.CDCorrupt, exception); } catch (IOException exception2) { throw new InvalidDataException(Messages.CDCorrupt, exception2); } }