// Скопировать файл private static bool CopyFile(string sourcefilename, string root, string version, bool CreateCheckSum) { string destinationfilename = root + "\\" + version + "\\" + sourcefilename.Replace(@":\", @"\"); destinationfilename = destinationfilename.Replace(@"\\", "\\"); bool result = CopyFile(sourcefilename, destinationfilename); if (!ZipTarget) { SHA512X.CreateSHA512(destinationfilename); } return(result); }
//-----------------------------------------------------------------------------------------// // Копировать файлы/каталоги с помощью зеркального типа резервирования 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); }
// Скопировать каталог static bool CopyDir(string src, string dst, bool CreateSHA, bool CheckSHA) { if (ZipSource) { // Получить список всех файлов из ZIP, которые находятся "внутри" src // (в зависимости от их сорта CopyDir или CopyFile) src = ToZIPpath(src) + "/"; foreach (var z in zip.Entries) { if (z.ToString().IndexOf(src) >= 0) { string filename = dst + @"\"; filename = filename + z.Name; //z.ToString().Substring(src.Length); if (File.Exists(filename)) { File.Delete(filename); } z.ExtractToFile(filename); } } return(true); } // Получить список файлов и подкаталогов bool result = true; DirectoryInfo dir = new DirectoryInfo(src); try { // Скопировать файлы var dirGetFiles = dir.GetFiles(); foreach (var file in dirGetFiles) { if (Path.GetExtension(file.Name) == ".sha512") { continue; // Не копировать контрольные суммы } string newdst = dst + "\\" + file.FullName.Substring(src.Length); newdst = newdst.Replace(@"\\", @"\"); if (CheckSHA) { if (!ZipSource || SHA512X.CheckSHA512(file.FullName)) { result &= CopyFile(file.FullName, newdst); // Все файлы continue; } } result &= CopyFile(file.FullName, newdst); // Все файлы if (CreateSHA && !ZipTarget) { SHA512X.CreateSHA512(newdst); } } // Скопировать подкаталоги foreach (var d in dir.GetDirectories()) { string newdst = dst + "\\" + d.FullName.Substring(src.Length); newdst = newdst.Replace(@"\\", @"\"); result &= CopyDir(d.FullName, newdst, CreateSHA, CheckSHA); // Все каталоги } } catch (Exception ee) { MessageBox.Show(src + " -> " + dst, "CopyDir: не могу скопировать"); MessageBox.Show(ee.Message); } return(result); }