显然我无法使用 Directory.Move 在不同卷上移动文件。
我读到我必须将每个文件单独复制到目的地,然后删除源目录。
我还有其他选择吗?
无论 Directory.Move(或任何其他函数)是否执行卷之间的移动,它本质上都会在下面进行复制和删除。所以如果你想提高速度,那是不可能的。我认为最好的解决方案是编写自己的可重用移动函数,该函数将从往返路径获取卷标(C:,D:),然后执行移动,或在必要时复制+删除。
据我所知,没有其他方法,但是删除目录有一个问题:只读文件在删除目录及其所有内容时可能会导致
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);
}
}
一个更简单的选择是添加对
Microsoft.VisualBasic
命名空间的引用并使用 MoveDirectory
方法,该方法可以跨卷移动。
Microsoft.VisualBasic.FileIO.FileSystem.MoveDirectory(sourceDirName, destDirName);
尝试使用这个:
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,然后切换到复制和删除。