// Восстановить файлы/каталоги с помощью полного типа резервирования public static bool RestoreFull(ref Scenario scenario) { string Destination; int version; if (scenario.Zip) { Destination = Path.GetDirectoryName(scenario.Destination) + "\\" + MakeCopy.exclude(scenario.Title); } else { Destination = scenario.Destination + exclude(scenario.Title); } // Определить самую последнюю копию version = GetLastVersion(Destination); // При необходимости переспросить у пользователя, какую версию использовать if (version > 1) { FormVersion FV = new FormVersion(); for (int i = 0; i < version; i++) { FV.comboBox.Items.Add(i + 1); } FV.comboBox.SelectedIndex = version - 1; FV.ShowDialog(); version = FV.comboBox.SelectedIndex + 1; } // Сделать зеркальное восстановление return(RestoreMirror(ref scenario, version.ToString())); }
// Восстановить файлы/каталоги с помощью зеркального типа резервирования public static bool RestoreMirror(ref Scenario scenario, string version = "") { string Destination = scenario.Destination + exclude(scenario.Title); if (scenario.Zip) { Destination = Path.GetDirectoryName(scenario.Destination) + "\\" + MakeCopy.exclude(scenario.Title) + version + "\\" + Path.GetFileName(scenario.Destination); } ZipTarget = false; if (scenario.Zip) { ZipSource = true; // Проверить контрольную сумму if (!SHA512X.CheckSHA512(scenario.Destination)) { if (MessageBox.Show("Продолжить?", "Контрольная сумма архива повреждена или отсутствует", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) { return(false); } } try { zip = ZipFile.Open(scenario.Destination, ZipArchiveMode.Read); } catch { MessageBox.Show("Файл копии не найден", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); } Destination = ""; } else { ZipSource = false; }; // Для всех файлов и каталогов из списка сделать точную копию (с созданием соответствующего подкаталога) bool result = true; foreach (var filename in scenario.Source) { if (filename[0] == '*') { result &= RestoreDir(filename.Substring(1), Destination, version); } else { result &= RestoreFile(filename, Destination, version, true); } } if (zip != null) { zip.Dispose(); } return(result); }
private void buttonRestore_Click(object sender, EventArgs e) { ///!!! //MessageBox.Show("Восстановление данных по выбранному сценарию", "Справка"); if (listBoxScenario.SelectedIndex < 0) { return; } Scenario s = list[listBoxScenario.SelectedIndex]; switch (s.scenarioType) { case ScenarioType.полный: MakeCopy.RestoreFull(ref s); break; case ScenarioType.инкрементальный: MakeCopy.RestoreIncremental(ref s); break; case ScenarioType.дифференциальный: MakeCopy.RestoreDifferential(ref s); break; case ScenarioType.зеркальный: MakeCopy.RestoreMirror(ref s); break; } ; NextStep = true; }
private void buttonCopy_Click(object sender, EventArgs e) { //MessageBox.Show("Произведено резервное копирование по выбранному сценарию", "Справка"); if (listBoxScenario.SelectedIndex < 0) { return; } Scenario s = list[listBoxScenario.SelectedIndex]; switch (s.scenarioType) { case ScenarioType.полный: if (!MakeCopy.CopyFull(ref s)) { MessageBox.Show("Копия не сделана"); } break; case ScenarioType.инкрементальный: MakeCopy.CopyIncremental(ref s); break; case ScenarioType.дифференциальный: MakeCopy.CopyDifferential(ref s); break; case ScenarioType.зеркальный: MakeCopy.CopyMirror(ref s); break; } ; NextStep = true; }
//-----------------------------------------------------------------------------------------// // Копировать файлы/каталоги с помощью полного типа резервирования public static bool CopyFull(ref Scenario scenario) { string Destination; int version; if (scenario.Zip) { Destination = Path.GetDirectoryName(scenario.Destination) + "\\" + MakeCopy.exclude(scenario.Title); } else { Destination = scenario.Destination + exclude(scenario.Title); } // Определить последнюю версию version = GetLastVersion(Destination); if (IsIdentical(ref scenario, (version).ToString(), false)) { return(false); } // Сделать зеркальную копию в новое место return(CopyMirror(ref scenario, (version + 1).ToString())); }
bool CheckValidPath(ref Scenario s) { //Типичные зловредности обычного пользователя if (s.Destination == "") { MessageBox.Show("Не задано место размещения резервной копии", s.Title); return(false); } if (!s.Zip) { if (s.Destination[s.Destination.Length - 1] != '\\') { s.Destination += "\\"; } string Destination = s.Destination + MakeCopy.exclude(s.Title); if (Directory.Exists(Destination)) { return(true); } try { Directory.CreateDirectory(Destination); return(true); } catch { MessageBox.Show("Это какое-то неправильное место: " + Destination, s.Title); return(false); } } else { if (s.Destination[s.Destination.Length - 1] == '\\') { MessageBox.Show("Не задан файл для размещения резервной копии", s.Title); return(false); } string Destination = Path.GetDirectoryName(s.Destination) + "\\" + MakeCopy.exclude(s.Title) + Path.GetFileName(s.Destination); if (File.Exists(Destination)) { return(true); } try { File.WriteAllText(Destination, "Test File Create"); File.Delete(Destination); return(true); } catch { MessageBox.Show("Это какой-то неправильный файл: " + Destination, s.Title); return(false); } } }
private void buttonRestore_Click(object sender, EventArgs e) { // Восстановление данных по выбранному сценарию if (listBoxScenario.SelectedIndex < 0) { return; } Scenario s = list[listBoxScenario.SelectedIndex]; labelState.Text = "Восстановление " + s.Title; switch (s.scenarioType) { case ScenarioType.зеркальный: MakeCopy.RestoreMirror(ref s); break; case ScenarioType.полный: MakeCopy.RestoreFull(ref s); break; case ScenarioType.инкрементальный: MakeCopy.RestoreIncremental(ref s); break; case ScenarioType.дифференциальный: MakeCopy.RestoreDifferential(ref s); break; } ; NextStep = true; labelState.Text = "Восстановление завершено"; // Добавить в журнал сообщение о восстановлении using (StreamWriter sw = new StreamWriter(new FileStream(textBoxLogFile.Text, FileMode.Append))) { foreach (string log in MakeCopy.Log) { sw.WriteLine(log); } MakeCopy.Log.Clear(); sw.Write(DateTime.Now.ToString() + " "); sw.Write(s.ToString() + " "); sw.Write(" восстановление завершено"); sw.WriteLine(); } if (checkBoxMail.Checked) { try { Mailer.SendMail( textBoxSMTP.Text, textBoxSender.Text, textBoxPassword.Text, textBoxEMail.Text, "Резервное копирование: " + DateTime.Now.ToString() + " восстановление ", s.ToString(), textBoxLogFile.Text ); labelState.Text += Environment.NewLine + "Почта отправлена!"; } catch (Exception ee) { MessageBox.Show(ee.Message); } } }
//-----------------------------------------------------------------------------------------// // Копировать файлы/каталоги с помощью зеркального типа резервирования public static bool CopyMirror(ref Scenario scenario, string version = "") { string Destination = scenario.Destination + exclude(scenario.Title); if (scenario.Zip) { Destination = Path.GetDirectoryName(scenario.Destination) + "\\" + MakeCopy.exclude(scenario.Title) + version + "\\" + Path.GetFileName(scenario.Destination); } ZipSource = false; zip = null; if (scenario.Zip) { ZipTarget = true; if (File.Exists(scenario.Destination)) { File.Delete(scenario.Destination); } try { Directory.CreateDirectory(Path.GetDirectoryName(Destination)); zip = ZipFile.Open(Destination, ZipArchiveMode.Create); } catch { return(false); } Destination = ""; } else { ZipTarget = false; }; // Для всех файлов и каталогов из списка сделать точную копию (с созданием соответствующего подкаталога) bool result = true; foreach (var filename in scenario.Source) { if (filename[0] == '*') { result &= CopyDir(filename.Substring(1), Destination, version, true); } else { result &= CopyFile(filename, Destination, version, true); } } if (zip != null) { zip.Dispose(); } try { if (scenario.Zip) // Создать контрольную сумму для всего архива { SHA512X.CreateSHA512(scenario.Destination); } } catch { return(false); } return(result); }