ICSharpCode.SharpZipLib.Zip.ZipFile.CopyEntryDirect C# (CSharp) Метод

CopyEntryDirect() приватный Метод

private CopyEntryDirect ( ZipFile workFile, ZipUpdate update, long &destinationPosition ) : void
workFile ZipFile
update ZipUpdate
destinationPosition long
Результат void
        private void CopyEntryDirect(ZipFile workFile, ZipUpdate update, ref long destinationPosition) {
            bool skipOver = update.Entry.Offset==destinationPosition;

            if (!skipOver) {
                baseStream_.Position=destinationPosition;
                workFile.WriteLocalEntryHeader(update);
                destinationPosition=baseStream_.Position;
            }

            long sourcePosition=0;

            const int NameLengthOffset=26;

            // TODO: Add base for SFX friendly handling
            long entryDataOffset=update.Entry.Offset+NameLengthOffset;

            baseStream_.Seek(entryDataOffset, SeekOrigin.Begin);

            // Clumsy way of handling retrieving the original name and extra data length for now.
            // TODO: Stop re-reading name and data length in CopyEntryDirect.
            uint nameLength=ReadLEUshort();
            uint extraLength=ReadLEUshort();

            sourcePosition=baseStream_.Position+nameLength+extraLength;

            if (skipOver) {
                if (update.OffsetBasedSize!=-1)
                    destinationPosition+=update.OffsetBasedSize;
                else
                    // TODO: Find out why this calculation comes up 4 bytes short on some entries in ODT (Office Document Text) archives.
                    // WinZip produces a warning on these entries:
                    // "caution: value of lrec.csize (compressed size) changed from ..."
                    destinationPosition+=
                        (sourcePosition-entryDataOffset)+NameLengthOffset+ // Header size
                        update.Entry.CompressedSize+GetDescriptorSize(update);
            } else {
                if (update.Entry.CompressedSize>0) {
                    CopyEntryDataDirect(update, baseStream_, false, ref destinationPosition, ref sourcePosition);
                }
                CopyDescriptorBytesDirect(update, baseStream_, ref destinationPosition, sourcePosition);
            }
        }