private void CopyThroughWithNoChange(Stream outstream)
{
int n;
byte[] bytes = new byte[BufferSize];
var input = new CountingStream(this.ArchiveStream);
// seek to the beginning of the entry data in the input stream
input.Seek(this._RelativeOffsetOfLocalHeader, SeekOrigin.Begin);
if (this._TotalEntrySize == 0)
{
// We've never set the length of the entry.
// Set it here.
this._TotalEntrySize = this._LengthOfHeader + this._CompressedFileDataSize + _LengthOfTrailer;
// The CompressedSize includes all the leading metadata associated
// to encryption, if any, as well as the compressed data, or
// compressed-then-encrypted data, and the trailer in case of AES.
// The CompressedFileData size is the same, less the encryption
// framing data (12 bytes header for PKZip; 10/18 bytes header and
// 10 byte trailer for AES).
// The _LengthOfHeader includes all the zip entry header plus the
// crypto header, if any. The _LengthOfTrailer includes the
// 10-byte MAC for AES, where appropriate, and the bit-3
// Descriptor, where applicable.
}
// workitem 5616
// remember the offset, within the output stream, of this particular entry header.
// This may have changed if any of the other entries changed (eg, if a different
// entry was removed or added.)
var counter = outstream as CountingStream;
_RelativeOffsetOfLocalHeader = (counter != null)
? counter.ComputedPosition
: outstream.Position; // BytesWritten
// copy through the header, filedata, trailer, everything...
long remaining = this._TotalEntrySize;
while (remaining > 0)
{
int len = (remaining > bytes.Length) ? bytes.Length : (int)remaining;
// read
n = input.Read(bytes, 0, len);
//_CheckRead(n);
// write
outstream.Write(bytes, 0, n);
remaining -= n;
OnWriteBlock(input.BytesRead, this._TotalEntrySize);
if (_ioOperationCanceled)
break;
}
}