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

问题描述 投票:0回答:4

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

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

我还有其他选择吗?

c# .net file-io directory-structure
4个回答
6
投票

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


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

3
投票

一个更简单的选择是添加对

Microsoft.VisualBasic
命名空间的引用并使用
MoveDirectory
方法,该方法可以跨卷移动。

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

0
投票

尝试使用这个:

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

您将在这里找到 CopyFilesRecursively 函数:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.