internal void LocalFileHeaderFake(ulong filePosition, ulong uncompressedSize, ulong compressedSize, byte[] crc32, MemoryStream ms) { using BinaryWriter bw = new(ms, Encoding.UTF8, true); RelativeOffsetOfLocalHeader = filePosition; SetStatus(LocalFileStatus.TrrntZip); UncompressedSize = uncompressedSize; _compressedSize = compressedSize; CRC = crc32; ZipExtraFieldWrite zefw = new(); SetStatus(LocalFileStatus.Zip64, zefw.Zip64(UncompressedSize, _compressedSize, RelativeOffsetOfLocalHeader, false, out uint headerUnCompressedSize, out uint headerCompressedSize, out uint headerRelativeOffsetOfLocalHeader) ); _extraField = zefw.ExtraField; byte[] bFileName; if (CompressUtils.IsCodePage437(Filename)) { bFileName = CompressUtils.GetBytes(Filename); } else { GeneralPurposeBitFlag |= 1 << 11; bFileName = Encoding.UTF8.GetBytes(Filename); } ushort versionNeededToExtract = (ushort)(GetStatus(LocalFileStatus.Zip64) ? 45 : 20); bw.Write(LocalFileHeaderSignature); bw.Write(versionNeededToExtract); bw.Write(GeneralPurposeBitFlag); bw.Write(_compressionMethod); CompressUtils.UtcTicksToDosDateTime(HeaderLastModified, out ushort lastModFileDate, out ushort lastModFileTime); bw.Write(lastModFileTime); bw.Write(lastModFileDate); WriteCRC(bw, CRC); bw.Write(headerCompressedSize); bw.Write(headerUnCompressedSize); ushort fileNameLength = (ushort)bFileName.Length; bw.Write(fileNameLength); ushort extraFieldLength = (ushort)_extraField.Length; bw.Write(extraFieldLength); bw.Write(bFileName, 0, fileNameLength); bw.Write(_extraField); }
private void LocalFileHeaderWrite(Stream zipFs) { using BinaryWriter bw = new(zipFs, Encoding.UTF8, true); ZipExtraFieldWrite zefw = new(); bool zip64 = zefw.Zip64(UncompressedSize, _compressedSize, RelativeOffsetOfLocalHeader, false, out uint headerUnCompressedSize, out uint headerCompressedSize, out uint headerRelativeOffsetOfLocalHeader); _extraField = zefw.ExtraField; SetStatus(LocalFileStatus.Zip64, zip64); byte[] bFileName; if (CompressUtils.IsCodePage437(Filename)) { bFileName = CompressUtils.GetBytes(Filename); } else { GeneralPurposeBitFlag |= 1 << 11; bFileName = Encoding.UTF8.GetBytes(Filename); } ushort versionNeededToExtract = (ushort)(GetStatus(LocalFileStatus.Zip64) ? 45 : 20); RelativeOffsetOfLocalHeader = (ulong)zipFs.Position; bw.Write(LocalFileHeaderSignature); bw.Write(versionNeededToExtract); bw.Write(GeneralPurposeBitFlag); bw.Write(_compressionMethod); CompressUtils.UtcTicksToDosDateTime(HeaderLastModified, out ushort lastModFileDate, out ushort lastModFileTime); bw.Write(lastModFileTime); bw.Write(lastModFileDate); // these 3 values will be set correctly after the file data has been written bw.Write(0xffffffff); // crc bw.Write(0xffffffff); // CompressedSize 32bit bw.Write(0xffffffff); // UncompressedSie 32bit ushort fileNameLength = (ushort)bFileName.Length; bw.Write(fileNameLength); ushort extraFieldLength = (ushort)_extraField.Length; bw.Write(extraFieldLength); bw.Write(bFileName, 0, fileNameLength); _extraLocation = (ulong)zipFs.Position; bw.Write(_extraField); }
internal void CentralDirectoryWrite(Stream crcStream) { using BinaryWriter bw = new(crcStream, Encoding.UTF8, true); ZipExtraFieldWrite zefw = new(); SetStatus(LocalFileStatus.Zip64, zefw.Zip64(UncompressedSize, _compressedSize, RelativeOffsetOfLocalHeader, true, out uint headerUnCompressedSize, out uint headerCompressedSize, out uint headerRelativeOffsetOfLocalHeader) ); _extraField = zefw.ExtraField; ushort extraFieldLength = (ushort)_extraField.Length; byte[] bFileName; if (CompressUtils.IsCodePage437(Filename)) { bFileName = CompressUtils.GetBytes(Filename); } else { GeneralPurposeBitFlag |= 1 << 11; bFileName = Encoding.UTF8.GetBytes(Filename); } ushort fileNameLength = (ushort)bFileName.Length; ushort versionNeededToExtract = (ushort)(GetStatus(LocalFileStatus.Zip64) ? 45 : 20); CompressUtils.UtcTicksToDosDateTime(HeaderLastModified, out ushort lastModFileDate, out ushort lastModFileTime); bw.Write(CentralDirectoryHeaderSignature); bw.Write((ushort)0); bw.Write(versionNeededToExtract); bw.Write(GeneralPurposeBitFlag); bw.Write(_compressionMethod); bw.Write(lastModFileTime); bw.Write(lastModFileDate); WriteCRC(bw, CRC); bw.Write(headerCompressedSize); bw.Write(headerUnCompressedSize); bw.Write(fileNameLength); bw.Write(extraFieldLength); bw.Write((ushort)0); // file comment length bw.Write((ushort)0); // disk number start bw.Write((ushort)0); // internal file attributes bw.Write((uint)0); // external file attributes bw.Write(headerRelativeOffsetOfLocalHeader); bw.Write(bFileName, 0, fileNameLength); bw.Write(_extraField, 0, extraFieldLength); // No File Comment }
public void ZipFileCloseFake(ulong fileOffset, out byte[] centralDir) { centralDir = null; if (ZipOpen != ZipOpenType.OpenFakeWrite) { return; } bool lTrrntzip = true; _zipFs = new MemoryStream(); _centralDirStart = fileOffset; CrcCalculatorStream crcCs = new(_zipFs, true); foreach (ZipLocalFile t in _localFiles) { t.CentralDirectoryWrite(crcCs); lTrrntzip &= t.GetStatus(LocalFileStatus.TrrntZip); } crcCs.Flush(); crcCs.Close(); _centralDirSize = (ulong)_zipFs.Position; FileComment = lTrrntzip ? CompressUtils.GetBytes("TORRENTZIPPED-" + crcCs.Crc.ToString("X8")) : new byte[0]; ZipStatus = lTrrntzip ? ZipStatus.TrrntZip : ZipStatus.None; crcCs.Dispose(); _zip64 = (_centralDirStart >= 0xffffffff) || (_centralDirSize >= 0xffffffff) || (_localFiles.Count >= 0xffff); if (_zip64) { _endOfCentralDir64 = fileOffset + (ulong)_zipFs.Position; Zip64EndOfCentralDirWrite(); Zip64EndOfCentralDirectoryLocatorWrite(); } EndOfCentralDirWrite(); centralDir = ((MemoryStream)_zipFs).ToArray(); _zipFs.Close(); _zipFs.Dispose(); ZipOpen = ZipOpenType.Closed; }
private void zipFileCloseWrite() { bool lTrrntzip = true; _centralDirStart = (ulong)_zipFs.Position; using (CrcCalculatorStream crcCs = new CrcCalculatorStream(_zipFs, true)) { foreach (ZipLocalFile t in _localFiles) { t.CentralDirectoryWrite(crcCs); lTrrntzip &= t.GetStatus(LocalFileStatus.TrrntZip); } crcCs.Flush(); crcCs.Close(); _centralDirSize = (ulong)_zipFs.Position - _centralDirStart; FileComment = lTrrntzip ? CompressUtils.GetBytes("TORRENTZIPPED-" + crcCs.Crc.ToString("X8")) : new byte[0]; ZipStatus = lTrrntzip ? ZipStatus.TrrntZip : ZipStatus.None; } _zip64 = false; _zip64 |= _centralDirStart >= 0xffffffff; _zip64 |= _centralDirSize >= 0xffffffff; _zip64 |= _localFiles.Count >= 0xffff; if (_zip64) { _endOfCentralDir64 = (ulong)_zipFs.Position; Zip64EndOfCentralDirWrite(); Zip64EndOfCentralDirectoryLocatorWrite(); } EndOfCentralDirWrite(); _zipFs.SetLength(_zipFs.Position); _zipFs.Flush(); _zipFs.Close(); _zipFs.Dispose(); _zipFileInfo = new FileInfo(_zipFileInfo.FullName); ZipOpen = ZipOpenType.Closed; }