“移动不会跨卷” - 为什么?以及如何克服?

时间:2015-05-04 03:03:41

标签: c# file directory

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

  

System.IO.IOException:“源和目标路径必须具有   相同的根。移动不会在卷上运行。“

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

我错过了什么吗?我自己真的必须实现“移动”功能吗? (我要移动的目录非常大btw)。

8 个答案:

答案 0 :(得分:7)

您应该使用Copy功能,然后删除。由于Move仅适用于同一驱动器。 Directory.Move的条件是:

  
    如果尝试将目录移动到其他卷,则会抛出

IO异常

  

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

虽然这不是Vb.Net的问题,但我发现没有人提到这种方法,所以我觉得可能有所帮助......只有你需要将它转换为C#(如果需要的话)。

代码:

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

根据我的经验,这可以无缝地适用于不同的音量。

答案 4 :(得分:1)

根据帖子" Copy a directory to a different drive"和" Non-recursive way to get all files in a directory and its subdirectories in Java",我写了这个非递归方法,它工作正常:

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

答案 5 :(得分:1)

我知道这则帖子有些旧...但是有办法解决!不要尝试移动目录,而是将其压缩并以File.Move(src,dest);的形式移动,然后可以将其解压缩并保存在其中!

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

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

        ZipFile.CreateFromDirectory(startPath, zipPath);

        ZipFile.ExtractToDirectory(zipPath, extractPath);