void decompress() { StreamReader indexFile = new StreamReader(sourceFileName + ".ind"); Decompress.Init(sourceFileName, buffSize); string line; int prcCount = Environment.ProcessorCount; int[] index = new int[prcCount]; int count = 0; while ((line = indexFile.ReadLine()) != "ENDPART") { index[count] = int.Parse(line); count++; if (count == prcCount - 1) { goToThreads(index, count); count = 0; } } // Проверяем наличие несобранного пула после завершения чтения if (count > 0) { goToThreads(index, count); } // Распаковываем последний том архива int endPartIndex = int.Parse(indexFile.ReadLine()); int endBuff = int.Parse(indexFile.ReadLine()); Decompress.setOstBuff(endBuff); Decompress dec = new Decompress(endPartIndex); dec.decompress(); destStr.Write(dec.getDecompressByte(), 0, dec.getDecompressByte().Length); destStr.Close(); indexFile.Close(); error = 0; }
private void goToThreads(int[] index, int count) { Thread[] thrd = new Thread[count]; Decompress[] decompr = new Decompress[count]; decompressArray[] decomprArray = new decompressArray[count]; // Собираем пул потоков ставим задачи и запускаем на выполнение for (int thrdNum = 0; thrdNum < count; thrdNum++) { decompr[thrdNum] = new Decompress(index[thrdNum]); decomprArray[thrdNum] = decompr[thrdNum].getDecompressByte; thrd[thrdNum] = new Thread(new ThreadStart(decompr[thrdNum].decompress)); thrd[thrdNum].Start(); Thread.Sleep(1); } // Ждем завершения работы потоков и получаем результат for (int thrdNum = 0; thrdNum < count; thrdNum++) { thrd[thrdNum].Join(); destStr.Write(decomprArray[thrdNum](), 0, decomprArray[thrdNum]().Length); } }
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(); }