示例#1
0
        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;
        }
示例#2
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);
            }
        }
示例#3
0
        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();
        }