在.NET中移动不同卷上的文件

时间:2008-12-18 16:35:42

标签: c# .net file-io directory-structure

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

我已经读过,我必须将每个文件分别复制到目的地,然后删除源目录。

我还有其他选择吗?

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

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

 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之前调用:)

答案 2 :(得分:3)

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

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

答案 3 :(得分: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函数here

这应该有效,直到您使用spanned volume或符号链接到另一个物理磁盘。

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