internal static ZipFile Read(string zipfilename, bool TurnOnDebug) { var zf = new ZipFile(); zf._Debug = TurnOnDebug; zf.Name = zipfilename; zf._entries = new List <ZipEntry>(); ZipEntry e; while ((e = ZipEntry.Read(zf.ReadStream, zf._Debug)) != null) { if (zf._Debug) { Console.WriteLine(" ZipFile::Read(): ZipEntry: {0}", e.FileName); } zf._entries.Add(e); } // read the zipfile's central directory structure here. zf._direntries = new List <ZipDirEntry>(); ZipDirEntry de; while ((de = ZipDirEntry.Read(zf.ReadStream, zf._Debug)) != null) { if (zf._Debug) { Console.WriteLine(" ZipFile::Read(): ZipDirEntry: {0}", de.FileName); } zf._direntries.Add(de); } return(zf); }
internal static ZipDirEntry Read(Stream s, bool TurnOnDebug) { var signature = Shared.ReadSignature(s); // return null if this is not a local file header signature if (SignatureIsNotValid(signature)) { s.Seek(-4, SeekOrigin.Current); if (TurnOnDebug) { Console.WriteLine(" ZipDirEntry::Read(): Bad signature ({0:X8}) at position {1}", signature, s.Position); } return(null); } var block = new byte[42]; var n = s.Read(block, 0, block.Length); if (n != block.Length) { return(null); } var i = 0; var 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 = Shared.PackedToDateTime(zde._LastModDateTime); var filenameLength = (short)(block[i++] + block[i++] * 256); var extraFieldLength = (short)(block[i++] + block[i++] * 256); var commentLength = (short)(block[i++] + block[i++] * 256); var diskNumber = (short)(block[i++] + block[i++] * 256); var internalFileAttrs = (short)(block[i++] + block[i++] * 256); var externalFileAttrs = block[i++] + block[i++] * 256 + block[i++] * 256 * 256 + block[i++] * 256 * 256 * 256; var 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 = Shared.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 = Shared.StringFromBuffer(block, 0, block.Length); return(zde); }