System.IO.Compression.Zip64ExtraField.TryGetZip64BlockFromGenericExtraField C# (CSharp) Method

TryGetZip64BlockFromGenericExtraField() private static method

private static TryGetZip64BlockFromGenericExtraField ( ZipGenericExtraField extraField, bool readUncompressedSize, bool readCompressedSize, bool readLocalHeaderOffset, bool readStartDiskNumber, Zip64ExtraField &zip64Block ) : bool
extraField ZipGenericExtraField
readUncompressedSize bool
readCompressedSize bool
readLocalHeaderOffset bool
readStartDiskNumber bool
zip64Block Zip64ExtraField
return bool
        private static bool TryGetZip64BlockFromGenericExtraField(ZipGenericExtraField extraField,
            bool readUncompressedSize, bool readCompressedSize,
            bool readLocalHeaderOffset, bool readStartDiskNumber,
            out Zip64ExtraField zip64Block)
        {
            zip64Block = new Zip64ExtraField();

            zip64Block._compressedSize = null;
            zip64Block._uncompressedSize = null;
            zip64Block._localHeaderOffset = null;
            zip64Block._startDiskNumber = null;

            if (extraField.Tag != TagConstant)
                return false;

            //this pattern needed because nested using blocks trigger CA2202
            MemoryStream ms = null;
            try
            {
                ms = new MemoryStream(extraField.Data);
                using (BinaryReader reader = new BinaryReader(ms))
                {
                    ms = null;

                    zip64Block._size = extraField.Size;

                    ushort expectedSize = 0;

                    if (readUncompressedSize) expectedSize += 8;
                    if (readCompressedSize) expectedSize += 8;
                    if (readLocalHeaderOffset) expectedSize += 8;
                    if (readStartDiskNumber) expectedSize += 4;

                    //if it is not the expected size, perhaps there is another extra field that matches
                    if (expectedSize != zip64Block._size)
                        return false;

                    if (readUncompressedSize) zip64Block._uncompressedSize = reader.ReadInt64();
                    if (readCompressedSize) zip64Block._compressedSize = reader.ReadInt64();
                    if (readLocalHeaderOffset) zip64Block._localHeaderOffset = reader.ReadInt64();
                    if (readStartDiskNumber) zip64Block._startDiskNumber = reader.ReadInt32();

                    //original values are unsigned, so implies value is too big to fit in signed integer
                    if (zip64Block._uncompressedSize < 0) throw new InvalidDataException(SR.FieldTooBigUncompressedSize);
                    if (zip64Block._compressedSize < 0) throw new InvalidDataException(SR.FieldTooBigCompressedSize);
                    if (zip64Block._localHeaderOffset < 0) throw new InvalidDataException(SR.FieldTooBigLocalHeaderOffset);
                    if (zip64Block._startDiskNumber < 0) throw new InvalidDataException(SR.FieldTooBigStartDiskNumber);

                    return true;
                }
            }
            finally
            {
                if (ms != null)
                    ms.Dispose();
            }
        }

Usage Example

示例#1
0
        public static Zip64ExtraField GetAndRemoveZip64Block(List <ZipGenericExtraField> extraFields, bool readUncompressedSize, bool readCompressedSize, bool readLocalHeaderOffset, bool readStartDiskNumber)
        {
            Zip64ExtraField zip64ExtraField = new Zip64ExtraField()
            {
                _compressedSize    = null,
                _uncompressedSize  = null,
                _localHeaderOffset = null,
                _startDiskNumber   = null
            };
            List <ZipGenericExtraField> zipGenericExtraFields = new List <ZipGenericExtraField>();
            bool flag = false;

            foreach (ZipGenericExtraField extraField in extraFields)
            {
                if (extraField.Tag != 1)
                {
                    continue;
                }
                zipGenericExtraFields.Add(extraField);
                if (flag || !Zip64ExtraField.TryGetZip64BlockFromGenericExtraField(extraField, readUncompressedSize, readCompressedSize, readLocalHeaderOffset, readStartDiskNumber, out zip64ExtraField))
                {
                    continue;
                }
                flag = true;
            }
            foreach (ZipGenericExtraField zipGenericExtraField in zipGenericExtraFields)
            {
                extraFields.Remove(zipGenericExtraField);
            }
            return(zip64ExtraField);
        }
All Usage Examples Of System.IO.Compression.Zip64ExtraField::TryGetZip64BlockFromGenericExtraField