private static void RestoreBackup(string backupsDirectory, string restoredBackupName, string restorationDirectory) { var restorationProcess = new BackupRestorationProcess(backupsDirectory, restoredBackupName, restorationDirectory); var restorationMonitor = new RestorationProgressMonitor(); var errors = new Queue <string>(); restorationMonitor.ErrorReceived += (inputPath, outputPath, error, directory) => errors.Enqueue($"Could not copy \"{inputPath}\" to \"{outputPath}\": {error.GetType()}"); Console.WriteLine($"Restoring backup \"{restoredBackupName}\" to {restorationDirectory}"); Console.WriteLine("Loading backup data..."); try { restorationProcess.LoadBackupData(); Console.WriteLine($"Restoring {restorationProcess.FilesToRestore} files, {restorationProcess.DirectoriesToRestore} directories"); Console.WriteLine("Restoring files..."); bool finishedRestoringFiles = false; var loggerTask = new Task(() => { while (!finishedRestoringFiles) { CommandLineExecution.RewindConsole(); while (errors.Count > 0) { Console.Error.WriteLine(errors.Dequeue()); } Console.Write($"({restorationMonitor.FilesRestored} / {restorationProcess.FilesToRestore}) {restorationMonitor.LastRestored}"); Thread.Sleep(20); } CommandLineExecution.RewindConsole(); Console.WriteLine($"{restorationMonitor.FilesRestored} files restored"); Console.WriteLine($"Restored backup {restoredBackupName}"); }); loggerTask.Start(); restorationProcess.RestoreBackup(restorationMonitor); finishedRestoringFiles = true; loggerTask.Wait(); } catch (Exception e) { Console.Error.WriteLine(e.ToString()); Environment.Exit(1); } }
private static void CreateBackup(string backupSource, string backupsDestination, string backupId, string precedingBackupId) { var backupProcess = new BackupProcess(backupSource, backupsDestination); var scanMonitor = new DirectoryScanProgressMonitor(); var backupMonitor = new BackupProgressMonitor(); var errors = new Queue<string>(); scanMonitor.ErrorReceived += (path, error, directory) => errors.Enqueue($"Could not scan path \"{path}\": {error.GetType()}"); var backupState = StatusDisplayState.LoadingReferenceData; var loggerTask = new Task(() => { Console.WriteLine(string.IsNullOrEmpty(precedingBackupId) ? "Creating full backup..." : "Loading preceding backup..."); while (backupState == StatusDisplayState.LoadingReferenceData) ; Console.WriteLine("Scanning source directory..."); while (backupState == StatusDisplayState.ScanningSourceData) { CommandLineExecution.RewindConsole(); while (errors.Count > 0) Console.Error.WriteLine(errors.Dequeue()); Console.Write($"{scanMonitor.FilesScanned} files, {scanMonitor.FoldersScanned} directories found..."); Thread.Sleep(20); } CommandLineExecution.RewindConsole(); Console.WriteLine($"{scanMonitor.FilesScanned} files, {scanMonitor.FoldersScanned} directories found"); Console.WriteLine("Preparing backup data..."); while (backupState == StatusDisplayState.PreparingBackupData) ; Console.WriteLine($"Detected {backupProcess.DetectedFileChanges} changed files"); Console.WriteLine("Writing backup data..."); while (backupState == StatusDisplayState.WritingBackupData) { CommandLineExecution.RewindConsole(); Console.Write($"({backupMonitor.FilesCopied} / {backupProcess.DetectedFileChanges + 1}) {backupMonitor.LastCopied}"); Thread.Sleep(20); } CommandLineExecution.RewindConsole(); Console.WriteLine($"{backupMonitor.FilesCopied} files created"); Console.WriteLine($"Created backup {backupId}"); }); loggerTask.Start(); try { if (string.IsNullOrEmpty(precedingBackupId)) backupProcess.UseEmptyReferenceData(); else { var referenceBackupDataFile = Path.Join(backupsDestination, precedingBackupId, BackupProcess.BackupDataFilename); backupProcess.LoadReferenceData(referenceBackupDataFile); } backupState = StatusDisplayState.ScanningSourceData; backupProcess.LoadSourceData(scanMonitor); backupState = StatusDisplayState.PreparingBackupData; backupProcess.ProcessDataDifference(); backupState = StatusDisplayState.WritingBackupData; backupProcess.CreateBackup(backupId, backupMonitor); backupState = StatusDisplayState.Done; loggerTask.Wait(); } catch (Exception e) { Console.Error.WriteLine(e.ToString()); Environment.Exit(1); } }