/// <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 Read() { try { using (var fileStream = new FileStream(_filePath, FileMode.Open)) { var currentIndex = 0; while (fileStream.Position != fileStream.Length) { var blockLength = Math.Min(BlockParameters.BLOCK_SIZE, fileStream.Length - fileStream.Position); var blockData = new byte[blockLength]; fileStream.Read(blockData, 0, blockData.Length); var block = new Block(blockData, currentIndex); _readBlocksQueue.AddBlock(block); currentIndex++; } } } catch (Exception exception) { Log.Error($"При считывании файла {_filePath} произошла ошибка: {exception.Message}", exception); throw; } }
/// <summary> /// Считывает файл поблочно. /// <remarks>Считанные блоки записывает в очередь. Из блоков извлекается информация о длине исходного блока и сжатого.</remarks> /// </summary> public void Read() { try { using (var fileStream = new FileStream(_filePath, FileMode.Open)) { var currentIndex = 0; while (fileStream.Position != fileStream.Length) { var blockLengthBuffer = new byte[BlockParameters.GZIP_BLOCK_HEADER_SIZE]; fileStream.Read(blockLengthBuffer, 0, blockLengthBuffer.Length); var compressedBlockLength = BitConverter.ToInt32(blockLengthBuffer, BlockParameters.GZIP_BLOCK_LENGTH_OFFSET); var compressedBlockData = new byte[compressedBlockLength]; blockLengthBuffer.CopyTo(compressedBlockData, 0); fileStream.Read(compressedBlockData, BlockParameters.GZIP_BLOCK_HEADER_SIZE, compressedBlockLength - BlockParameters.GZIP_BLOCK_HEADER_SIZE); var blockLength = BitConverter.ToInt32(compressedBlockData, compressedBlockLength - BlockParameters.GZIP_BLOCK_LENGTH_OFFSET); var block = new Block(compressedBlockData, blockLength, currentIndex); _readBlocksQueue.AddBlock(block); currentIndex++; } } } catch (Exception exception) { Log.Error($"При считывании файла {_filePath} произошла ошибка: {exception.Message}", exception); throw; } }