예제 #1
0
        public void Process(MyCancellationToken cancellationToken)
        {
            Interlocked.Increment(ref decompressorThreadsCount);

            while (!cancellationToken.IsCancelled)
            {
                var block = _inputStorage.ReadNext();

                if (block == null)
                {
                    Interlocked.Decrement(ref decompressorThreadsCount);
                    if (decompressorThreadsCount <= 0)
                    {
                        _outputStorage.Close();
                    }
                    return;
                }

                using (var source = new MemoryStream(block.Buffer))
                {
                    using (var decompressionStream = new GZipStream(source,
                                                                    CompressionMode.Decompress))
                    {
                        byte[] newBuffer = new byte[block.UncompressedSize];

                        decompressionStream.Read(newBuffer, 0, newBuffer.Length);
                        var decompressedData = block.Buffer.ToArray();
                        _outputStorage.Add(new DecompressedData {
                            Id = block.Id, Buffer = newBuffer
                        });
                    }
                }
            }
        }
예제 #2
0
        public void Read(string fileName, MyCancellationToken cancellationToken)
        {
            using (var compressedFile = new FileStream(fileName, FileMode.Open))
            {
                while (compressedFile.Position < compressedFile.Length && !cancellationToken.IsCancelled)
                {
                    var lengthBuffer = new byte[8];
                    compressedFile.Read(lengthBuffer, 0, lengthBuffer.Length);
                    var blockLength    = BitConverter.ToInt32(lengthBuffer, 4);
                    var compressedData = new byte[blockLength];
                    lengthBuffer.CopyTo(compressedData, 0);

                    compressedFile.Read(compressedData, 8, blockLength - 8);

                    int    dataSize   = BitConverter.ToInt32(compressedData, blockLength - 4);
                    byte[] lastBuffer = new byte[dataSize];
                    var    _block     = new CompressedData {
                        Buffer = compressedData, UncompressedSize = dataSize
                    };
                    ConsoleIndicator.ShowProgress(compressedFile.Position, compressedFile.Length);
                    _inputStorage.Add(_block);
                }

                _inputStorage.Close();
            }
        }
예제 #3
0
 public GZipService(string fileInput, string fileOutput, IGZipPackager packager, MyCancellationToken cancellationToken)
 {
     _fileInput         = fileInput;
     _fileOutput        = fileOutput;
     _packager          = packager;
     _cancellationToken = cancellationToken;
 }
예제 #4
0
        public void Read(string fileName, MyCancellationToken cancellationToken)
        {
            using (var readFile = new FileStream(fileName, FileMode.Open))
            {
                int bytesRead;

                while (readFile.Position < readFile.Length && !cancellationToken.IsCancelled)
                {
                    if (readFile.Length - readFile.Position <= BlockSize)
                    {
                        bytesRead = (int)(readFile.Length - readFile.Position);
                    }
                    else
                    {
                        bytesRead = BlockSize;
                    }

                    var readBuffer = new byte[bytesRead];
                    readFile.Read(readBuffer, 0, bytesRead);
                    ConsoleIndicator.ShowProgress(readFile.Position, readFile.Length);
                    _inputStorage.Add(new DecompressedData {
                        Buffer = readBuffer
                    });
                }
                _inputStorage.Close();
            }
        }
예제 #5
0
        public void Process(MyCancellationToken cancellationToken)
        {
            Interlocked.Increment(ref compressorThreadsCount);

            while (!cancellationToken.IsCancelled)
            {
                var block = _inputStorage.ReadNext();

                if (block == null)
                {
                    Interlocked.Decrement(ref compressorThreadsCount);
                    if (compressorThreadsCount <= 0)
                    {
                        _outputStorage.Close();
                    }
                    return;
                }

                using (var memoryStream = new MemoryStream())
                {
                    using (var gz = new GZipStream(memoryStream, CompressionMode.Compress))
                    {
                        gz.Write(block.Buffer, 0, block.Buffer.Length);
                    }

                    var compressedData = memoryStream.ToArray();
                    _outputStorage.Add(new CompressedData {
                        Id = block.Id.Value, Buffer = compressedData
                    });
                }
            }
        }
예제 #6
0
        public void Write(string fileName, MyCancellationToken cancellationToken)
        {
            using (var fileStream = new FileStream(fileName, FileMode.Create))
            {
                while (!cancellationToken.IsCancelled)
                {
                    var block = _outputStorage.ReadNext();
                    if (block == null)
                    {
                        return;
                    }

                    fileStream.Write(block.Buffer, 0, block.Buffer.Length);
                }
            }
        }
예제 #7
0
        static void Main(string[] args)
        {
            _cancellationToken = new MyCancellationToken();

            Console.CancelKeyPress += new ConsoleCancelEventHandler(CancelKeyPress);
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

            try
            {
                var command = new Command(args);

                switch (command.Type)
                {
                case CommandTypes.Compress:
                    Console.WriteLine("Compressing...");
                    _iGZipPackager = new GZipCompressor(new BufferStorage <DecompressedData>(_cancellationToken), new BufferStorage <CompressedData>(_cancellationToken));
                    break;

                case CommandTypes.Decompress:
                    Console.WriteLine("Decompressing...");
                    _iGZipPackager = new GZipDecompressor(new BufferStorage <CompressedData>(_cancellationToken), new BufferStorage <DecompressedData>(_cancellationToken));
                    break;

                default:
                    return;
                }

                new GZipService(command.InputFilename, command.OutputFilename, _iGZipPackager, _cancellationToken)
                .Start();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error: {ex.Message}");
                Console.ReadLine();
                return;
            }
        }
예제 #8
0
 public BufferStorage(MyCancellationToken cancellationToken)
 {
     _cancellationToken           = cancellationToken;
     _cancellationToken.OnCancel += _cancellationToken_OnCancel;
 }