“移动不会跨卷” – 为什么? 以及如何克服?
当源文件和目标文件位于不同的分区中时,为什么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);
然后你可以提取它,你就拥有它!