ASP.NET C# Copy Directory with SubDirectories with System.IO

前端 未结 3 670
醉酒成梦
醉酒成梦 2021-01-14 01:27

I need to copy a whole directory C:\\X to C:\\Y\\X, and I need the sub-folders to be copied as well.
Is there any way to do it with the System.IO.File\\Directory namespa

3条回答
  •  一整个雨季
    2021-01-14 02:08

    This class will copy or move a folder, without recursive calls.
    The methods is using their own stacks to handle recursion, this is to avoid StackOverflowException.

    public static class CopyFolder
    {
        public static void CopyDirectory(string source, string target)
        {
            var stack = new Stack();
            stack.Push(new Folders(source, target));
    
            while (stack.Count > 0)
            {
                var folders = stack.Pop();
                Directory.CreateDirectory(folders.Target);
                foreach (var file in Directory.GetFiles(folders.Source, "*.*"))
                {
                    string targetFile = Path.Combine(folders.Target, Path.GetFileName(file));
                    if (File.Exists(targetFile)) File.Delete(targetFile);
                    File.Copy(file, targetFile);
                }
    
                foreach (var folder in Directory.GetDirectories(folders.Source))
                {
                    stack.Push(new Folders(folder, Path.Combine(folders.Target, Path.GetFileName(folder))));
                }
            }
        }
        public static void MoveDirectory(string source, string target)
        {
            var stack = new Stack();
            stack.Push(new Folders(source, target));
    
            while (stack.Count > 0)
            {
                var folders = stack.Pop();
                Directory.CreateDirectory(folders.Target);
                foreach (var file in Directory.GetFiles(folders.Source, "*.*"))
                {
                    string targetFile = Path.Combine(folders.Target, Path.GetFileName(file));
                    if (File.Exists(targetFile)) File.Delete(targetFile);
                    File.Move(file, targetFile);
                }
    
                foreach (var folder in Directory.GetDirectories(folders.Source))
                {
                    stack.Push(new Folders(folder, Path.Combine(folders.Target, Path.GetFileName(folder))));
                }
            }
            Directory.Delete(source, true);
        }
        public class Folders
        {
            public string Source { get; private set; }
            public string Target { get; private set; }
    
            public Folders(string source, string target)
            {
                Source = source;
                Target = target;
            }
        }
    }
    

提交回复
热议问题