2

我一直在试图找出在 Windows 中使用深路径复制文件的最佳方法(文件,而不是文件夹,所以 robocopy 是不可能的)。我能想出的最佳解决方案是编写自己的解决方案。我已经能够编写代码来处理具有 10,000 个字符深度路径的列表目录,但使用相同的方法似乎不适用于实际复制文件。我厌倦了使用带有 \?\ 前缀的 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;
}
4

2 回答 2

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

于 2009-09-29T21:42:27.113 回答
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 并为您提供有关操作失败原因的更详细的错误信息。

于 2009-02-12T18:54:58.767 回答