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