Frage

Ich habe versucht, den besten Weg, um herauszufinden, Dateien in Windows kopieren mit tiefen Pfaden (Dateien, Ordnern nicht so Robocopy indiskutabel ist). Die beste Lösung, die ich habe in der Lage zu kommen mit ist meine eigene Lösung zu schreiben. Ich habe in der Lage, den Code zu schreiben Auflistung Verzeichnisse mit 10.000 Zeichen deeps Pfaden zu handhaben, aber mit dem gleichen Ansatz scheint nicht für tatsächlich das Kopieren von Dateien zu arbeiten. Ich müde mit den System.IO Bibliotheken mit \? \ Vorangestellt Pfade und das scheint nicht zu funktionieren.

[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;
}
War es hilfreich?

Lösung

Wenn der Aufruf von Copyfile (nicht Ihre Überlastung, die P / Invoke Erklärung) gibt false zurück, ich würde eine Win32Exception werfen:

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

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

Der Standardkonstruktor für die Win32Exception Klasse wird um einen Anruf zu GetLastError und geben Ihnen detailliertere Fehlerinformationen, warum der Vorgang fehlgeschlagen ist.

Andere Tipps

Wenn Sie die Funktion CopyFileW stattdessen nennen? Beachten Sie die W am Ende. Auch ich weiß nicht, ob Sie UNC-Pfade verwenden. Wenn ja, brauchen Sie mit "\\? \ UNC \" statt Präfix.

Dies ist ein guter Artikel für langen Weg der Handhabung

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top