2008-11-03 5 views
5

auf der Suche nach der Standard-Bug-proofed Weg, um "lange Namen" wie "C: \ Dokumente und Einstellungen" zu ihren entsprechenden "kurzen Namen" "C: \ DOCUME ~" zu konvertieren 1 "Standard Weg zum Konvertieren in kurzen Pfad in .net

Ich brauche dies, um einen externen Prozess von meiner C# -App zu starten. Es schlägt fehl, wenn ich es mit Pfaden im "langen Namen" füttere.

+0

FYI I "kurzen Weg" glauben an die "8.3-Namen" bezeichnet – user17753

Antwort

4

Hat der externe Prozess fehlschlagen, auch wenn Sie die langen Dateipfade in Anführungszeichen? Das kann eine einfachere Methode sein, wenn die externe App dies unterstützt.

z.B.

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

Es funktioniert. Haben Sie Erklärungen oder Unterlagen, die erklären, was passiert? – Hanan

+0

Nicht wirklich. Es ist nur (angemessen) Standardverhalten für moderne Anwendungen, Argumente mit Leerzeichen zu akzeptieren, wenn die Zeichenfolge durch Anführungszeichen getrennt ist. – ZombieSheep

+2

Sie benötigen die Anführungszeichen, da der Pfad im Grunde eine Befehlszeilenoption ist und Leerzeichen das Trennzeichen für Befehlszeilenoptionen darstellt. Wenn Sie einen Pfad mit Leerzeichen verwenden, wird die Befehlszeile in mehrere Optionen geparst. Definition: "Space" - das ASCII-Zeichen oft fälschlicherweise für die Abwesenheit eines Zeichens –

19

Wenn Sie bereit sind, mit Windows-API-Funktionen zu beginnen, stellen GetShortPathName() und GetLongPathName() diese Funktionalität bereit.

Siehe 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 im nur eine exe-Integration, die nur mit shortpaths (aufgrund eines internen Fehler) arbeitet –

+1

MAX_PATH = 260 in windows.h – Constantin

+0

Dies scheint darauf hinzu fail (gibt nichts zurück), wenn Sie einen Pfad übergeben, der größer als 'MAX_PATH' ist, um verkürzt zu werden. – user17753

3

Der Trick mit GetShortPathName von WinAPI funktioniert gut, aber seien Sie vorsichtig, wenn Sie sehr lange Pfade dort verwenden.

Wir hatten gerade ein Problem beim Aufruf von 7zip mit Pfaden länger als MAX_PATH. GetShortPathName funktionierte nicht, wenn der Pfad zu lang war. Setzen Sie es einfach mit "\? \" Voran und dann wird der Job ausgeführt und der Pfad korrekt zurückgegeben.

Verwandte Themen