Pregunta

He estado tratando de averiguar la mejor manera de copiar archivos en Windows con las rutas profundas (archivos, carpetas para no Robocopy está fuera de la cuestión). La mejor solución que hemos sido capaces de llegar a está escribiendo mi propia solución. He sido capaz de escribir el código para manejar los directorios de listas con deeps 10.000 caracteres caminos pero utilizando el mismo enfoque no parece estar funcionando para los archivos de copiarlos. Me cansado usando las bibliotecas System.IO con \? \ Prefijado a caminos y que no parecía funcionar.

[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;
}
¿Fue útil?

Solución

Si la llamada a CopyFile (no su sobrecarga, la declaración de P / Invoke) devuelve falso que lanzaba un Win32Exception:

public static void CopyFile(string source, string dest)
{
    source = fixPathForLong(source);
    dest = fixPathForLong(dest);

    if (!CopyFile(source, dest, false))
    {
        throw new Win32Exception();
    }
}

El constructor por defecto para la clase Win32Exception hará una llamada a GetLastError y le dará información de error más detallada de por qué la operación ha fallado.

Otros consejos

En caso de que llame a la función en lugar CopyFileW? Tenga en cuenta el W al final. Además, no sé si está utilizando rutas UNC. Si lo que necesita para prefijar con "\\? \ UNC \" en su lugar.

Este es un buen artículo para el manejo de larga trayectoria

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top