Cosa c'è di sbagliato con la mia chiamata WINAPI per gestire i percorsi di file lunghi?

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

  •  23-08-2019
  •  | 
  •  

Domanda

Ho cercato di capire il modo migliore per copiare i file in Windows con percorsi profondi (file, non le cartelle in modo robocopy è fuori discussione). La soluzione migliore sono stato in grado di elaborare sta scrivendo la mia soluzione. Sono stato in grado di scrivere il codice per gestire le directory di elenco con i percorsi profondità di 10.000 caratteri, ma utilizzando lo stesso approccio non sembra funzionare per i file in realtà la copia. Mi stanco utilizzando le librerie System.IO con \? \ Prefisso per i percorsi e che non sembrano funzionare.

[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;
}
È stato utile?

Soluzione

Se la chiamata a CopyFile (non il tuo sovraccarico, la dichiarazione P / Invoke) restituisce false vorrei lanciare una Win32Exception:

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

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

Il costruttore di default per la classe Win32Exception farà una chiamata a GetLastError e vi darà informazioni di errore più dettagliate sul motivo per cui l'operazione non è riuscita.

Altri suggerimenti

In caso di chiamare la funzione CopyFileW invece? Notare la W alla fine. Inoltre, non so se si sta utilizzando percorsi UNC. Se quindi è necessario prefisso con "\\? \ UNC \" invece.

Questo è un buon articolo per la gestione di lungo percorso

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top