static int Main(string[] args) { if (args.Length != 3 || false) { "Please specify all input arguments.".PrintOnConsole(); return(1); } // args = new[] { "compress", "G:\\Win10.vhd", "G:\\ArchivedVHD.arh" }; // args = new[] { "decompress", "G:\\ArchivedVHD.arh", "K:\\DecompressedVHD.vhd" }; // args = new[] { "compress", "G:\\Input.txt", "G:\\InputArc.txt" }; //args = new[] { "decompress", "G:\\InputArc.txt", "G:\\DecompressedInput.txt" }; switch (args[0]) { case "compress": { var fileToArchive = args[1]; var archiveName = args[2]; var fileReader = new FileReader(fileToArchive); var inpuQueues = QueueProvider.GetQueues(Configuration.CountOfCompressors, Configuration.QueueBufferLength); var reader = FileReaderProvider.StartReader(fileReader, inpuQueues, Configuration.BlockSize); var outputQueues = QueueProvider.GetQueues(Configuration.CountOfCompressors, Configuration.QueueBufferLength); var compressors = Enumerable.Zip(inpuQueues, outputQueues, (a, b) => (inQueue: a, outQueue: b)) .Select(i => CompressorProvider.StartCompressor(i.inQueue, i.outQueue, CompressionLevel.Optimal)) .ToArray(); var fileWriter = new ArchiveFileWriter(new FileWriter(archiveName)); var writer = FileWriterProvider.StartWriting(fileWriter, outputQueues); var monitor = MonitorProvider.StartMonitor(inpuQueues, outputQueues); writer.Join(); break; } case "decompress": { var archiveName = args[1]; var outputFileName = args[2]; var inpuCompressedQueues = QueueProvider.GetQueues(Configuration.CountOfDecompressors, Configuration.QueueBufferLength); var archiveReader = FileReaderProvider.StartReader(new ArchiveFileReader(new FileReader(archiveName)), inpuCompressedQueues, Configuration.BlockSize + 100); var outputDecompressedQueues = QueueProvider.GetQueues(Configuration.CountOfDecompressors, Configuration.QueueBufferLength); var decompressors = Enumerable.Zip(inpuCompressedQueues, outputDecompressedQueues, (a, b) => (inQueue: a, outQueue: b)) .Select(i => DecompressorProvider.StartDecompressor(i.inQueue, i.outQueue, Configuration.BlockSize)) .ToArray(); var decompressedWriter = FileWriterProvider.StartWriting(new FileWriter(outputFileName), outputDecompressedQueues); var monitor = MonitorProvider.StartMonitor(inpuCompressedQueues, outputDecompressedQueues); decompressedWriter.Join(); break; } default: break; } return(0); }