public ZipReturn ZipFileCreate(string newFilename, bool compressOutput, int dictionarySize = 1 << 24, int numFastBytes = 64) { if (ZipOpen != ZipOpenType.Closed) { return(ZipReturn.ZipFileAlreadyOpen); } DirUtil.CreateDirForFile(newFilename); _zipFileInfo = new FileInfo(newFilename); int errorCode = FileStream.OpenFileWrite(newFilename, out _zipFs); if (errorCode != 0) { ZipFileClose(); return(ZipReturn.ZipErrorOpeningFile); } ZipOpen = ZipOpenType.OpenWrite; _signatureHeader = new SignatureHeader(); _header = new Header(); using (BinaryWriter bw = new BinaryWriter(_zipFs, Encoding.UTF8, true)) { _signatureHeader.Write(bw); } _baseOffset = _zipFs.Position; _compressed = compressOutput; _unpackedStreamSize = 0; if (_compressed) { LzmaEncoderProperties ep = new LzmaEncoderProperties(true, dictionarySize, numFastBytes); LzmaStream lzs = new LzmaStream(ep, false, _zipFs); _codeMSbytes = lzs.Properties; _lzmaStream = lzs; /* * ZstandardStream zss = new ZstandardStream(_zipFs, 22, true); * _codeMSbytes = new byte[] { 1, 4, 18, 0, 0 }; * _lzmaStream = zss; */ _packStreamStart = (ulong)_zipFs.Position; } return(ZipReturn.ZipGood); }
public ZipReturn ZipFileCreate(string newFilename, bool compressOutput) { if (ZipOpen != ZipOpenType.Closed) { return(ZipReturn.ZipFileAlreadyOpen); } DirUtil.CreateDirForFile(newFilename); _zipFileInfo = new FileInfo(newFilename); int errorCode = FileStream.OpenFileWrite(newFilename, out _zipFs); if (errorCode != 0) { ZipFileClose(); return(ZipReturn.ZipErrorOpeningFile); } ZipOpen = ZipOpenType.OpenWrite; _signatureHeader = new SignatureHeader(); _header = new Header(); BinaryWriter bw = new BinaryWriter(_zipFs); _signatureHeader.Write(bw); _compressed = compressOutput; _unpackedStreamSize = 0; if (_compressed) { LzmaEncoderProperties ep = new LzmaEncoderProperties(true, 1 << 24, 64); _lzmaStream = new LzmaStream(ep, false, _zipFs); _codeMSbytes = _lzmaStream.Properties; _packStreamStart = (ulong)_zipFs.Position; } return(ZipReturn.ZipGood); }
private void CloseWriting7Zip() { if (_compressed) { _lzmaStream.Close(); } _packStreamSize = (ulong)_zipFs.Position - _packStreamStart; Create7ZStructure(); byte[] newHeaderByte; using (Stream headerMem = new MemoryStream()) { using (BinaryWriter headerBw = new BinaryWriter(headerMem, Encoding.UTF8, true)) { _header.WriteHeader(headerBw); newHeaderByte = new byte[headerMem.Length]; headerMem.Position = 0; headerMem.Read(newHeaderByte, 0, newHeaderByte.Length); } } uint mainHeaderCRC = CRC.CalculateDigest(newHeaderByte, 0, (uint)newHeaderByte.Length); #region Header Compression long packedHeaderPos = _zipFs.Position; LzmaEncoderProperties ep = new LzmaEncoderProperties(true, GetDictionarySizeFromUncompressedSize((ulong)newHeaderByte.Length), 64); LzmaStream lzs = new LzmaStream(ep, false, _zipFs); byte[] lzmaStreamProperties = lzs.Properties; lzs.Write(newHeaderByte, 0, newHeaderByte.Length); lzs.Close(); StreamsInfo streamsInfo = new StreamsInfo { PackPosition = (ulong)(packedHeaderPos - _baseOffset), Folders = new[] { new Folder { BindPairs = new BindPair[0], Coders = new [] { new Coder { Method = new byte[] { 3, 1, 1 }, NumInStreams = 1, NumOutStreams = 1, Properties = lzmaStreamProperties } }, UnpackedStreamSizes = new[] { (ulong)newHeaderByte.Length }, UnpackCRC = mainHeaderCRC } }, PackedStreams = new[] { new PackedStreamInfo { PackedSize = (ulong)(_zipFs.Position - packedHeaderPos), StreamPosition = 0 } } }; using (Stream headerMem = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(headerMem, Encoding.UTF8, true)) { bw.Write((byte)HeaderProperty.kEncodedHeader); streamsInfo.WriteHeader(bw); newHeaderByte = new byte[headerMem.Length]; headerMem.Position = 0; headerMem.Read(newHeaderByte, 0, newHeaderByte.Length); } } mainHeaderCRC = CRC.CalculateDigest(newHeaderByte, 0, (uint)newHeaderByte.Length); #endregion using (BinaryWriter bw = new BinaryWriter(_zipFs, Encoding.UTF8, true)) { ulong headerPosition = (ulong)_zipFs.Position + 32; //tzip header is 32 bytes WriteRomVault7Zip(bw, headerPosition, (ulong)newHeaderByte.Length, mainHeaderCRC); _zipFs.Write(newHeaderByte, 0, newHeaderByte.Length); _signatureHeader.WriteFinal(bw, headerPosition, (ulong)newHeaderByte.Length, mainHeaderCRC); } _zipFs.Flush(); _zipFs.Close(); _zipFs.Dispose(); }