public ZipFileHeader(ZipFileInfo fileInfo, bool zip64) : this() { this.flags = ZipFileFlags.None; this.compressionMethod = fileInfo.CompressionMethod; this.fileName = Path.Combine(fileInfo.Path, fileInfo.Name); CompressionEngine.DateTimeToDosDateAndTime( fileInfo.LastWriteTime, out this.lastModDate, out this.lastModTime); this.zip64 = zip64; if (this.zip64) { this.compressedSize = UInt32.MaxValue; this.uncompressedSize = UInt32.MaxValue; this.diskStart = UInt16.MaxValue; this.versionMadeBy = 45; this.versionNeeded = 45; ZipExtraFileField field = new ZipExtraFileField(); field.fieldType = ZipExtraFileFieldType.ZIP64; field.SetZip64Data( fileInfo.CompressedLength, fileInfo.Length, 0, fileInfo.ArchiveNumber); this.extraFields = new ZipExtraFileField[] { field }; } else { this.compressedSize = (uint)fileInfo.CompressedLength; this.uncompressedSize = (uint)fileInfo.Length; this.diskStart = (ushort)fileInfo.ArchiveNumber; } }
public ZipFileHeader(ZipFileInfo fileInfo, bool zip64) : this() { this.flags = ZipFileFlags.None; this.compressionMethod = fileInfo.CompressionMethod; this.fileName = Path.Combine(fileInfo.Path, fileInfo.Name); CompressionEngine.DateTimeToDosDateAndTime( fileInfo.LastWriteTime, out this.lastModDate, out this.lastModTime); this.zip64 = zip64; if (this.zip64) { this.compressedSize = UInt32.MaxValue; this.uncompressedSize = UInt32.MaxValue; this.diskStart = UInt16.MaxValue; this.versionMadeBy = 45; this.versionNeeded = 45; ZipExtraFileField field = new ZipExtraFileField(); field.fieldType = ZipExtraFileFieldType.ZIP64; field.SetZip64Data( fileInfo.CompressedLength, fileInfo.Length, 0, fileInfo.ArchiveNumber); this.extraFields = new ZipExtraFileField[] { field }; } else { this.compressedSize = (uint) fileInfo.CompressedLength; this.uncompressedSize = (uint) fileInfo.Length; this.diskStart = (ushort) fileInfo.ArchiveNumber; } }
/// <summary> /// Creates a central file header from the information in a local file header. /// </summary> /// <param name="localFileHeader">Local file header to </param> public ZipFileHeader(ZipFileHeader localFileHeader) { if (localFileHeader.central) { throw new ArgumentException(); } this.central = true; this.compressionMethod = localFileHeader.compressionMethod; this.fileName = localFileHeader.fileName; this.fileComment = localFileHeader.fileComment; this.flags = localFileHeader.flags; this.externalFileAttrs = localFileHeader.externalFileAttrs; this.internalFileAttrs = localFileHeader.internalFileAttrs; this.lastModDate = localFileHeader.lastModDate; this.lastModTime = localFileHeader.lastModTime; this.crc32 = localFileHeader.crc32; if (this.zip64) { this.versionMadeBy = 45; this.versionNeeded = 45; this.compressedSize = UInt32.MaxValue; this.uncompressedSize = UInt32.MaxValue; this.diskStart = UInt16.MaxValue; ZipExtraFileField field = new ZipExtraFileField(); field.fieldType = ZipExtraFileFieldType.ZIP64; field.SetZip64Data(localFileHeader.compressedSize, localFileHeader.uncompressedSize, localFileHeader.localHeaderOffset, localFileHeader.diskStart); this.extraFields = new ZipExtraFileField[] { field }; } else { this.versionMadeBy = 20; this.versionNeeded = 20; this.localHeaderOffset = localFileHeader.localHeaderOffset; this.compressedSize = localFileHeader.compressedSize; this.uncompressedSize = localFileHeader.uncompressedSize; } }
public void Write(Stream stream, bool central) { byte[] fileNameBytes = (this.fileName != null ? Encoding.UTF8.GetBytes(this.fileName) : new byte[0]); byte[] fileCommentBytes = (this.fileComment != null ? Encoding.UTF8.GetBytes(this.fileComment) : new byte[0]); bool useUtf8 = (this.fileName != null && fileNameBytes.Length > this.fileName.Length) || (this.fileComment != null && fileCommentBytes.Length > this.fileComment.Length); if (useUtf8) { this.flags |= ZipFileFlags.UTF8; } BinaryWriter writer = new BinaryWriter(stream); writer.Write(central ? CFHSIG : LFHSIG); if (central) { writer.Write(this.versionMadeBy); } writer.Write(this.versionNeeded); writer.Write((ushort)this.flags); writer.Write((ushort)this.compressionMethod); writer.Write(this.lastModTime); writer.Write(this.lastModDate); writer.Write(this.crc32); writer.Write(this.compressedSize); writer.Write(this.uncompressedSize); ushort extraFieldLength = 0; if (this.extraFields != null) { foreach (ZipExtraFileField field in this.extraFields) { if (field.data != null) { extraFieldLength += (ushort)(4 + field.data.Length); } } } writer.Write((ushort)fileNameBytes.Length); writer.Write(extraFieldLength); if (central) { writer.Write((ushort)fileCommentBytes.Length); writer.Write(this.diskStart); writer.Write(this.internalFileAttrs); writer.Write(this.externalFileAttrs); writer.Write(this.localHeaderOffset); } writer.Write(fileNameBytes); if (this.extraFields != null) { foreach (ZipExtraFileField field in this.extraFields) { if (field.data != null) { field.Write(stream); } } } if (central) { writer.Write(fileCommentBytes); } }
public bool Read(Stream stream, bool central) { long startPos = stream.Position; if (stream.Length - startPos < (central ? CFH_FIXEDSIZE : LFH_FIXEDSIZE)) { return(false); } BinaryReader reader = new BinaryReader(stream); uint sig = reader.ReadUInt32(); if (sig == SPANSIG || sig == SPANSIG2) { // Spanned zip files may optionally begin with a special marker. // Just ignore it and move on. sig = reader.ReadUInt32(); } if (sig != (central ? CFHSIG : LFHSIG)) { return(false); } this.versionMadeBy = (central ? reader.ReadUInt16() : (ushort)0); this.versionNeeded = reader.ReadUInt16(); this.flags = (ZipFileFlags)reader.ReadUInt16(); this.compressionMethod = (ZipCompressionMethod)reader.ReadUInt16(); this.lastModTime = reader.ReadInt16(); this.lastModDate = reader.ReadInt16(); this.crc32 = reader.ReadUInt32(); this.compressedSize = reader.ReadUInt32(); this.uncompressedSize = reader.ReadUInt32(); this.zip64 = this.uncompressedSize == UInt32.MaxValue; int fileNameLength = reader.ReadUInt16(); int extraFieldLength = reader.ReadUInt16(); int fileCommentLength; if (central) { fileCommentLength = reader.ReadUInt16(); this.diskStart = reader.ReadUInt16(); this.internalFileAttrs = reader.ReadUInt16(); this.externalFileAttrs = reader.ReadUInt32(); this.localHeaderOffset = reader.ReadUInt32(); } else { fileCommentLength = 0; this.diskStart = 0; this.internalFileAttrs = 0; this.externalFileAttrs = 0; this.localHeaderOffset = 0; } if (stream.Length - stream.Position < fileNameLength + extraFieldLength + fileCommentLength) { return(false); } #if CORECLR Encoding headerEncoding = Encoding.UTF8; #else Encoding headerEncoding = ((this.flags | ZipFileFlags.UTF8) != 0 ? Encoding.UTF8 : Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.OEMCodePage)); #endif byte[] fileNameBytes = reader.ReadBytes(fileNameLength); this.fileName = headerEncoding.GetString(fileNameBytes).Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); List <ZipExtraFileField> fields = new List <ZipExtraFileField>(); while (extraFieldLength > 0) { ZipExtraFileField field = new ZipExtraFileField(); if (!field.Read(stream, ref extraFieldLength)) { return(false); } fields.Add(field); if (field.fieldType == ZipExtraFileFieldType.ZIP64) { this.zip64 = true; } } this.extraFields = fields.ToArray(); byte[] fileCommentBytes = reader.ReadBytes(fileCommentLength); this.fileComment = headerEncoding.GetString(fileCommentBytes); return(true); }
public void Write(Stream stream, bool central) { byte[] fileNameBytes = (this.fileName != null ? Encoding.UTF8.GetBytes(this.fileName) : new byte[0]); byte[] fileCommentBytes = (this.fileComment != null ? Encoding.UTF8.GetBytes(this.fileComment) : new byte[0]); bool useUtf8 = (this.fileName != null && fileNameBytes.Length > this.fileName.Length) || (this.fileComment != null && fileCommentBytes.Length > this.fileComment.Length); if (useUtf8) { this.flags |= ZipFileFlags.UTF8; } BinaryWriter writer = new BinaryWriter(stream); writer.Write(central ? CFHSIG : LFHSIG); if (central) { writer.Write(this.versionMadeBy); } writer.Write(this.versionNeeded); writer.Write((ushort) this.flags); writer.Write((ushort) this.compressionMethod); writer.Write(this.lastModTime); writer.Write(this.lastModDate); writer.Write(this.crc32); writer.Write(this.compressedSize); writer.Write(this.uncompressedSize); ushort extraFieldLength = 0; if (this.extraFields != null) { foreach (ZipExtraFileField field in this.extraFields) { if (field.data != null) { extraFieldLength += (ushort) (4 + field.data.Length); } } } writer.Write((ushort) fileNameBytes.Length); writer.Write(extraFieldLength); if (central) { writer.Write((ushort) fileCommentBytes.Length); writer.Write(this.diskStart); writer.Write(this.internalFileAttrs); writer.Write(this.externalFileAttrs); writer.Write(this.localHeaderOffset); } writer.Write(fileNameBytes); if (this.extraFields != null) { foreach (ZipExtraFileField field in this.extraFields) { if (field.data != null) { field.Write(stream); } } } if (central) { writer.Write(fileCommentBytes); } }
public bool Read(Stream stream, bool central) { long startPos = stream.Position; if (stream.Length - startPos < (central ? CFH_FIXEDSIZE : LFH_FIXEDSIZE)) { return false; } BinaryReader reader = new BinaryReader(stream); uint sig = reader.ReadUInt32(); if (sig == SPANSIG || sig == SPANSIG2) { // Spanned zip files may optionally begin with a special marker. // Just ignore it and move on. sig = reader.ReadUInt32(); } if (sig != (central ? CFHSIG : LFHSIG)) { return false; } this.versionMadeBy = (central ? reader.ReadUInt16() : (ushort) 0); this.versionNeeded = reader.ReadUInt16(); this.flags = (ZipFileFlags) reader.ReadUInt16(); this.compressionMethod = (ZipCompressionMethod) reader.ReadUInt16(); this.lastModTime = reader.ReadInt16(); this.lastModDate = reader.ReadInt16(); this.crc32 = reader.ReadUInt32(); this.compressedSize = reader.ReadUInt32(); this.uncompressedSize = reader.ReadUInt32(); this.zip64 = this.uncompressedSize == UInt32.MaxValue; int fileNameLength = reader.ReadUInt16(); int extraFieldLength = reader.ReadUInt16(); int fileCommentLength; if (central) { fileCommentLength = reader.ReadUInt16(); this.diskStart = reader.ReadUInt16(); this.internalFileAttrs = reader.ReadUInt16(); this.externalFileAttrs = reader.ReadUInt32(); this.localHeaderOffset = reader.ReadUInt32(); } else { fileCommentLength = 0; this.diskStart = 0; this.internalFileAttrs = 0; this.externalFileAttrs = 0; this.localHeaderOffset = 0; } if (stream.Length - stream.Position < fileNameLength + extraFieldLength + fileCommentLength) { return false; } Encoding headerEncoding = ((this.flags | ZipFileFlags.UTF8) != 0 ? Encoding.UTF8 : Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.OEMCodePage)); byte[] fileNameBytes = reader.ReadBytes(fileNameLength); this.fileName = headerEncoding.GetString(fileNameBytes).Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); List<ZipExtraFileField> fields = new List<ZipExtraFileField>(); while (extraFieldLength > 0) { ZipExtraFileField field = new ZipExtraFileField(); if (!field.Read(stream, ref extraFieldLength)) { return false; } fields.Add(field); if (field.fieldType == ZipExtraFileFieldType.ZIP64) { this.zip64 = true; } } this.extraFields = fields.ToArray(); byte[] fileCommentBytes = reader.ReadBytes(fileCommentLength); this.fileComment = headerEncoding.GetString(fileCommentBytes); return true; }
public void Write(Stream stream) { byte[] fileNameBytes = String.IsNullOrEmpty(this.fileName) ? new byte[0]: Encoding.UTF8.GetBytes(this.fileName); byte[] fileCommentBytes = String.IsNullOrEmpty(this.fileComment) ? new byte[0] : Encoding.UTF8.GetBytes(this.fileComment); bool useUtf8 = (this.fileName != null && fileNameBytes.Length > this.fileName.Length) || (this.fileComment != null && fileCommentBytes.Length > this.fileComment.Length); if (useUtf8) { this.flags |= ZipFileFlags.UTF8; } short time = this.lastModTime; short date = this.lastModDate; if (time == 0 && date == 0) { long filetime = DateTime.UtcNow.ToFileTimeUtc(); FileTimeToDosDateTime(ref filetime, out date, out time); } BinaryWriter writer = new BinaryWriter(stream); writer.Write(this.central ? CFHSIG : LFHSIG); if (this.central) { writer.Write(this.versionMadeBy); } writer.Write(this.versionNeeded); writer.Write((ushort)this.flags); writer.Write((ushort)this.compressionMethod); writer.Write(time); writer.Write(date); writer.Write(this.crc32); writer.Write(this.compressedSize); writer.Write(this.uncompressedSize); ushort extraFieldLength = 0; if (this.extraFields != null) { foreach (ZipExtraFileField field in this.extraFields) { if (field.data != null) { extraFieldLength += (ushort)(4 + field.data.Length); } } } writer.Write((ushort)fileNameBytes.Length); writer.Write(extraFieldLength); if (this.central) { writer.Write((ushort)fileCommentBytes.Length); writer.Write(this.diskStart); writer.Write(this.internalFileAttrs); writer.Write(this.externalFileAttrs); writer.Write(this.localHeaderOffset); } writer.Write(fileNameBytes); if (this.extraFields != null) { foreach (ZipExtraFileField field in this.extraFields) { if (field.data != null) { field.Write(stream); } } } if (this.central) { writer.Write(fileCommentBytes); } }