2009-03-31 6 views
3

Je suis en train de copier certains fichiers, et parfois les longueurs des noms dépasse la longueur que la méthode System.IO.File.Copy peut accepter (260 caractères selon l'exception qui se jette)Besoin d'utiliser l'API win32 pour copier des fichiers dans C# - comment faire?

D'après les recherches que j'ai faites, je devrais être capable d'utiliser les méthodes de fichiers de l'API win32 en conjonction avec \? \ Prepended aux chemins pour obtenir une limite de 32.000 caractères, mais je ne suis pas sûr des méthodes sorcières à importer.

Quelqu'un peut-il m'aider? Je cherche quelque chose comme (évidemment une fonction différente, mais vous voyez l'idée):

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
    static extern SafeFileHandle CreateFileW(string lpFileName, uint dwDesiredAccess, 
              uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, 
              uint dwFlagsAndAttributes, IntPtr hTemplateFile); 
+0

Merci de marquer mon message comme réponse. Je l'ai ajouté pour plus d'informations dans le style P/Invoke que je préfère (paramètres maximum donnés) – abatishchev

Répondre

5
[DllImport("kernel32.dll", 
      CharSet = CharSet.Unicode, 
      CallingConvention = CallingConvention.StdCall, 
      SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool CopyFile(
        [MarshalAs(UnmanagedType.LPWStr)] string lpExistingFileName, 
        [MarshalAs(UnmanagedType.LPWStr)] string lpNewFileName, 
        [MarshalAs(UnmanagedType.Bool)] bool bFailIfExists); 

http://www.pinvoke.net/default.aspx/kernel32/CopyFile.html

+0

Je pense que vous devriez utiliser LPWStr pour les noms de fichiers, en voyant comment cela est censé être l'API Unicode? Cela n'a pas fonctionné avec LPStr et les noms de fichiers longs pour moi, mais il le fait avec des chaînes étendues. –

Questions connexes