예제 #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
        }
예제 #4
0
        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;
        }
예제 #5
0
        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;
        }