示例#1
0
 private void CloseStreams()
 {
     if (!_leaveOpen)
     {
         ArchiveStream1.Close();
         if (_backingStream != null)
         {
             _backingStream.Close();
         }
         if (_archiveReader != null)
         {
             _archiveReader.Close();
         }
     }
     else if (_backingStream != null)
     {
         ArchiveStream1.Close();
     }
 }
示例#2
0
        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);
        }
示例#3
0
 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);
     }
 }
示例#4
0
 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);
     }
 }