Directory.Move doesn't work (file already exist)

后端 未结 6 584
逝去的感伤
逝去的感伤 2020-11-30 06:42

I\'ve got main folder:

c:\\test

And there I have 2 folders: Movies and Photos.

Photos has three folders with files with the same s

6条回答
  •  臣服心动
    2020-11-30 07:30

    This method will move content of a folder recursively and overwrite existing files.
    You should add some exception handling.
    Edit:
    This method is implemented with a while loop and a stack instead of recursion.

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

    Update:
    This is a simpler version with the use of Directory.EnumerateFiles recursively instead of using a stack.
    This will only work with .net 4 or later, to us it with an earlier version of .net change Directory.EnumerateFiles to Directory.GetFiles.

    public static void MoveDirectory(string source, string target)
    {
        var sourcePath = source.TrimEnd('\\', ' ');
        var targetPath = target.TrimEnd('\\', ' ');
        var files = Directory.EnumerateFiles(sourcePath, "*", SearchOption.AllDirectories)
                             .GroupBy(s=> Path.GetDirectoryName(s));
        foreach (var folder in files)
        {
            var targetFolder = folder.Key.Replace(sourcePath, targetPath);
            Directory.CreateDirectory(targetFolder);
            foreach (var file in folder)
            {
                var targetFile = Path.Combine(targetFolder, Path.GetFileName(file));
                if (File.Exists(targetFile)) File.Delete(targetFile);
                File.Move(file, targetFile);
            }
        }
        Directory.Delete(source, true);
    }
    

提交回复
热议问题