/// <summary> /// Copies a directory. /// </summary> /// <param name="aSource">The source location.</param> /// <param name="aDestination">The destination location.</param> /// <param name="aSearchOption">If sub directories should be copied.</param> /// <param name="aConflictOption">How to handle name conflicts.</param> public static void Copy(String aSource, String aDestination, DirectorySearchOption aSearchOption, NameConflictOption aConflictOption) { if (Directory.Exists(aSource)) { if (!Directory.Exists(aDestination)) { Directory.CreateDirectory(aDestination); } //Now Create all of the directories foreach (string dirPath in DirectoryExt.GetDirectories(aSource, aSearchOption)) { Create(dirPath.Replace(aSource.endDir(), aDestination.endDir())); } //Copy all the files foreach (string copyFrom in DirectoryExt.GetFiles(aSource, aSearchOption)) { String copyTo = copyFrom.Replace(aSource.endDir(), aDestination.endDir()); if (File.Exists(copyTo)) { if (aConflictOption == NameConflictOption.Cancel) { return; } else if (aConflictOption == NameConflictOption.Skip) { continue; } } FileExt.Copy(copyFrom, copyTo, aConflictOption); } } }
/// <summary> /// Compare one source directory with multiple destination directories /// </summary> /// <param name="sourceDir">The source directory to compare</param> /// <param name="compareDir">The destination directories to compare</param> /// <param name="searchOption">If subdirectories should also be compared</param> /// <returns></returns> public List <ComparisonResult> CompareDirs(String sourceDir, IEnumerable <String> compareDirs, DirectorySearchOption searchOption) { List <DestinationInfo> directories = new List <DestinationInfo>(); IEnumerator <String> comparisonDirectory = compareDirs.GetEnumerator(); while (comparisonDirectory.MoveNext()) { directories.Add(new DestinationInfo(comparisonDirectory.Current)); } bool bailOut = false; List <ComparisonResult> results = new List <ComparisonResult>(); if (!Directory.Exists(sourceDir)) { ComparisonResult result = new ComparisonResult(sourceDir, sourceDir, ComparisonResult.DifferenceType.SourceMissing, false); results.Add(result); sendEvent(result); bailOut = true; } List <ComparisonResult.Destination> missingDestinationDirectoires = new List <ComparisonResult.Destination>(); foreach (DestinationInfo dir in directories.Where(d => !d.Done)) { if (!Directory.Exists(dir.Path)) { missingDestinationDirectoires.Add(new ComparisonResult.Destination(dir.Path, ComparisonResult.DifferenceType.DestMissing)); dir.Done = true; } } if (missingDestinationDirectoires.Count > 0) { ComparisonResult compareResult = new ComparisonResult(sourceDir, missingDestinationDirectoires, false); sendEvent(compareResult); results.Add(compareResult); } if (bailOut || directories.All(d => d.Done)) { return(results); } // First compare all the files List <String> sourceFiles = DirectoryExt.GetFiles(sourceDir, searchOption); List <String> sourceDirs = DirectoryExt.GetDirectories(sourceDir, searchOption).ToList(); ProcessProgress progress = null; if (!HandleDirectoryCompareProgress.isNull()) { progress = new ProcessProgress(sourceFiles.Count + sourceDirs.Count, (prog) => HandleDirectoryCompareProgress(prog)); } else { progress = new ProcessProgress(sourceFiles.Count + sourceDirs.Count); } foreach (DestinationInfo dir in directories.Where(d => !d.Done)) { dir.FileList = DirectoryExt.GetFiles(dir.Path, searchOption).ToList(); } for (int i = 0; i < sourceFiles.Count; ++i) { if (mCancelRequested) { break; } List <ComparisonResult.Destination> destinationResults = new List <ComparisonResult.Destination>(); String sourceFileName = sourceFiles[i]; List <String> filePaths = new List <string>(); foreach (DestinationInfo dir in directories.Where(d => !d.Done)) { String destFileName = PathExt.Combine(dir.Path, PathExt.GetRelativePath(sourceDir, sourceFileName)); if (dir.FileList.Contains(destFileName)) { filePaths.Add(destFileName); dir.FileList.Remove(destFileName); } else { destinationResults.Add(new ComparisonResult.Destination(destFileName, ComparisonResult.DifferenceType.DestMissing)); } } progress.Processed++; ComparisonResult compareResult = CompareFiles(sourceFileName, filePaths); compareResult.Destinations.AddRange(destinationResults); if (compareResult.Destinations.Count > 0) { sendEvent(compareResult); results.Add(compareResult); } } foreach (DestinationInfo dir in directories.Where(d => !d.Done)) { foreach (String file in dir.FileList) { if (mCancelRequested) { break; } ComparisonResult compareResult = new ComparisonResult(PathExt.Combine(sourceDir, PathExt.GetRelativePath(dir.Path, file)), file, ComparisonResult.DifferenceType.SourceMissing, true); sendEvent(compareResult); results.Add(compareResult); } } //Next compare the directories foreach (DestinationInfo dir in directories.Where(d => !d.Done)) { if (mCancelRequested) { break; } dir.DirList = DirectoryExt.GetDirectories(dir.Path, searchOption).ToList(); } for (int i = 0; i < sourceDirs.Count; ++i) { foreach (DestinationInfo dir in directories.Where(d => !d.Done)) { if (mCancelRequested) { break; } String sourceDirName = sourceDirs[i]; String destDirName = PathExt.Combine(dir.Path, PathExt.GetRelativePath(sourceDir, sourceDirName)); if (dir.DirList.Contains(destDirName)) { dir.DirList.Remove(destDirName); } else { // Only send a difference if the directory is empty, otherwise the file comparison will cover this case. if (DirectoryExt.Empty(sourceDirName)) { ComparisonResult compareResult = new ComparisonResult(sourceDirName, destDirName, ComparisonResult.DifferenceType.DestMissing, false); sendEvent(compareResult); results.Add(compareResult); } } } progress.Processed++; } foreach (DestinationInfo directory in directories.Where(d => !d.Done)) { foreach (String dir in directory.DirList) { if (mCancelRequested) { break; } // Only send a difference if the directory is empty, otherwise the file comparison will cover this case. if (DirectoryExt.Empty(dir)) { ComparisonResult compareResult = new ComparisonResult(PathExt.Combine(sourceDir, PathExt.GetRelativePath(directory.Path, dir)), dir, ComparisonResult.DifferenceType.SourceMissing, false); sendEvent(compareResult); results.Add(compareResult); } } } if (mCancelRequested) { progress.Canceled = true; } progress.Completed = true; return(results); }