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 }); } } } }
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(); } }
public GZipService(string fileInput, string fileOutput, IGZipPackager packager, MyCancellationToken cancellationToken) { _fileInput = fileInput; _fileOutput = fileOutput; _packager = packager; _cancellationToken = cancellationToken; }
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(); } }
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 }); } } }
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); } } }
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; } }
public BufferStorage(MyCancellationToken cancellationToken) { _cancellationToken = cancellationToken; _cancellationToken.OnCancel += _cancellationToken_OnCancel; }