예제 #1
0
        /// <summary>
        /// This will throw if the zipfile does not exist.
        /// </summary>
        public static ZipFile Read(Stream zipstream)
        {
            ZipFile zf = new ZipFile();

            zf._readstream = zipstream;
            zf._entries    = new System.Collections.Generic.List <ZipEntry>();
            ZipEntry e;

            while ((e = ZipEntry.Read(zf.ReadStream)) != null)
            {
                zf._entries.Add(e);
            }

            // read the zipfile's central directory structure here.
            zf._direntries = new System.Collections.Generic.List <ZipDirEntry>();

            ZipDirEntry de;

            while ((de = ZipDirEntry.Read(zf.ReadStream)) != null)
            {
            }

            zf._direntries.Add(de);

            return(zf);
        }
예제 #2
0
        public static ZipDirEntry Read(System.IO.Stream s, bool TurnOnDebug)
        {
            int signature = Utils.ReadSignature(s);

            // return null if this is not a local file header signature
            if (SignatureIsNotValid(signature))
            {
                s.Seek(-4, System.IO.SeekOrigin.Current);
                return(null);
            }

            byte[] block = new byte[42];
            int    n     = s.Read(block, 0, block.Length);

            if (n != block.Length)
            {
                return(null);
            }

            int         i   = 0;
            ZipDirEntry zde = new ZipDirEntry();

            zde._Debug             = TurnOnDebug;
            zde._VersionMadeBy     = (short)(block[i++] + block[i++] * 256);
            zde._VersionNeeded     = (short)(block[i++] + block[i++] * 256);
            zde._BitField          = (short)(block[i++] + block[i++] * 256);
            zde._CompressionMethod = (short)(block[i++] + block[i++] * 256);
            zde._LastModDateTime   = block[i++] + block[i++] * 256 + block[i++] * 256 * 256 + block[i++] * 256 * 256 * 256;
            zde._Crc32             = block[i++] + block[i++] * 256 + block[i++] * 256 * 256 + block[i++] * 256 * 256 * 256;
            zde._CompressedSize    = block[i++] + block[i++] * 256 + block[i++] * 256 * 256 + block[i++] * 256 * 256 * 256;
            zde._UncompressedSize  = block[i++] + block[i++] * 256 + block[i++] * 256 * 256 + block[i++] * 256 * 256 * 256;

            zde._LastModified = Utils.PackedToDateTime(zde._LastModDateTime);

            Int16 filenameLength    = (short)(block[i++] + block[i++] * 256);
            Int16 extraFieldLength  = (short)(block[i++] + block[i++] * 256);
            Int16 commentLength     = (short)(block[i++] + block[i++] * 256);
            Int16 diskNumber        = (short)(block[i++] + block[i++] * 256);
            Int16 internalFileAttrs = (short)(block[i++] + block[i++] * 256);
            Int32 externalFileAttrs = block[i++] + block[i++] * 256 + block[i++] * 256 * 256 + block[i++] * 256 * 256 * 256;
            Int32 Offset            = block[i++] + block[i++] * 256 + block[i++] * 256 * 256 + block[i++] * 256 * 256 * 256;

            block         = new byte[filenameLength];
            n             = s.Read(block, 0, block.Length);
            zde._FileName = Utils.StringFromBuffer(block, 0, block.Length);

            zde._Extra = new byte[extraFieldLength];
            n          = s.Read(zde._Extra, 0, zde._Extra.Length);

            block        = new byte[commentLength];
            n            = s.Read(block, 0, block.Length);
            zde._Comment = Utils.StringFromBuffer(block, 0, block.Length);

            return(zde);
        }