private void CopyEntryDataDirect(ZipUpdate update, Stream stream, bool updateCrc, ref long destinationPosition,
ref long sourcePosition) {
long bytesToCopy=update.Entry.CompressedSize;
// NOTE: Compressed size is updated elsewhere.
var crc=new Crc32();
byte[] buffer=GetBuffer();
long targetBytes=bytesToCopy;
long totalBytesRead=0;
int bytesRead;
do {
int readSize=buffer.Length;
if (bytesToCopy<readSize) {
readSize=(int)bytesToCopy;
}
stream.Position=sourcePosition;
bytesRead=stream.Read(buffer, 0, readSize);
if (bytesRead>0) {
if (updateCrc) {
crc.Update(buffer, 0, bytesRead);
}
stream.Position=destinationPosition;
stream.Write(buffer, 0, bytesRead);
destinationPosition+=bytesRead;
sourcePosition+=bytesRead;
bytesToCopy-=bytesRead;
totalBytesRead+=bytesRead;
}
} while ((bytesRead>0)&&(bytesToCopy>0));
if (totalBytesRead!=targetBytes) {
throw new ZipException(string.Format("Failed to copy bytes expected {0} read {1}", targetBytes,
totalBytesRead));
}
if (updateCrc) {
update.OutEntry.Crc=crc.Value;
}
}