为什么File.Move(sourceFileName, destFileName)
在源文件和目标文件位于不同分区时工作正常,但Directory.Move(sourceDirName, destDirName)
没有?它抛出
System.IO.IOException:“源和目标路径必须具有 相同的根。移动不会在卷上运行。“
我甚至尝试创建DirectoryInfo
实例并使用MoveTo(destDirName)
方法,但没有成功。
我错过了什么吗?我自己真的必须实现“移动”功能吗? (我要移动的目录非常大btw)。
答案 0 :(得分:7)
答案 1 :(得分:4)
另一种选择是,添加对Microsoft.VisualBasic
命名空间的引用并使用MoveDirectory
方法,该方法可以跨卷移动。
Microsoft.VisualBasic.FileIO.FileSystem.MoveDirectory(sourceDirName, destDirName);
答案 2 :(得分:2)
您还可以p / invoke SHFileOperation
,它与Windows资源管理器用于移动目录的功能相同。它将根据需要执行真正的移动或递归复制然后删除。
它也可以显示与浏览器相同的进度UI,只需设置一个标志。
答案 3 :(得分:2)
虽然这不是Vb.Net的问题,但我发现没有人提到这种方法,所以我觉得可能有所帮助......只有你需要将它转换为C#(如果需要的话)。
代码:
My.Computer.FileSystem.MoveDirectory(SrcDir,DestDir)
根据我的经验,这可以无缝地适用于不同的音量。
答案 4 :(得分:1)
根据帖子" Copy a directory to a different drive"和" Non-recursive way to get all files in a directory and its subdirectories in Java",我写了这个非递归方法,它工作正常:
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<DirectoryInfo> sourceDirectories = new Stack<DirectoryInfo>();
sourceDirectories.Push(sourceInfo);
Stack<DirectoryInfo> targetDirectories = new Stack<DirectoryInfo>();
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);
}
答案 5 :(得分:1)
我知道这则帖子有些旧...但是有办法解决!不要尝试移动目录,而是将其压缩并以File.Move(src,dest);
的形式移动,然后可以将其解压缩并保存在其中!
答案 6 :(得分:0)
我在VB.NET中遇到了同样的问题,而不是“ Directory.Move”,而是将MoveFolder与“ FileSystemObject”一起使用。 您可以使用此方法保留创建日期。
Scripting.FileSystemObject oFSO = new Scripting.FileSystemObject();
oFSO.MoveFolder(sourceDirName, destDirName)
答案 7 :(得分:0)
我有这个问题,我喜欢用这种方式解决它
string startPath = @".\start";
string zipPath = @".\result.zip";
string extractPath = @".\extract";
ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);