/// <summary> /// 将源路径文件夹复制成为目标路径文件夹。 /// 由 <paramref name="overwrite"/> 参数指定在目标文件夹存在时应该覆盖还是将源文件夹全部删除。 /// </summary> /// <param name="sourceDirectory">源文件夹。</param> /// <param name="targetDirectory">目标文件夹。</param> /// <param name="overwrite">指定当目标路径存在现成现成文件夹时,应该如何覆盖目标文件夹。</param> /// <returns>包含执行成功和失败的信息,以及中间执行中方法自动决定的一些细节。</returns> public static IOResult Copy(DirectoryInfo sourceDirectory, DirectoryInfo targetDirectory, DirectoryOverwriteStrategy overwrite = DirectoryOverwriteStrategy.Overwrite) { if (sourceDirectory is null) { throw new ArgumentNullException(nameof(sourceDirectory)); } if (targetDirectory is null) { throw new ArgumentNullException(nameof(targetDirectory)); } var logger = new IOResult(); logger.Log($"复制目录,从“{sourceDirectory.FullName}”到“{targetDirectory.FullName}”。"); if (!Directory.Exists(sourceDirectory.FullName)) { logger.Log($"要复制的源目录“{sourceDirectory.FullName}”不存在。"); return(logger); } var deleteOverwriteResult = DeleteIfOverwrite(targetDirectory, overwrite); logger.Append(deleteOverwriteResult); try { logger.Log("无论是否存在,都创建文件夹。"); Directory.CreateDirectory(targetDirectory.FullName); foreach (var file in sourceDirectory.EnumerateFiles()) { var targetFilePath = Path.Combine(targetDirectory.FullName, file.Name); file.CopyTo(targetFilePath, true); } foreach (DirectoryInfo directory in sourceDirectory.EnumerateDirectories()) { var targetDirectoryPath = Path.Combine(targetDirectory.FullName, directory.Name); var copyResult = Copy(directory, new DirectoryInfo(targetDirectoryPath)); logger.Append(copyResult); } } catch (Exception ex) { logger.Fail(ex); return(logger); } return(logger); }
/// <summary> /// 将源路径文件夹复制成为目标路径文件夹。 /// 由 <paramref name="overwrite"/> 参数指定在目标文件夹存在时应该覆盖还是将源文件夹全部删除。 /// </summary> /// <param name="sourceDirectory">源文件夹。</param> /// <param name="targetDirectory">目标文件夹。</param> /// <param name="overwrite">指定当目标路径存在现成现成文件夹时,应该如何覆盖目标文件夹。</param> /// <returns>包含执行成功和失败的信息,以及中间执行中方法自动决定的一些细节。</returns> public static IOResult Copy(string sourceDirectory, string targetDirectory, DirectoryOverwriteStrategy overwrite = DirectoryOverwriteStrategy.Overwrite) => Copy( VerifyDirectoryArgument(sourceDirectory, nameof(sourceDirectory)), VerifyDirectoryArgument(targetDirectory, nameof(targetDirectory)), overwrite);
/// <summary> /// 将源路径文件夹移动成为目标路径文件夹。 /// 由 <paramref name="overwrite"/> 参数指定在目标文件夹存在时应该覆盖还是将源文件夹全部删除。 /// </summary> /// <param name="sourceDirectory">源文件夹。</param> /// <param name="targetDirectory">目标文件夹。</param> /// <param name="overwrite">指定当目标路径存在现成现成文件夹时,应该如何覆盖目标文件夹。</param> /// <returns>包含执行成功和失败的信息,以及中间执行中方法自动决定的一些细节。</returns> public static IOResult Move(DirectoryInfo sourceDirectory, DirectoryInfo targetDirectory, DirectoryOverwriteStrategy overwrite = DirectoryOverwriteStrategy.Overwrite) { if (sourceDirectory is null) { throw new ArgumentNullException(nameof(sourceDirectory)); } if (targetDirectory is null) { throw new ArgumentNullException(nameof(targetDirectory)); } var logger = new IOResult(); logger.Log($"移动目录,从“{sourceDirectory.FullName}”到“{targetDirectory.FullName}”。"); if (!Directory.Exists(sourceDirectory.FullName)) { logger.Log($"要移动的源目录“{sourceDirectory.FullName}”不存在。"); return(logger); } if (Path.GetPathRoot(sourceDirectory.FullName) == Path.GetPathRoot(targetDirectory.FullName)) { logger.Log("源目录与目标目录在相同驱动器,直接移动。"); var deleteOverwriteResult = DeleteIfOverwrite(targetDirectory, overwrite); logger.Append(deleteOverwriteResult); try { Directory.CreateDirectory(Path.GetDirectoryName(targetDirectory.FullName)); Directory.Move(sourceDirectory.FullName, targetDirectory.FullName); } catch (Exception ex) { logger.Fail(ex); return(logger); } } else { logger.Log("源目录与目标目录不在相同驱动器,先进行复制,再删除源目录。"); var copyResult = Copy(sourceDirectory, targetDirectory); logger.Append(copyResult); var deleteResult = Delete(sourceDirectory); logger.Append(deleteResult); } return(logger); }