Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET中移动不同卷上的文件_C#_.net_File Io_Directory Structure - Fatal编程技术网

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

C# 在.NET中移动不同卷上的文件,c#,.net,file-io,directory-structure,C#,.net,File Io,Directory Structure,显然,我无法使用Directory.move移动不同卷上的文件 我读到,我必须将每个文件分别复制到目标,然后删除源目录 我还有其他选择吗?无论Directory.Move(或任何其他功能)是否在卷之间执行移动,它基本上都是在下面执行复制和删除操作。所以如果你想提高速度,那是不会发生的。我认为最好的解决方案是编写自己的可重用move函数,它将从to和from路径获取卷标(C:,D:),然后执行move,或者在必要时复制+删除。据我所知,没有其他方法,但是删除目录会有一个问题:在删除目录及其所有内容

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

我读到,我必须将每个文件分别复制到目标,然后删除源目录


我还有其他选择吗?

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

据我所知,没有其他方法,但是删除目录会有一个问题:在删除目录及其所有内容时,只读文件可能会导致未经授权的访问异常

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

在使用或符号链接到另一个物理磁盘之前,此操作应一直有效

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