/// <summary> /// Gets a collection of file paths under a directory, relative to the directory specified. /// </summary> /// <param name="directoryFiles">The files inside of the directory.</param> /// <param name="directory">The path to the directory.</param> /// <param name="feedbackRecipient">IFeedbackRecipient for reporting progress and errors.</param> /// <returns>A collection of file paths under and relative to directory.</returns> public string[] GetRelativePaths(string[] directoryFiles, string directory, IFeedbackRecipient feedbackRecipient) { string[] paths = new string[directoryFiles.Length]; for (int i = 0; i < paths.Length; i++) { string searchable = directoryFiles[i].ToUpper(); string relativePath = "\\" + searchable.Split(new string[] { directory.ToUpper() }, StringSplitOptions.None)[1]; paths[i] = relativePath; if (feedbackRecipient != null) feedbackRecipient.OnProgress(directoryFiles[i], "Getting relative path of file: ", paths.Length); } return paths; }
/// <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()); } }