我一直在试图找出在Windows中使用深层路径复制文件的最佳方法(文件,而不是文件夹,因此robocopy是不可能的)。我能够提出的最佳解决方案是编写自己的解决方案。我已经能够编写代码来处理具有10,000个字符深度路径的列表目录,但使用相同的方法似乎并不适用于实际复制文件。我厌倦了使用带有\?\ prefixed到路径的System.IO库,但这似乎不起作用。
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CopyFile(string lpExistingFileName, string lpNewFileName,
bool bFailIfExists);
public static bool CopyFile(string source, string dest)
{
source = fixPathForLong(source);
dest = fixPathForLong(dest);
return CopyFile(source, dest, false);
}
private static string fixPathForLong(String path)
{
if (!path.StartsWith(@"\\?\"))
path = @"\\?\" + path;
return path;
}
答案 0 :(得分:3)
你应该调用CopyFileW函数吗?注意最后的W.此外,我不知道您是否使用UNC路径。如果是这样,你需要用“\\?\ UNC \”作为前缀。
这是一篇很长的路径处理文章
http://blogs.msdn.com/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx
答案 1 :(得分:2)
如果调用CopyFile(不是你的重载,P / Invoke声明)返回false,我会抛出一个Win32Exception:
public static void CopyFile(string source, string dest)
{
source = fixPathForLong(source);
dest = fixPathForLong(dest);
if (!CopyFile(source, dest, false))
{
throw new Win32Exception();
}
}
Win32Exception类的默认构造函数将调用GetLastError,并为您提供有关操作失败原因的更详细错误信息。