private Result Decompress(string sourceFileName, string destinationFileName) { try { using (ChunkManager chunkManager = new ChunkManager(_processorCount)) { using (var compressedReader = new CompressedReader(sourceFileName, _marker)) { using (var processedWriter = new BlockWriter(_marker, destinationFileName)) { var readFirstResult = compressedReader.ReadFirst(); if (readFirstResult.IsFailure) { return(readFirstResult); } for (int i = 0; i < compressedReader.TotalBlockCount; i++) { var nextBlockResult = compressedReader.ReadNext(); if (nextBlockResult.IsFailure) { return(Result.Fail(nextBlockResult.Error)); } var nextBlock = nextBlockResult.Value; var workBlockForDecompression = new BlockDecompressor(processedWriter, nextBlock.BlockIndex, nextBlock.ActualReadSize, nextBlock.ReadBlockData, compressedReader.MaxBlockSize); var startThreadResult = chunkManager.AddBlockAndTryToProcess(workBlockForDecompression); if (startThreadResult.IsFailure) { return(Result.Fail(startThreadResult.Error)); } chunkManager.StartUnstartedChunksAndCountRemained(); if (chunkManager.Status.IsFailure) { return(chunkManager.Status); } chunkManager.RemoveWrittenChunks(); } while (chunkManager.StartUnstartedChunksAndCountRemained() > 0) { Thread.Sleep(10); } chunkManager.WaitingUnfinishedChunks(); if (processedWriter.Status.IsFailure) { return(processedWriter.Status); } chunkManager.StartUnstartedChunksAndCountRemained(); if (chunkManager.Status.IsFailure) { return(chunkManager.Status); } } } } } catch (Exception ex) { return(Result.Fail($"Decompressing error: {ex.Message}")); } return(Result.Ok()); }
static void Main(string[] args) { Console.CancelKeyPress += CancelKeyPress; var stopwatch = new Stopwatch(); try { Console.WriteLine(); CompressionMode compressMode; FileInfo inFile, outFile; ParseCmdLineParams(args, out inFile, out outFile, out compressMode); WorkerPool workerPool = new WorkerPool(); BaseReader reader = null; stopwatch.Start(); Console.WriteLine("Start"); Console.WriteLine(); if (compressMode == CompressionMode.Compress) { _writer = new CompressedWriter(); _writer.StartWrite(outFile, workerPool.OutQueue); workerPool.Start <CompressWorker>(); reader = new RawReader(); reader.StartRead(inFile, workerPool.InQueue); } else if (compressMode == CompressionMode.Decompress) { _writer = new RawWriter(); _writer.StartWrite(outFile, workerPool.OutQueue); workerPool.Start <DecompressWorker>(); reader = new CompressedReader(); reader.StartRead(inFile, workerPool.InQueue); } while (!_canceled && !Logger.ErrorFixed) { _writer.BlockWrittenEvent.WaitOne(TimeSpan.FromSeconds(1)); if (reader.Done && reader.BlocksRead == _writer.BlocksWritten) { break; } else if (_writer.BlockWrittenEvent.WaitOne(0)) { _writer.BlockWrittenEvent.Reset(); } } } catch (Exception ex) { Logger.TraceError(string.Format("Global error: {0}", ex.ToString())); } if (_canceled || Logger.ErrorFixed) { Logger.DisableOutput(); if (_writer != null) { _writer.Cancel(); } } PrintFooter(stopwatch); Environment.Exit(0); }