private static void Main(string[] args) { if (InputValidator.ValidateInputArgs(args)) { using (var sourceStream = new FileStream(args[1], FileMode.Open, FileAccess.Read)) using (var destinationStream = new FileStream(args[2], FileMode.Create, FileAccess.Write)) { AbstractArchiver archiver; switch (args[0]) { case "compress": archiver = new Compress(sourceStream, destinationStream); archiver.Run(); break; case "decompress": archiver = new Decompress(sourceStream, destinationStream); archiver.Run(); break; } } } Console.ReadKey(); }
void compress() { FileStream sourceStr = new FileStream(sourceFileName, FileMode.Open); StreamWriter indexFile = File.CreateText(destFileName + ".ind");; long count = sourceStr.Length / (buffSize); long ostByte = sourceStr.Length - count * (buffSize); int procCount = Environment.ProcessorCount; long threadPool = count / procCount; long ostBuff = count - threadPool * procCount; sourceStr.Close(); // Готовим класс Compress для работы Compress.Init(sourceFileName, buffSize); // Создаем окружение для работы с потоками Thread[] thrd = new Thread[procCount]; Compress[] compr = new Compress[procCount]; compressArray[] cmprArray = new compressArray[procCount]; for (int i = 0; i < threadPool; i++) { // Собираем пул потоков ставим задачи и запускаем на выполнение for (int thrdNum = 0; thrdNum < procCount; thrdNum++) { compr[thrdNum] = new Compress(); cmprArray[thrdNum] = compr[thrdNum].getCompressByteArray; thrd[thrdNum] = new Thread(new ThreadStart(compr[thrdNum].compress)); thrd[thrdNum].Start(); Thread.Sleep(1); } // Ждем завершения работы потоков, получаем результат. // Пишем массивы сжатых данных в архивный файл // Пишем размеры сжатых массивов в индексный файл for (int thrdNum = 0; thrdNum < procCount; thrdNum++) { thrd[thrdNum].Join(); destStr.Write(cmprArray[thrdNum](), 0, cmprArray[thrdNum]().Length); indexFile.WriteLine(cmprArray[thrdNum]().Length); } // Индикация выполнения int progress = i * Console.BufferWidth / (int)threadPool; Console.SetCursorPosition(progress, 2); Console.Write("*"); } if (ostBuff != 0) { // Собираем пул из остатков потоков ставим задачи и запускаем на выполнение for (int thrdNum = 0; thrdNum < ostBuff; thrdNum++) { compr[thrdNum] = new Compress(); cmprArray[thrdNum] = compr[thrdNum].getCompressByteArray; thrd[thrdNum] = new Thread(compr[thrdNum].compress); thrd[thrdNum].Start(); Thread.Sleep(1); } // Ждем завершения работы потоков, получаем результат. // Пишем массивы сжатых данных в архивный файл // Пишем размеры сжатых массивов в индексный файл for (int thrdNum = 0; thrdNum < ostBuff; thrdNum++) { thrd[thrdNum].Join(); destStr.Write(cmprArray[thrdNum](), 0, cmprArray[thrdNum]().Length); indexFile.WriteLine(cmprArray[thrdNum]().Length); } } // Создаем заключительную часть архива // Отправляем в работу остаток файла длиной меньше размера буфера // Записываем в индексный файл размер сжатых данных и размер несжатых // Отделяем их от остальных индексов if (ostByte != 0) { Compress.setOstBuff(ostByte); Compress cmpr = new Compress(); cmpr.compress(); destStr.Write(cmpr.getCompressByteArray(), 0, cmpr.getCompressByteArray().Length); indexFile.WriteLine("ENDPART"); indexFile.WriteLine(cmpr.getCompressByteArray().Length); indexFile.WriteLine(ostByte); } destStr.Close(); indexFile.Close(); error = 0; }