예제 #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 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;
            }
        }
예제 #3
0
        /// <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;
            }
        }