ICSharpCode.SharpZipLib.Zip.ZipFile.CopyEntryDataDirect C# (CSharp) Method

CopyEntryDataDirect() private method

private CopyEntryDataDirect ( ZipUpdate update, Stream stream, bool updateCrc, long &destinationPosition, long &sourcePosition ) : void
update ZipUpdate
stream Stream
updateCrc bool
destinationPosition long
sourcePosition long
return void
        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;
            }
        }