/// <summary> /// Compression of a block method that is used as callback for <see cref="CollectionProcessorThreadPool{T}"/> /// </summary> /// <param name="block">Processing block</param> protected override void ProcessBlock(ByteBlock block) { if (block == null || IsAborted) { return; } using (var memoryStream = new MemoryStream()) { using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress)) { gZipStream.Write(block.Buffer, 0, block.Buffer.Length); } var compressedBlock = memoryStream.ToArray().AddByteBlockLengthHeader(); OutputBlocks.Add(block.BlockNumber, compressedBlock); } }
/// <summary> /// Decompression of a block method that is used as callback for <see cref="CollectionProcessorThreadPool{T}"/> /// </summary> /// <param name="block">Processing block</param> protected override void ProcessBlock(ByteBlock block) { if (block == null || IsAborted) { return; } using (var memoryStream = new MemoryStream(block.Buffer)) { var decompressedBlock = block.IsLast ? new byte[OriginalLastBlockLength] : new byte[OriginalBlockSize]; using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress)) { gZipStream.Read(decompressedBlock, 0, decompressedBlock.Length); } OutputBlocks.Add(block.BlockNumber, decompressedBlock); } }
/// <summary> /// Writes to a destination file /// </summary> /// <param name="destinationFileInfo">Destination file</param> protected override void WriteToDestination(FileInfo destinationFileInfo) { using (var fileStream = new FileStream(destinationFileInfo.FullName, FileMode.Create)) { var nextBlockNumber = 0; while (!IsAborted) { var result = OutputBlocks.TryTakeAndRemove(nextBlockNumber, out var block, true); if (!result) { break; } nextBlockNumber++; fileStream.Write(block, 0, block.Length); } } }
public override int GetHashCode() { unchecked { return(((Header != null ? Header.GetHashCode() : 0) * 397) ^ (OutputBlocks != null ? OutputBlocks.GetHashCode() : 0)); } }