static void Delete(DirectoryInfo directory, int depth, IOResult logger)
            {
                if (JunctionPoint.Exists(directory.FullName))
                {
                    JunctionPoint.Delete(directory.FullName);
                }
                else if (!Directory.Exists(directory.FullName))
                {
                    return;
                }

                try
                {
                    foreach (var fileInfo in directory.EnumerateFiles("*", SearchOption.TopDirectoryOnly))
                    {
                        File.Delete(fileInfo.FullName);
                    }

                    foreach (var directoryInfo in directory.EnumerateDirectories("*", SearchOption.TopDirectoryOnly))
                    {
                        var back = string.Join("\\", Enumerable.Repeat("..", depth));
                        Delete(directoryInfo, depth + 1, logger);
                    }

                    Directory.Delete(directory.FullName);
                }
                catch (Exception ex)
                {
                    logger.Fail(ex);
                }
            }
Esempio n. 2
0
 internal void Append(IOResult otherResult)
 {
     if (!otherResult._isSuccess)
     {
         _isSuccess = false;
     }
     _logs.AddRange(otherResult._logs);
 }
        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);
        }
        /// <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);
        }
        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>
        /// 删除指定路径的文件夹,此操作会递归删除文件夹内的所有文件,最后删除此文件夹自身。
        /// 如果目标文件夹是个连接点(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);