public static IOResult Copy(DirectoryInfo sourceDirectory, DirectoryInfo targetDirectory, bool overwrite = true) { 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 { if (!Directory.Exists(targetDirectory.FullName)) { 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 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); }
public static IOResult Create(DirectoryInfo directory) { if (directory is null) { throw new ArgumentNullException(nameof(directory)); } var logger = new IOResult(); if (Directory.Exists(directory.FullName)) { logger.Log("文件夹已经存在。"); } else { logger.Log("文件夹不存在,创建。"); Directory.CreateDirectory(directory.FullName); } return(logger); }
/// <summary> /// 为指定的路径创建文件夹。 /// </summary> /// <param name="directory">文件夹的路径。</param> public static IOResult Create(DirectoryInfo directory) { if (directory is null) { throw new ArgumentNullException(nameof(directory)); } var logger = new IOResult(); logger.Log("无论是否存在,都创建文件夹。"); Directory.CreateDirectory(directory.FullName); return(logger); }
/// <summary> /// 删除指定路径的文件夹,此操作会递归删除文件夹内的所有文件,最后删除此文件夹自身。 /// 如果目标文件夹是个连接点(Junction Point, Symbolic Link),则只会删除连接点而已,不会删除连接点所指目标文件夹中的文件。 /// </summary> /// <param name="directory">要删除的文件夹。</param> /// <returns>包含执行成功和失败的信息,以及中间执行中方法自动决定的一些细节。</returns> public static IOResult Delete(DirectoryInfo directory) { if (directory is null) { throw new ArgumentNullException(nameof(directory)); } var logger = new IOResult(); logger.Log($"删除目录“{directory.FullName}”。"); if (JunctionPoint.Exists(directory.FullName)) { JunctionPoint.Delete(directory.FullName); } else if (!Directory.Exists(directory.FullName)) { logger.Log($"要删除的目录“{directory.FullName}”不存在。"); return(logger); } Delete(directory, 0, logger);