5

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

我读过我必须将每个文件单独复制到目标,然后删除源目录。

我还有其他选择吗?

4

4 回答 4

6

无论 Directory.Move(或任何其他函数)是否执行卷之间的移动,它本质上都是在下面进行复制和删除。所以如果你想提高速度,那是不会发生的。我认为最好的解决方案是编写自己的可重用移动函数,该函数将从路径和路径获取卷标 (C:,D:),然后在必要时执行移动或复制+删除。

于 2008-12-18T16:49:02.600 回答
4

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

这会递归一个目录并取消设置所有只读标志。打电话之前Directory.Delete

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);
    }
}
于 2008-12-18T16:58:11.113 回答
3

一个更简单的选择是添加对Microsoft.VisualBasic命名空间的引用并使用MoveDirectory可以跨卷移动的方法。

Microsoft.VisualBasic.FileIO.FileSystem.MoveDirectory(sourceDirName, destDirName);
于 2016-07-14T09:27:42.433 回答
0

尝试使用这个:

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 函数:

在您使用跨区卷或符号链接到另一个物理磁盘之前,这应该可以工作。

为了更加健壮,您可以改进此功能以使用 Move 直到 System.IO .Exception 被抛出,然后切换到复制和删除。

于 2017-07-04T06:03:11.310 回答