Quel est le problème avec mon appel WINAPI pour gérer les chemins de fichiers longs?

StackOverflow https://stackoverflow.com/questions/542720

  •  23-08-2019
  •  | 
  •  

Question

J'ai essayé de trouver la meilleure façon de copier des fichiers dans Windows avec des chemins profonds (fichiers, pas des dossiers si robocopy est hors de question). La meilleure solution que j'ai été en mesure de trouver est écrit ma propre solution. Je suis capable d'écrire le code pour gérer les répertoires avec la liste des chemins 10 000 caractères de Deeps, mais en utilisant la même approche ne semble pas fonctionner pour la copie des fichiers réellement. Je fatigué en utilisant les bibliothèques System.IO avec \? \ Préfixé chemins et cela ne semble pas fonctionner.

[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;
}
Était-ce utile?

La solution

Si l'appel à CopyFile (pas votre surcharge, la déclaration P / Invoke) retourne faux, je jetterais un Win32Exception:

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

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

Le constructeur par défaut pour la classe Win32Exception fera un appel à GetLastError et vous donner des informations d'erreur plus en détail pourquoi l'opération a échoué.

Autres conseils

Si vous appelez plutôt la fonction CopyFileW? Notez le W à la fin. En outre, je ne sais pas si vous utilisez des chemins UNC. Dans ce cas, vous devez utiliser le préfixe "\\? \ UNC \" à la place.

Ceci est un bon article pour le traitement long chemin

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top