我的WINAPI调用处理长文件路径有什么问题?

时间:2009-02-12 18:46:27

标签: c# winapi file-copying

我一直在试图找出在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;
}

2 个答案:

答案 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,并为您提供有关操作失败原因的更详细错误信息。