2008-11-03 8 views
5

buscando la forma estándar a prueba de errores para convertir "nombres largos" como "C: \ Documents and settings" a sus "nombres cortos" equivalentes "C: \ DOCUME ~ 1 "manera estándar de convertir a ruta corta en .net

Necesito esto para ejecutar un proceso externo desde mi aplicación C#. No funciona si lo alimentaré con rutas en el "nombre largo".

+0

FYI creo "camino corto" se denomina el "nombre 8.3" – user17753

Respuesta

4

¿El proceso externo fallan, incluso si se encierra las rutas de archivos largas entre comillas? Ese puede ser un método más simple, si la aplicación externa lo admite.

p. Ej.

myExternalApp "C:\Documents And Settings\myUser\SomeData.file" 
+0

Funciona. ¿Tiene alguna explicación o documentación que explique lo que sucede? – Hanan

+0

No realmente. Es simplemente (razonablemente) el comportamiento estándar de las aplicaciones modernas para aceptar argumentos con espacios si la cadena está delimitada con comillas ... – ZombieSheep

+2

Necesita las comillas porque la ruta es básicamente una opción de línea de comando y el espacio es el delimitador de las opciones de línea de comando. Si usa una ruta con espacios, la línea de comando se analizará en múltiples opciones. Definición: "Espacio": el carácter ASCII a menudo confundido con la ausencia de un personaje –

19

Si está preparado para comenzar a llamar a las funciones de API de Windows, GetShortPathName() y GetLongPathName() proporcionan esta funcionalidad.

Ver http://csharparticles.blogspot.com/2005/07/long-and-short-file-name-conversion-in.html

const int MAX_PATH = 255; 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
    public static extern int GetShortPathName(
     [MarshalAs(UnmanagedType.LPTStr)] 
     string path, 
     [MarshalAs(UnmanagedType.LPTStr)] 
     StringBuilder shortPath, 
     int shortPathLength 
     ); 

    private static string GetShortPath(string path) { 
     var shortPath = new StringBuilder(MAX_PATH); 
     GetShortPathName(path, shortPath, MAX_PATH); 
     return shortPath.ToString(); 
    } 
+1

1 soy sólo la integración de un exe que sólo funciona con shortpaths (debido a un fallo interno) –

+1

MAX_PATH = 260 en windows.h – Constantin

+0

Esto parece fallar (no devuelve nada) si le pasa una ruta que es mayor que 'MAX_PATH' para acortar. – user17753

3

El truco con GetShortPathName de WinAPI funciona bien, pero tenga cuidado cuando utilice rutas muy largas allí.

Acabamos de tener un problema al llamar a 7zip con rutas más largas que MAX_PATH. GetShortPathName no funcionaba si la ruta era demasiado larga. Simplemente prefiéralo con "\? \" Y luego hará el trabajo y devolverá la ruta correctamente acortada.

Cuestiones relacionadas