// Восстановить файлы/каталоги с помощью полного типа резервирования 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); }
//-----------------------------------------------------------------------------------------// // Копировать файлы/каталоги с помощью полного типа резервирования 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); } } }
//-----------------------------------------------------------------------------------------// // Копировать файлы/каталоги с помощью зеркального типа резервирования 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); }