/// <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);
        }