“Move will not work across volumes” - Why? And how to overcome?

后端 未结 7 965
误落风尘
误落风尘 2020-12-06 10:19

Why is it that File.Move(sourceFileName, destFileName) works fine when the source file and destination files are in different partitions, but Directory.Mo

7条回答
  •  孤城傲影
    2020-12-06 10:36

    Based on the posts "Copy a directory to a different drive" and "Non-recursive way to get all files in a directory and its subdirectories in Java", I wrote this non-recursive method and it works fine:

    public static void Move(string source, string target)
        {
            if (!Directory.Exists(source))
            {
                throw new System.IO.DirectoryNotFoundException("Source directory couldn't be found.");
            }
    
            if (Directory.Exists(target))
            {
                throw new System.IO.IOException("Target directory already exists.");
            }
    
            DirectoryInfo sourceInfo = Directory.CreateDirectory(source);
            DirectoryInfo targetInfo = Directory.CreateDirectory(target);
    
            if (sourceInfo.FullName == targetInfo.FullName)
            {
                throw new System.IO.IOException("Source and target directories are the same.");
            }
    
            Stack sourceDirectories = new Stack();
            sourceDirectories.Push(sourceInfo);
    
            Stack targetDirectories = new Stack();
            targetDirectories.Push(targetInfo);
    
            while (sourceDirectories.Count > 0)
            {
                DirectoryInfo sourceDirectory = sourceDirectories.Pop();
                DirectoryInfo targetDirectory = targetDirectories.Pop();
    
                foreach (FileInfo file in sourceDirectory.GetFiles())
                {
                    file.CopyTo(Path.Combine(targetDirectory.FullName, file.Name), overwrite: true);
                }
    
                foreach(DirectoryInfo subDirectory in sourceDirectory.GetDirectories())
                {
                    sourceDirectories.Push(subDirectory);
                    targetDirectories.Push(targetDirectory.CreateSubdirectory(subDirectory.Name));
                }
            }
    
            sourceInfo.Delete(true);
        }
    

提交回复
热议问题