Пример #1
0
        /// <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;
            }
        }
Пример #2
0
        /// <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;
            }
        }
Пример #3
0
        /// <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;
            }
        }