"Move will not work across volumes" - 为什么?以及如何克服?
"Move will not work across volumes" - Why? And how to overcome?
为什么当源文件和目标文件在不同的分区时 File.Move(sourceFileName, destFileName)
工作正常,但 Directory.Move(sourceDirName, destDirName)
却不行?它抛出
System.IO.IOException: "Source and destination path must have
identical roots. Move will not work across volumes."
我什至尝试创建一个 DirectoryInfo
实例并使用 MoveTo(destDirName)
方法但没有成功。
我错过了什么吗?我真的必须自己实现 "move" 功能吗? (顺便说一句,我要移动的目录非常大)。
您应该使用 Copy Function followed by a remove. As Move 只适用于同一驱动器。
Directory.Move
有一个条件表明:
IO Exception will be thrown if an attempt was made to move a directory to a different volume.
您还可以 p/invoke SHFileOperation
这与 Windows Explorer 用来移动目录的功能相同。它将根据需要执行真正的移动或递归复制然后删除。
它也可以显示与资源管理器相同的进度UI,只需设置一个标志。
另一种选择是,添加对 Microsoft.VisualBasic
命名空间的引用并使用 MoveDirectory
方法,该方法可以跨卷移动。
Microsoft.VisualBasic.FileIO.FileSystem.MoveDirectory(sourceDirName, destDirName);
虽然这不是一个 Vb.Net 问题,但我发现没有人提到过这种方法,所以我认为可能会有所帮助...只有在需要时才需要将其转换为 C#。
代码:
My.Computer.FileSystem.MoveDirectory(SrcDir,DestDir)
根据我的经验,这可以无缝地处理不同的卷。
基于帖子“Copy a directory to a different drive" and "Non-recursive way to get all files in a directory and its subdirectories in Java”,我写了这个 non-recursive 方法并且工作正常:
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);
}
我知道这个 post 有点旧...但是有办法解决这个问题!不要尝试移动目录,而是将其压缩并作为 File.Move(src,dest);
移动,然后您可以将其解压缩,然后就可以了!
我在 VB.NET 中遇到了同样的问题,而不是 "Directory.Move" 我使用了 MoveFolder 和 "FileSystemObject"。
您可以使用此方法保留创建日期。
Scripting.FileSystemObject oFSO = new Scripting.FileSystemObject();
oFSO.MoveFolder(sourceDirName, destDirName)
我有这个问题,我喜欢用这种方式解决它
string startPath = @".\start";
string zipPath = @".\result.zip";
string extractPath = @".\extract";
ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);
为什么当源文件和目标文件在不同的分区时 File.Move(sourceFileName, destFileName)
工作正常,但 Directory.Move(sourceDirName, destDirName)
却不行?它抛出
System.IO.IOException: "Source and destination path must have identical roots. Move will not work across volumes."
我什至尝试创建一个 DirectoryInfo
实例并使用 MoveTo(destDirName)
方法但没有成功。
我错过了什么吗?我真的必须自己实现 "move" 功能吗? (顺便说一句,我要移动的目录非常大)。
您应该使用 Copy Function followed by a remove. As Move 只适用于同一驱动器。
Directory.Move
有一个条件表明:
IO Exception will be thrown if an attempt was made to move a directory to a different volume.
您还可以 p/invoke SHFileOperation
这与 Windows Explorer 用来移动目录的功能相同。它将根据需要执行真正的移动或递归复制然后删除。
它也可以显示与资源管理器相同的进度UI,只需设置一个标志。
另一种选择是,添加对 Microsoft.VisualBasic
命名空间的引用并使用 MoveDirectory
方法,该方法可以跨卷移动。
Microsoft.VisualBasic.FileIO.FileSystem.MoveDirectory(sourceDirName, destDirName);
虽然这不是一个 Vb.Net 问题,但我发现没有人提到过这种方法,所以我认为可能会有所帮助...只有在需要时才需要将其转换为 C#。
代码:
My.Computer.FileSystem.MoveDirectory(SrcDir,DestDir)
根据我的经验,这可以无缝地处理不同的卷。
基于帖子“Copy a directory to a different drive" and "Non-recursive way to get all files in a directory and its subdirectories in Java”,我写了这个 non-recursive 方法并且工作正常:
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);
}
我知道这个 post 有点旧...但是有办法解决这个问题!不要尝试移动目录,而是将其压缩并作为 File.Move(src,dest);
移动,然后您可以将其解压缩,然后就可以了!
我在 VB.NET 中遇到了同样的问题,而不是 "Directory.Move" 我使用了 MoveFolder 和 "FileSystemObject"。 您可以使用此方法保留创建日期。
Scripting.FileSystemObject oFSO = new Scripting.FileSystemObject();
oFSO.MoveFolder(sourceDirName, destDirName)
我有这个问题,我喜欢用这种方式解决它
string startPath = @".\start";
string zipPath = @".\result.zip";
string extractPath = @".\extract";
ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);