我一直试图找出最好的办法复制文件,在Windows深路径(文件,没有文件夹的是出的问题)。最好的解决方案我一直以来是写我自己的解决方案。我已经能够编写代码,以处理清单目录,与10 000名字的深渊的路径,而是使用相同的做法似乎并不是作为实际上复制文件。我厌倦了使用该系统。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;
}
有帮助吗?

解决方案

如果调用的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函数,给你更详细的错误信息,给操作失败的原因。

其他提示

你应该叫功能CopyFileW,而不是?注W在结束。还有,我不知道如果您使用的是UNC路径。所以如果你需要前缀"\\?\UNC\"代替。

这是一个良好的条长路径处理

http://blogs.msdn.com/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top