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; }
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(" Ошибка при работе с файлами!"); } }