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

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<DirectoryInfo> sourceDirectories = new Stack<DirectoryInfo>();
        sourceDirectories.Push(sourceInfo);

        Stack<DirectoryInfo> targetDirectories = new Stack<DirectoryInfo>();
        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);
    }

Although this is not a Vb.Net question but I found no one mentioned this method so I think might help... Only you need to convert it to C# if needed.

Code:

My.Computer.FileSystem.MoveDirectory(SrcDir,DestDir) 

This works on different volume seamlessly/ per my experience.


You should Use Copy Function followed by a remove. As Move only works in the same drive. Directory.Move has a condition that states that :

IO Exception will be thrown if an attempt was made to move a directory to a different volume.


Another option is, to add a reference to the Microsoft.VisualBasic namespace and use the MoveDirectory method, which can move across volumes.

Microsoft.VisualBasic.FileIO.FileSystem.MoveDirectory(sourceDirName, destDirName);

Tags:

C#

File

Directory