Exemplo n.º 1
0
        // метод разжатия архива
        private void Decompress(FileStream Input, FileStream Output)
        {
            using (BinaryReader BinaryReader = new BinaryReader(Input))
            {
                // чтение количества блоков из файла
                Int32 BlocksCount = BinaryReader.ReadInt32();

                // цикл по всем блокам
                for (Int32 Index = 0; Index < BlocksCount; ++Index)
                {
                    // новый блок
                    Block Block = new Block();

                    // новая задача
                    Task <Block> Task = new Task <Block>(Block, (CurrentBlock) =>
                    {
                        try
                        {
                            // чтение данных о блоке и чтение самого блока
                            lock (Input)
                            {
                                CurrentBlock.SourceOffset     = BinaryReader.ReadInt64();
                                CurrentBlock.SourceSize       = BinaryReader.ReadInt32();
                                CurrentBlock.CompressedOffset = BinaryReader.ReadInt64();
                                CurrentBlock.CompressedSize   = BinaryReader.ReadInt32();

                                CurrentBlock.CompressedData = new Byte[CurrentBlock.CompressedSize];

                                Input.Seek(CurrentBlock.CompressedOffset, SeekOrigin.Begin);
                                CurrentBlock.CompressedSize = Input.Read(CurrentBlock.CompressedData, 0, CurrentBlock.CompressedSize);
                            }

                            CurrentBlock.Decompress();

                            // запись блока в файл выхода
                            lock (Output)
                            {
                                Output.Seek(CurrentBlock.SourceOffset, SeekOrigin.Begin);
                                Output.Write(CurrentBlock.SourceData, 0, CurrentBlock.SourceSize);
                            }
                        }
                        catch (Exception E)
                        {
                            // ошибка - выход
                            Console.WriteLine($"Error. {E.Message}");
                            Console.ReadKey();

                            Environment.Exit(1);
                        }
                    });

                    // добавляем задачу в менеджер потоков
                    SmartThreadManager.Enqueue(Task);
                }

                // запускаем менеджер потоков
                SmartThreadManager.Start();

                // ждем завершения всех задач
                SmartThreadManager.Wait();
            }
        }