Beispiel #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();
        }
        /// <summary>
        /// ����������� �����
        /// </summary>
        public ProcessForm()
        {
            InitializeComponent();

            // ��-��������� ����� ��������� �� ����������
            this.mode = RSMode.None;

            // �������������� ��������� ������ ��� �������� (����������) ����� �����
            // � ���������� ������
            this.eFileNamer = new FileNamer();

            // ������� ��������� ������ ���� RecoveryStar
            this.eRecoveryStarCore = new RecoveryStarCore();

            // ������������� �� ��������� ���������
            this.eRecoveryStarCore.OnUpdateFileSplittingProgress = new OnUpdateDoubleValueHandler(OnUpdateFileSplittingProgress);
            this.eRecoveryStarCore.OnFileSplittingFinish = new OnEventHandler(OnFileSplittingFinish);
            this.eRecoveryStarCore.OnUpdateRSMatrixFormingProgress = new OnUpdateDoubleValueHandler(OnUpdateRSMatrixFormingProgress);
            this.eRecoveryStarCore.OnRSMatrixFormingFinish = new OnEventHandler(OnRSMatrixFormingFinish);
            this.eRecoveryStarCore.OnUpdateFileStreamsOpeningProgress = new OnUpdateDoubleValueHandler(OnUpdateFileStreamsOpeningProgress);
            this.eRecoveryStarCore.OnFileStreamsOpeningFinish = new OnEventHandler(OnFileStreamsOpeningFinish);
            this.eRecoveryStarCore.OnStartedRSCoding = new OnEventHandler(OnStartedRSCoding);
            this.eRecoveryStarCore.OnUpdateFileCodingProgress = new OnUpdateDoubleValueHandler(OnUpdateFileCodingProgress);
            this.eRecoveryStarCore.OnFileCodingFinish = new OnEventHandler(OnFileCodingFinish);
            this.eRecoveryStarCore.OnUpdateFileStreamsClosingProgress = new OnUpdateDoubleValueHandler(OnUpdateFileStreamsClosingProgress);
            this.eRecoveryStarCore.OnFileStreamsClosingFinish = new OnEventHandler(OnFileStreamsClosingFinish);
            this.eRecoveryStarCore.OnUpdateFileAnalyzeProgress = new OnUpdateDoubleValueHandler(OnUpdateFileAnalyzeProgress);
            this.eRecoveryStarCore.OnFileAnalyzeFinish = new OnEventHandler(OnFileAnalyzeFinish);
            this.eRecoveryStarCore.OnGetDamageStat = new OnUpdateTwoIntDoubleValueHandler(OnGetDamageStat);

            // ��������� �������� �������� - 1, �������� 1 ����.
            this.processStatSema = new Semaphore(1, 1);

            // �������������� ������ ������ ��� ���������
            this.fileNamesToProcess = new ArrayList();

            // ��������� �������� � �������� ����������, �������������� ��
            // ��������� �������� ��������� ������
            SetThreadPriority(processPriorityComboBox.SelectedIndex);

            // �������������� ������� ����������� ��������� �����
            this.exitEvent = new ManualResetEvent[] {new ManualResetEvent(false)};

            // �������������� c������ ����������� ��������� �����
            this.executeEvent = new ManualResetEvent[] {new ManualResetEvent(false)};

            // �������������� c������ "�����������" ����� ��������
            this.wakeUpEvent = new ManualResetEvent[] {new ManualResetEvent(false)};

            // ������������� �������� ��-��������� ��� ����������
            processPriorityComboBox.Text = "Default";

            this.processProgressBarValue = -1;
        }
Beispiel #3
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(" Ошибка при работе с файлами!");
            }
        }