コード例 #1
0
ファイル: ZipFile.cs プロジェクト: IntegralLee/fomm
    private void AddEntry(ZipFile workFile, ZipUpdate update)
    {
      Stream source = null;

      if (update.Entry.IsFile)
      {
        source = update.GetSource();

        if (source == null)
        {
          source = updateDataSource_.GetSource(update.Entry, null);
        }
      }

      if (source != null)
      {
        using (source)
        {
          var sourceStreamLength = source.Length;
          if (update.OutEntry.Size < 0)
          {
            update.OutEntry.Size = sourceStreamLength;
          }
          else
          {
            // Check for errant entries.
            if (update.OutEntry.Size != sourceStreamLength)
            {
              throw new ZipException("Entry size/stream size mismatch");
            }
          }

          workFile.WriteLocalEntryHeader(update);

          var dataStart = workFile.baseStream_.Position;

          using (var output = workFile.GetOutputStream(update.OutEntry))
          {
            CopyBytes(update, output, source, sourceStreamLength, true);
          }

          var dataEnd = workFile.baseStream_.Position;
          update.OutEntry.CompressedSize = dataEnd - dataStart;

          if ((update.OutEntry.Flags & (int) GeneralBitFlags.Descriptor) == (int) GeneralBitFlags.Descriptor)
          {
            var helper = new ZipHelperStream(workFile.baseStream_);
            helper.WriteDataDescriptor(update.OutEntry);
          }
        }
      }
      else
      {
        workFile.WriteLocalEntryHeader(update);
        update.OutEntry.CompressedSize = 0;
      }
    }