Exemple #1
0
        public ProcessForm()
        {
            InitializeComponent();

            // Инициализируем экземпляр класса для упаковки (распаковки) имени файла
            // в префиксный формат
            _eFileNamer = new FileNamer();

            // Создаем экземпляр класса ядра RecoveryStar
            _eRecoveryStarCore = new RecoveryStarCore();

            // Подписываемся на требуемых делегатов
            _eRecoveryStarCore.OnUpdateFileSplittingProgress = new OnUpdateFileSplittingProgressHandler(OnUpdateFileSplittingProgress);
            _eRecoveryStarCore.OnFileSplittingFinish         = new OnFileSplittingFinishHandler(OnFileSplittingFinish);

            _eRecoveryStarCore.OnUpdateRSMatrixFormingProgress = new OnUpdateRSMatrixFormingProgressHandler(OnUpdateRSMatrixFormingProgress);
            _eRecoveryStarCore.OnRSMatrixFormingFinish         = new OnRSMatrixFormingFinishHandler(OnRSMatrixFormingFinish);
            _eRecoveryStarCore.OnUpdateFileCodingProgress      = new OnUpdateFileCodingProgressHandler(OnUpdateFileCodingProgress);
            _eRecoveryStarCore.OnFileCodingFinish = new OnFileCodingFinishHandler(OnFileCodingFinish);

            _eRecoveryStarCore.OnUpdateFileAnalyzeProgress = new OnUpdateFileAnalyzeProgressHandler(OnUpdateFileAnalyzeProgress);
            _eRecoveryStarCore.OnFileAnalyzeFinish         = new OnFileAnalyzeFinishHandler(OnFileAnalyzeFinish);
            _eRecoveryStarCore.OnGetDamageStat             = new OnGetDamageStatHandler(OnGetDamageStat);

            // Инициализируем список файлов для обработки
            _filenamesToProcess = new ArrayList();

            // Считываем значение с элемента управления, ответственного за
            // приоритет процесса обработки данных
            SetThreadPriority(processPriorityComboBox.SelectedIndex);

            // Инициализируем событие прекращения обработки файла
            _exitEvent = new ManualResetEvent[] { new ManualResetEvent(false) };

            // Инициализируем cобытие продолжения обработки файла
            _executeEvent = new ManualResetEvent[] { new ManualResetEvent(false) };

            // Инициализируем cобытие "пробуждения" цикла ожидания
            _wakeUpEvent = new ManualResetEvent[] { new ManualResetEvent(false) };

            // Устанавливаем значение по-умолчанию для приоритета...
            processPriorityComboBox.Text = "По-умолчанию";
            //...и переносим фокус на кнопку, активную по-умолчанию
            pauseButton.Focus();
        }
