Exemple #1
0
        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) };
        }
Exemple #3
0
        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) };
        }
Exemple #4
0
        public MainForm()
        {
            InitializeComponent();

            // Инициализируем экземпляр класса для упаковки (распаковки) имени файла
            // в префиксный формат
            _eFileNamer = new FileNamer();
        }
Exemple #5
0
        public MainForm()
        {
            InitializeComponent();

            // Инициализируем экземпляр класса для упаковки (распаковки) имени файла
            // в префиксный формат
            _eFileNamer = new FileNamer();
        }
Exemple #6
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 #7
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 #8
0
        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) };
        }
Exemple #9
0
        /// <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) };
        }
Exemple #10
0
        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 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)};
        }
Exemple #12
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(" Ошибка при работе с файлами!");
            }
        }
        /// <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)};
        }
Exemple #14
0
        /// <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)};
        }
Exemple #17
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(" Ошибка при работе с файлами!");
            }
        }