/// <summary> /// Запускает работу распаковщика блоков. /// <remarks>Берет очередной блок из очереди на считывании, распаковывает его и добавляет в очередь блоков на запись.</remarks> /// </summary> public void Start() { try { while (true) { var block = _readBlocksQueue.GetNextBlock(); if (block == null) { return; } using (var outMemoryStream = new MemoryStream(block.CompressedData)) { using (var gzipStream = new GZipStream(outMemoryStream, CompressionMode.Decompress)) { gzipStream.Read(block.Data, 0, block.Data.Length); } _writeBlocksQueue.AddBlock(block); } } } catch (Exception exception) { Log.Error($"При распаковке блока возникла ошибка: {exception.Message}", exception); throw; } }
/// <summary> /// Записывает блоки в файл. /// <remarks>Берет блоки из очереди и записывает их. В блоки помещает длину сжатых данных.</remarks> /// </summary> public void Write() { try { using (var fileStream = File.Create(_filePath)) { while (true) { var block = _writeBlocksQueue.GetNextBlock(); if (block == null) { return; } var compressedData = block.CompressedData; var compressedBlockLength = compressedData.Length; var compressedBlockLengthBytes = BitConverter.GetBytes(compressedBlockLength); compressedBlockLengthBytes.CopyTo(compressedData, BlockParameters.GZIP_BLOCK_LENGTH_OFFSET); fileStream.Write(compressedData, 0, compressedBlockLength); } } } catch (Exception exception) { Log.Error($"При записи в файл {_filePath} произошла ошибка: {exception.Message}", exception); throw; } }
/// <summary> /// Записывает блоки в файл. /// <remarks>Берет блоки из очереди и записывает их.</remarks> /// </summary> public void Write() { try { using (var fileStream = File.Create(_filePath)) { while (true) { var block = _writeBlocksQueue.GetNextBlock(); if (block == null) { return; } fileStream.Write(block.Data, 0, block.Data.Length); } } } catch (Exception exception) { Log.Error($"При записи в файл {_filePath} произошла ошибка: {exception.Message}", exception); throw; } }