“移动不会跨卷” – 为什么? 以及如何克服?

当源文件和目标文件位于不同的分区中时,为什么File.Move(sourceFileName, destFileName)工作正常,但Directory.Move(sourceDirName, destDirName)却没有? 它抛出

System.IO.IOException:“源和目标路径必须具有相同的根。移动将无法跨卷工作。”

我甚至尝试创建一个DirectoryInfo实例并使用MoveTo(destDirName)方法,但没有成功。

我错过了什么吗? 我自己真的必须实现“移动”function吗? (我要移动的目录非常大btw)。

您还可以p / invoke SHFileOperation ,它与Windows资源管理器用于移动目录的function相同。 它将根据需要执行true move或recursive-copy-then-delete。

它也可以通过设置标志显示与浏览器相同的进度UI。

您应该使用复制function,然后删除。 由于Move仅适用于同一驱动器。 Directory.Move有一个条件,声明:

如果尝试将目录移动到其他卷,则会抛出IOexception

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

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

虽然这不是Vb.Net的问题,但我发现没有人提到这种方法,所以我认为可能有所帮助……只有你需要将它转换为C#(如果需要)。

码:

 My.Computer.FileSystem.MoveDirectory(SrcDir,DestDir) 

根据我的经验,这可以无缝地在不同的音量上工作。

根据post“ 将目录复制到另一个驱动器 ”和“ 非递归方式来获取目录及其子目录中的所有文件 ”,我写了这个非递归方法,它工作正常:

 public static void Move(string source, string target) { if (!Directory.Exists(source)) { throw new System.IO.DirectoryNotFoundException("Source directory couldn't be found."); } if (Directory.Exists(target)) { throw new System.IO.IOException("Target directory already exists."); } DirectoryInfo sourceInfo = Directory.CreateDirectory(source); DirectoryInfo targetInfo = Directory.CreateDirectory(target); if (sourceInfo.FullName == targetInfo.FullName) { throw new System.IO.IOException("Source and target directories are the same."); } Stack sourceDirectories = new Stack(); sourceDirectories.Push(sourceInfo); Stack targetDirectories = new Stack(); targetDirectories.Push(targetInfo); while (sourceDirectories.Count > 0) { DirectoryInfo sourceDirectory = sourceDirectories.Pop(); DirectoryInfo targetDirectory = targetDirectories.Pop(); foreach (FileInfo file in sourceDirectory.GetFiles()) { file.CopyTo(Path.Combine(targetDirectory.FullName, file.Name), overwrite: true); } foreach(DirectoryInfo subDirectory in sourceDirectory.GetDirectories()) { sourceDirectories.Push(subDirectory); targetDirectories.Push(targetDirectory.CreateSubdirectory(subDirectory.Name)); } } sourceInfo.Delete(true); } 

我知道这篇文章有点老了……但是有一种解决方法! 不要尝试移动目录,而是将其压缩并将其作为File.Move(src,dest); 然后你可以提取它,你就拥有它!