/// <summary> /// Copies the files in a directory and all of it's subdirectories to a specified location. /// </summary> /// <param name="readDirectory">The directory to copy the files from.</param> /// <param name="writeDirectory">The directory to copy the files to.</param> /// <param name="relativePaths">Collection of files marked for backup. Use GetRelativePaths to obtain this from /// a directory inteded to be used as backup.</param> /// <param name="feedbackRecipient">IFeedbackRecipient for reporting progress and errors.</param> public void CopyFiles(string readDirectory, string writeDirectory, string[] relativePaths, IFeedbackRecipient feedbackRecipient) { for (int i = 0; i < relativePaths.Count(); i++) { string readPath = readDirectory + relativePaths[i]; string writePath = writeDirectory + relativePaths[i]; if (!File.Exists(readPath)) { feedbackRecipient.OnInfoReport("Warning: File (" + readPath + ") Does not exist. Skipping"); continue; } if (!File.Exists(writePath)) { feedbackRecipient.OnInfoReport("Warning: File (" + writePath + ") Does not exist. Skipping"); continue; } try { File.Copy(readPath, writePath, true); } catch (IOException) { feedbackRecipient.OnInfoReport("Error: File (" + relativePaths[i] + ") is in use by another process. Skipping"); continue; } catch (UnauthorizedAccessException ex) { feedbackRecipient.OnInfoReport(ex.ToString()); } catch (Exception ex) { feedbackRecipient.OnInfoReport(ex.ToString()); } feedbackRecipient.OnProgress(writePath, "Overwriting file: ", relativePaths.Count()); } }
/// <summary> /// Checks and backs up the specified directory. /// </summary> /// <param name="backupDirectory">Directory where backups will be stored.</param> /// <param name="mainDirectory">The directory being backed up.</param> /// <param name="feedbackRecipient">FeedbackRecipient for reporting backup progress and errors.</param> /// <param name="relativePaths">Collection of files marked for backup. Use GetRelativePaths to obtain this from a directory /// intended to be used as a reference for backup.</param> public void ValidateBackup(string backupDirectory, string mainDirectory, IFeedbackRecipient feedbackRecipient, params string[] relativePaths) { if (!Directory.Exists(backupDirectory)) { Directory.CreateDirectory(backupDirectory); feedbackRecipient.OnInfoReport("Warning: Backup directory did not exist; Creating a new backup directory."); } string[] filesInBackup = Directory.GetFiles(backupDirectory, "*", SearchOption.AllDirectories); for (int i = 0; i < relativePaths.Count(); i++) { if (!File.Exists(backupDirectory + relativePaths[i]) && !File.Exists(mainDirectory + "\\" + relativePaths[i])) { feedbackRecipient.OnInfoReport("Warning: File (" + mainDirectory + "\\" + relativePaths[i] + ") does not exist. Skipping"); } else if (!File.Exists(backupDirectory + relativePaths[i])) { string filePath = backupDirectory + relativePaths[i]; string fileDirectory = new FileInfo(backupDirectory + relativePaths[i]).DirectoryName; if (!Directory.Exists(fileDirectory)) Directory.CreateDirectory(fileDirectory); File.Copy(mainDirectory + "\\" + relativePaths[i], backupDirectory + relativePaths[i]); } feedbackRecipient.OnProgress(backupDirectory + relativePaths[i], "Validating backup file: ", relativePaths.Count()); } }