public FileCodec() { // Инициализируем экземпляр класса для упаковки (распаковки) имени файла // в префиксный формат _eFileNamer = new FileNamer(); // Путь к файлам для обработки по-умолчанию пустой _path = ""; // Инициализируем имя файла по-умолчанию _filename = "NONAME"; // Экземляр класса полностью закончил обработку? _finished = true; // Обработка произведена корректно? _processedOK = false; // По-умолчанию устанавливается фоновый приоритет _threadPriority = 0; // Инициализируем событие прекращения обработки файлов _exitEvent = new ManualResetEvent[] { new ManualResetEvent(false) }; // Инициализируем cобытие продолжения обработки файлов _executeEvent = new ManualResetEvent[] { new ManualResetEvent(false) }; // Инициализируем cобытие "пробуждения" цикла ожидания _wakeUpEvent = new ManualResetEvent[] { new ManualResetEvent(false) }; // Событие, устанавливаемое по завершении обработки _finishedEvent = new ManualResetEvent[] { new ManualResetEvent(true) }; }
public RecoveryStarCore() { // Модуль для упаковки (распаковки) имени файла в префиксный формат _eFileNamer = new FileNamer(); // Модуль вычисления и контроля сигнатуры целостности файла CRC-64 _eFileAnalyzer = new FileAnalyzer(); // RAID-подобный файловый кодер _eFileCodec = new FileCodec(); // Модуль разбиения (склеивания) файлов на тома _eFileSplitter = new FileSplitter(); // Экземляр класса полностью закончил обработку? _finished = true; // Обработка произведена корректно? _processedOK = false; // По-умолчанию устанавливается фоновый приоритет _threadPriority = 0; // Инициализируем событие прекращения обработки файла _exitEvent = new ManualResetEvent[] { new ManualResetEvent(false) }; // Инициализируем cобытие продолжения обработки файла _executeEvent = new ManualResetEvent[] { new ManualResetEvent(false) }; // Инициализируем cобытие "пробуждения" цикла ожидания _wakeUpEvent = new ManualResetEvent[] { new ManualResetEvent(false) }; // Событие, устанавливаемое по завершении обработки _finishedEvent = new ManualResetEvent[] { new ManualResetEvent(true) }; }
public MainForm() { InitializeComponent(); // Инициализируем экземпляр класса для упаковки (распаковки) имени файла // в префиксный формат _eFileNamer = new FileNamer(); }
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(); }
public FileSplitter() { // Создаем экземпляр класса для формирования имени тома _eFileNamer = new FileNamer(); // Путь к файлам для обработки по-умолчанию пустой _path = ""; // Инициализируем имя файла по-умолчанию _filename = "NONAME"; // Размер файлового буфера (по-умолчанию) - 64 Мб _bufferLength = (64 * 1024 * 1024); // Выделяем память под файловый буфер _buffer = new byte[_bufferLength]; // В переменной Int64 содержится 8 байт _dataLengthArr = new byte[8]; // Экземляр класса полностью закончил обработку? _finished = true; // Обработка произведена корректно? _processedOK = false; // По-умолчанию устанавливается фоновый приоритет _threadPriority = 0; // Инициализируем событие прекращения обработки файлов _exitEvent = new ManualResetEvent[] { new ManualResetEvent(false) }; // Инициализируем cобытие продолжения обработки файлов _executeEvent = new ManualResetEvent[] { new ManualResetEvent(false) }; // Событие, устанавливаемое по завершении обработки _finishedEvent = new ManualResetEvent[] { new ManualResetEvent(true) }; }
/// <summary> /// Конструктор класса проверки целостности набора файлов /// </summary> public FileAnalyzer() { // Модуль для упаковки (распаковки) имени файла в префиксный формат _eFileNamer = new FileNamer(); // Создаем экземпляр класса контроля целостности набора файлов _eFileIntegrityCheck = new FileIntegrityCheck(); // Путь к файлам для обработки по-умолчанию пустой _path = ""; // Инициализируем имя файла по-умолчанию _filename = "NONAME"; // Изначально все тома для восстановления считаем поврежденными _allEccVolsOK = false; // Экземляр класса полностью закончил обработку? _finished = true; // Обработка произведена корректно? _processedOK = false; // По-умолчанию устанавливается фоновый приоритет _threadPriority = 0; // Инициализируем событие прекращения обработки файлов _exitEvent = new ManualResetEvent[] { new ManualResetEvent(false) }; // Инициализируем cобытие продолжения обработки файлов _executeEvent = new ManualResetEvent[] { new ManualResetEvent(false) }; // Инициализируем cобытие "пробуждения" цикла ожидания _wakeUpEvent = new ManualResetEvent[] { new ManualResetEvent(false) }; // Событие, устанавливаемое по завершении обработки _finishedEvent = new ManualResetEvent[] { new ManualResetEvent(true) }; }
/// <summary> /// ����������� ������ /// </summary> public FileSplitter() { // ������������� ������ CBC-����� ��-��������� this.cbcBlockSize = defCbcBlockSize; // ������� ��������� ������ ��� ������������ ����� ���� this.eFileNamer = new FileNamer(); // ���� � ������ ��� ��������� ��-��������� ������ this.path = ""; // �������������� ��� ����� ��-��������� this.fileName = "NONAME"; // �������� ������ ��������� �������� ���������? this.finished = true; // ��������� ����������� ���������? this.processedOK = false; // ��-��������� ��������������� ������� ��������� this.threadPriority = 0; // �������������� ������� ����������� ��������� ������ this.exitEvent = new ManualResetEvent[] {new ManualResetEvent(false)}; // �������������� c������ ����������� ��������� ������ this.executeEvent = new ManualResetEvent[] {new ManualResetEvent(false)}; // �������, ��������������� �� ���������� ��������� this.finishedEvent = new ManualResetEvent[] {new ManualResetEvent(true)}; }
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(" Ошибка при работе с файлами!"); } }
/// <summary> /// ����������� ������ /// </summary> public RecoveryStarCore() { // ������ ��� �������� (����������) ����� ����� � ���������� ������ this.eFileNamer = new FileNamer(); // ������ ���������� � �������� ��������� ����������� ����� CRC-64 this.eFileAnalyzer = new FileAnalyzer(); // RAID-�������� �������� ����� this.eFileCodec = new FileCodec(); // ������ ��������� (����������) ������ �� ���� this.eFileSplitter = new FileSplitter(); // �������� ������ ��������� �������� ���������? this.finished = true; // ��������� ����������� ���������? this.processedOK = false; // ��-��������� ��������������� ������� ��������� this.threadPriority = 0; // �������������� ������� ����������� ��������� ����� this.exitEvent = new ManualResetEvent[] {new ManualResetEvent(false)}; // �������������� c������ ����������� ��������� ����� this.executeEvent = new ManualResetEvent[] {new ManualResetEvent(false)}; // �������������� c������ "�����������" ����� �������� this.wakeUpEvent = new ManualResetEvent[] {new ManualResetEvent(false)}; // �������, ��������������� �� ���������� ��������� this.finishedEvent = new ManualResetEvent[] {new ManualResetEvent(true)}; }
/// <summary> /// ����������� ����� /// </summary> public MainForm() { InitializeComponent(); // ������� ����� ����� ������ this.ePasswordForm = new PasswordForm(); // �������������� ��������� ������ ��� �������� (����������) ����� ����� // � ���������� ������ this.eFileNamer = new FileNamer(); // �������������� �������, �������� ����������� �������� ������� ���� � ������������, // ��������� ������������ this.allVolCountTrackBarValuesArr = new int[(allVolCountMacTrackBar.Maximum + 1)]; // ������ ��������� �������� ������� ������ � ��������� �������� �������� int p1 = 2, p2 = 3; for(int i = 0; i < allVolCountMacTrackBar.Maximum; i += 2) { // ��� ��������� �������� �������� ���������� ����� �������������� ��� // ������� ������, ��� ������ �������� - ��� ��������� ������������� ����� // �������� this.allVolCountTrackBarValuesArr[i + 0] = p1; this.allVolCountTrackBarValuesArr[i + 1] = p2; // ���������� ������� �������� p1 <<= 1; p2 <<= 1; } // ���������� �� ������������ � ����� ������� this.allVolCountTrackBarValuesArr[allVolCountMacTrackBar.Maximum] = p1; this.redundancyTrackBarValuesArr = new int[(redundancyMacTrackBar.Maximum + 1)]; for(int i = 0; i <= redundancyMacTrackBar.Maximum; i++) { this.redundancyTrackBarValuesArr[i] = (i + 1) * 5; } }
/// <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; }
/// <summary> /// ����������� ������ /// </summary> public FileAnalyzer() { // ������ ��� �������� (����������) ����� ����� � ���������� ������ this.eFileNamer = new FileNamer(); // ������� ��������� ������ �������� ����������� ������ ������ this.eFileIntegrityCheck = new FileIntegrityCheck(); // ���� � ������ ��� ��������� ��-��������� ������ this.path = ""; // �������������� ��� ����� ��-��������� this.fileName = "NONAME"; // ���������� ��� ���� ��� �������������� ������� ������������� this.allEccVolsOK = false; // �������� ������ ��������� �������� ���������? this.finished = true; // ��������� ����������� ���������? this.processedOK = false; // ��-��������� ��������������� ������� ��������� this.threadPriority = 0; // �������������� ������� ����������� ��������� ������ this.exitEvent = new ManualResetEvent[] {new ManualResetEvent(false)}; // �������������� c������ ����������� ��������� ������ this.executeEvent = new ManualResetEvent[] {new ManualResetEvent(false)}; // �������������� c������ "�����������" ����� �������� this.wakeUpEvent = new ManualResetEvent[] {new ManualResetEvent(false)}; // �������, ��������������� �� ���������� ��������� this.finishedEvent = new ManualResetEvent[] {new ManualResetEvent(true)}; }