"Move will not work across volumes" - 为什么?以及如何克服?

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

为什么当源文件和目标文件在不同的分区时 File.Move(sourceFileName, destFileName) 工作正常,但 Directory.Move(sourceDirName, destDirName) 却不行?它抛出

System.IO.IOException: "Source and destination path must have identical roots. Move will not work across volumes."

我什至尝试创建一个 DirectoryInfo 实例并使用 MoveTo(destDirName) 方法但没有成功。

我错过了什么吗?我真的必须自己实现 "move" 功能吗? (顺便说一句,我要移动的目录非常大)。

您应该使用 Copy Function followed by a remove. As Move 只适用于同一驱动器。 Directory.Move 有一个条件表明:

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

您还可以 p/invoke SHFileOperation 这与 Windows Explorer 用来移动目录的功能相同。它将根据需要执行真正的移动或递归复制然后删除。

它也可以显示与资源管理器相同的进度UI,只需设置一个标志。

另一种选择是,添加对 Microsoft.VisualBasic 命名空间的引用并使用 MoveDirectory 方法,该方法可以跨卷移动。

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

虽然这不是一个 Vb.Net 问题,但我发现没有人提到过这种方法,所以我认为可能会有所帮助...只有在需要时才需要将其转换为 C#。

代码:

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

根据我的经验,这可以无缝地处理不同的卷。

基于帖子“Copy a directory to a different drive" and "Non-recursive way to get all files in a directory and its subdirectories in Java”,我写了这个 non-recursive 方法并且工作正常:

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

我知道这个 post 有点旧...但是有办法解决这个问题!不要尝试移动目录,而是将其压缩并作为 File.Move(src,dest); 移动,然后您可以将其解压缩,然后就可以了!

我在 VB.NET 中遇到了同样的问题,而不是 "Directory.Move" 我使用了 MoveFolder 和 "FileSystemObject"。 您可以使用此方法保留创建日期。

Scripting.FileSystemObject oFSO = new Scripting.FileSystemObject();
oFSO.MoveFolder(sourceDirName, destDirName)

我有这个问题,我喜欢用这种方式解决它

 string startPath = @".\start";
        string zipPath = @".\result.zip";
        string extractPath = @".\extract";

        ZipFile.CreateFromDirectory(startPath, zipPath);

        ZipFile.ExtractToDirectory(zipPath, extractPath);