예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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
        }