Exemple #2
0
        static void Main(string[] args)
        {
            Console.WriteLine("_______________________________________________________________________________");
            Console.WriteLine("");
            Console.WriteLine(" R-Star 1.00 D               Copyright (C) 2006 DrAF              19 Sept 2006 ");
            Console.WriteLine("_______________________________________________________________________________");
            Console.WriteLine("");

            // Проверяем на корректность размера строки аргументов
            if (args.Length != 1)
            {
                Console.WriteLine(" Запуск: R-Star <имя файла>");

                return;
            }

            // Создаем экземпляр класса ядра RecoveryStar
            RecoveryStarCore eRecoveryStarCore = new RecoveryStarCore();

            // Создаем экземпляр класса для упаковки (распаковки) имени файла в префиксный формат
            FileNamer eFileNamer = new FileNamer();

            // Подписываемся на требуемых делегатов
            eRecoveryStarCore.OnUpdateFileSplittingProgress = new OnUpdateFileSplittingProgressHandler(OnUpdateFileSplittingProgress);
            eRecoveryStarCore.OnFileSplittingFinish         = new OnFileSplittingFinishHandler(OnFileSplittingFinish);

            eRecoveryStarCore.OnUpdateRSMatrixFormingProgress = new OnUpdateRSMatrixFormingProgressHandler(OnUpdateRSMatrixFormingProgress);
            eRecoveryStarCore.OnRSMatrixFormingFinish         = new OnRSMatrixFormingFinishHandler(OnRSMatrixFormingFinish);
            eRecoveryStarCore.OnUpdateFileCodingProgress      = new OnUpdateFileCodingProgressHandler(OnUpdateFileCodingProgress);
            eRecoveryStarCore.OnFileCodingFinish = new OnFileCodingFinishHandler(OnFileCodingFinish);

            eRecoveryStarCore.OnUpdateFileAnalyzeProgress = new OnUpdateFileAnalyzeProgressHandler(OnUpdateFileAnalyzeProgress);
            eRecoveryStarCore.OnFileAnalyzeFinish         = new OnFileAnalyzeFinishHandler(OnFileAnalyzeFinish);
            eRecoveryStarCore.OnGetDamageStat             = new OnGetDamageStatHandler(OnGetDamageStat);

            // Имя файла для обработки
            String filename = eFileNamer.GetShortFilename(args[0]);

            // Путь к файлам для обработки
            String path = eFileNamer.GetPath(args[0]);

            // Количество основных томов
            int dataCount = 0;

            // Количество томов для восстановления
            int eccCount = 0;

            // Общее количество томов
            int allVolCount = 0;

            // Избыточность в процентах
            int redundancy = 0;

            // Строка, введенная пользователем
            String str;

            // Временное имя файла
            String tempFilename = filename;

            // Если имя файла может быть корректно распаковано из префиксного формата,
            // то файл принадлежит множеству файлов-томов
            if (eFileNamer.Unpack(ref tempFilename, ref dataCount, ref eccCount))
            {
                Console.WriteLine(" Восстановление данных из отказоустойчивого набора томов...");
                Console.WriteLine("");

                // Запускаем восстановление данных
                eRecoveryStarCore.StartToRecover(path, filename, true);
            }
            else
            {
                // Изначально предполагаем, что ввод некорректен
                bool inputOK = false;

                while (!inputOK)
                {
                    Console.Write(" Введите общее количество томов: ");

                    // Считываем строку данных
                    str = Console.ReadLine();

                    // Если пользователь ввел пустую строку - устанавливаем значение по-умолчанию
                    if (str == "")
                    {
                        str = "1024";
                        Console.WriteLine("     Установлено общее количество томов по-умолчанию: 1024");
                        Console.WriteLine("");
                    }
                    else
                    {
                        // Если переданная строка оказалась некорректным значением "Int",
                        // переходим на очередную итерацию ввода
                        if (!IsIntString(str))
                        {
                            Console.WriteLine("     Ошибка: Введенная строка содержит недопустимые символы или слишком длинная!");
                            Console.WriteLine("");

                            continue;
                        }
                    }

                    // Если все нормально - устанавливаем значение
                    allVolCount = Convert.ToInt32(str);

                    // Производим проверку на допустимое количество томов
                    if (
                        (allVolCount >= 3)
                        &&
                        (allVolCount <= 16384)
                        )
                    {
                        inputOK = true;
                    }
                    else
                    {
                        Console.WriteLine("     Ошибка: Общее количество томов должно находиться в диапазоне 3..16384!");
                        Console.WriteLine("");
                    }
                }

                // Изначально предполагаем, что ввод некорректен
                inputOK = false;

                while (!inputOK)
                {
                    Console.Write(" Введите избыточность кодирования в процентах: ");

                    // Считываем строку данных
                    str = Console.ReadLine();

                    // Если пользователь ввел пустую строку - устанавливаем значение по-умолчанию
                    if (str == "")
                    {
                        str = "50";
                        Console.WriteLine("     Установлена избыточность кодирования по-умолчанию: 50 %");
                    }
                    else
                    {
                        // Если переданная строка оказалась некорректным значением "Int",
                        // переходим на очередную итерацию ввода
                        if (!IsIntString(str))
                        {
                            Console.WriteLine("     Ошибка: Введенная строка содержит недопустимые символы или слишком длинная!");
                            Console.WriteLine("");

                            continue;
                        }
                    }

                    // Устанавливаем значение
                    redundancy = Convert.ToInt32(str);

                    // Проверяем установленное значение на корректность
                    if (
                        (redundancy > 0)
                        &&
                        (redundancy <= 100)
                        )
                    {
                        inputOK = true;
                    }
                    else
                    {
                        Console.WriteLine("     Ошибка: Избыточность кодирования должна находиться в диапазоне 1..100 %!");
                        Console.WriteLine("");
                    }
                }

                // Абсолютное значение количества процентов на том
                double percByVol = (double)allVolCount / (double)200;

                // Вычисляем количество томов для восстановления
                eccCount = (int)((double)redundancy * percByVol); // Томов для восстановления

                // В случае необходимости корректируем количество томов для восстановления
                if (eccCount < 1)
                {
                    eccCount = 1;
                }

                // Количество основных томов находим по остаточному принципу
                dataCount = allVolCount - eccCount;

                // Пока количество томов
                while (eccCount >= dataCount)
                {
                    eccCount--;
                    dataCount++;
                }

                Console.WriteLine("");
                Console.WriteLine(" Приняты следующие параметры: ");
                Console.WriteLine(" Основных томов: {0}", dataCount);
                Console.WriteLine(" Томов для восстановления: {0}", eccCount);
                Console.WriteLine("");
                Console.WriteLine("===============================================================================");
                Console.WriteLine("");
                Console.WriteLine(" Создание отказоустойчивого набора томов...");
                Console.WriteLine("");

                // Запускаем отказоустойчивое кодирование
                eRecoveryStarCore.StartToProtect(path, filename, dataCount, eccCount, true);
            }

            // Ждем окончания обработки
            while (eRecoveryStarCore.InProcessing)
            {
                Thread.Sleep(1000);
            }

            // В связи с закрытием большого количества файловых потоков
            // необходимо дождаться записи изменений, внесенных потоком
            // кодирования в тело класса. Поток уже не работает, но
            // установленное им булевское свойство, возможно, ещё
            // "не проявилось". Достаточно необычная ситуация,
            // но факт - вещь упрямая.
            for (int i = 0; i < 900; i++)
            {
                if (!eRecoveryStarCore.Finished)
                {
                    Thread.Sleep(1000);
                }
            }

            Console.WriteLine("_______________________________________________________________________________");
            Console.WriteLine("");

            // Проверяем на корректность завершения обработки
            if (eRecoveryStarCore.ProcessedOK)
            {
                Console.WriteLine(" Обработка файлов завершена успешно!");
            }
            else
            {
                Console.WriteLine(" Ошибка при работе с файлами!");
            }
        }