public static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs, FileOverwriteModes FileOverwriteMode = FileOverwriteModes.Overwrite, bool ignoreCopyErrors = false, Func<FileInfo, bool> FileFilter = null, Func<DirectoryInfo, bool> DirectoryFilter = null) { //check if the source directory does exists if (!Directory.Exists(sourceDirName)) return; //get directory info var dir = new DirectoryInfo(sourceDirName); // If the destination directory does not exist, create it. if (!Directory.Exists(destDirName)) Directory.CreateDirectory(destDirName); // Copy files Parallel.ForEach(dir.GetFiles(), file => { if (FileFilter == null || FileFilter(file)) try { var dstFileName = Path.Combine(destDirName, file.Name); if (FileOverwriteMode == FileOverwriteModes.Overwrite || !File.Exists(dstFileName)) file.CopyTo(dstFileName, true); else if (FileOverwriteMode == FileOverwriteModes.IfDestinationIsNewer && (file.LastWriteTime - new FileInfo(dstFileName).LastWriteTime) > TimeSpan.Zero) file.CopyTo(dstFileName, true); else if (FileOverwriteMode == FileOverwriteModes.IfLastWriteMismatch && file.LastWriteTime != new FileInfo(dstFileName).LastWriteTime) file.CopyTo(dstFileName, true); } catch (Exception ex) { if (!ignoreCopyErrors) throw ex; } }); // If copySubDirs is true, copy the subdirectories. if (copySubDirs) { //copy subdirectories foreach (DirectoryInfo subdir in dir.GetDirectories()) if (DirectoryFilter == null || DirectoryFilter(subdir)) { // Create the subdirectory. string temppath = Path.Combine(destDirName, subdir.Name); // Copy the subdirectories. DirectoryCopy(subdir.FullName, temppath, copySubDirs); } } }
public static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs, FileOverwriteModes FileOverwriteMode = FileOverwriteModes.Overwrite, bool ignoreCopyErrors = false, Func <FileInfo, bool> FileFilter = null, Func <DirectoryInfo, bool> DirectoryFilter = null) { //check if the source directory does exists if (!Directory.Exists(sourceDirName)) { return; } //get directory info var dir = new DirectoryInfo(sourceDirName); // If the destination directory does not exist, create it. if (!Directory.Exists(destDirName)) { Directory.CreateDirectory(destDirName); } // Copy files Parallel.ForEach(dir.GetFiles(), file => { if (FileFilter == null || FileFilter(file)) { try { var dstFileName = Path.Combine(destDirName, file.Name); if (FileOverwriteMode == FileOverwriteModes.Overwrite || !File.Exists(dstFileName)) { file.CopyTo(dstFileName, true); } else if (FileOverwriteMode == FileOverwriteModes.IfDestinationIsNewer && (file.LastWriteTime - new FileInfo(dstFileName).LastWriteTime) > TimeSpan.Zero) { file.CopyTo(dstFileName, true); } else if (FileOverwriteMode == FileOverwriteModes.IfLastWriteMismatch && file.LastWriteTime != new FileInfo(dstFileName).LastWriteTime) { file.CopyTo(dstFileName, true); } } catch (Exception ex) { if (!ignoreCopyErrors) { throw ex; } } } }); // If copySubDirs is true, copy the subdirectories. if (copySubDirs) { //copy subdirectories foreach (DirectoryInfo subdir in dir.GetDirectories()) { if (DirectoryFilter == null || DirectoryFilter(subdir)) { // Create the subdirectory. string temppath = Path.Combine(destDirName, subdir.Name); // Copy the subdirectories. DirectoryCopy(subdir.FullName, temppath, copySubDirs); } } } }