显然我不能使用Directory.Move不同的卷移动文件。

我已阅读,我必须单独复制每个文件到目的地,然后删除源目录。

我是否有任何其他的选择吗?

有帮助吗?

解决方案

不管是否Directory.Move(或任何其它功能)的执行体积之间的移动,这将基本上是做了复制和删除反正下方。所以,如果你想有一个的速度增加,这是不会发生的。我认为最好的解决办法是写自己的可重复使用的移动功能,这将得到卷标(C:,d :)从往返路径,然后或者进行移动或复制+删除必要时

其他提示

据我所知,没有但是,删除目录中没有其他的办法有一个问题:只读删除目录及其所有内容时,文件可能会导致UnauthorizedAccessException greeve

 public void removeReadOnlyDeep(string directory)
    {
        string[] files = Directory.GetFiles(directory);
        foreach (string file in files)
        {
            FileAttributes attributes = File.GetAttributes(file);
            if ((attributes & FileAttributes.ReadOnly) != 0)
            {
                File.SetAttributes(file, ~FileAttributes.ReadOnly);
            }
        }
        string[] dirs = Directory.GetDirectories(directory);
        foreach (string dir in dirs)
        {
            removeReadOnlyDeep(dir);
        }
    }

此递归的目录和取消设置所有的只读标志。调用Directory.Delete之前:)

这是更容易的选择将是,添加一个引用到Microsoft.VisualBasic命名空间和使用MoveDirectory方法,该方法可以在卷动。

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

尝试使用这样的:

public static void RobustMove(string sourceDirectory, string destDirectory)
{
    //move if directories are on the same volume
    if (Path.GetPathRoot(source) == Path.GetPathRoot(destination))
    {
        Directory.Move(source, destination);
    }
    else
    {        
        CopyDirectoryRecursive(source, destination);
        Directory.Delete(source, true);
    }
}

您将在这里找到CopyDirectoryRecursive功能

这应该是工作,直到您使用的跨区卷或符号链接到另一个物理磁盘。

要更加健壮可以提高该功能使用移动,直到System.IO .Exception被抛出,然后切换到复制和删除。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top