Seltsames C#-Pfadproblem

Lesezeit: 2 Minuten

Benutzer-Avatar
Ryan

Meine C#-Anwendung schreibt ihren vollständigen Pfad, umgeben von doppelten Anführungszeichen, in eine Datei mit:

streamWriter.WriteLine("\"" + Application.ExecutablePath + "\"");

Normalerweise funktioniert es, die geschriebene Datei enthält

"D:\Dev\Projects\MyApp\bin\Debug\MyApp.exe"

Aber wenn der ausführbare Pfad meiner Anwendung ein # enthält, passiert etwas Seltsames. Die Ausgabe wird:

"D:\Dev\Projects#/MyApp/bin/Debug/MyApp.exe"

Die Schrägstriche nach dem # werden zu Schrägstrichen. Dies verursacht Probleme mit dem System, das ich entwickle.

Warum passiert das, und gibt es eine elegantere Möglichkeit, dies zu verhindern, als den Pfad vor dem Schreiben zu ersetzen?

  • Ich kann das nicht reproduzieren. Ich habe meine App unter C:\my#\project\foo.exe ausgeführt und schreibt den Application.ExecutablePath korrekt aus, wie Sie oben geschrieben haben. Wird Application.ExecutablePath beim Debuggen korrekt überprüft? Bearbeitest du den Text, den du schreibst, nach, der hier nicht gezeigt wird?

    – Jo

    18. Oktober 2012 um 1:44 Uhr

  • Ich habe es in einem neuen Projekt erneut getestet, nur mit dem Code zum Schreiben der Datei. Es reproduziert sich immer noch. Das verwendete Framework ist 4.5, falls das einen Unterschied macht.

    – Ryan

    18. Oktober 2012 um 9:44 Uhr

  • Interessant, besonders im Hinblick auf Elians Beitrag unten. Frage mich, was ich anders gemacht habe (obwohl ich das 4.0-Framework verwendet habe …)

    – Jo

    18. Oktober 2012 um 11:23 Uhr


Benutzer-Avatar
Elian Ebbing

Ich habe gerade in den Quellcode von geschaut Application.ExecutablePathund die Implementierung ist im Wesentlichen dies*:

Assembly asm = Assembly.GetEntryAssembly();
string cb = asm.CodeBase;
var codeBase = new Uri(cb); 

if (codeBase.IsFile) 
    return codeBase.LocalPath + Uri.UnescapeDataString(codeBase.Fragment);
else
    return codeBase.ToString();

Die Eigenschaft Assembly.CodeBase gibt den Standort als URI zurück. Etwas wie:

file:///C:/myfolder/myfile.exe

Das # ist der Fragmentmarker in einem URI; es markiert den Anfang des Fragments. Anscheinend die Uri Die Klasse ändert den angegebenen URI, wenn er geparst und wieder zurück in einen String konvertiert wird.

Seit Assembly.Location enthält einen ‘normalen’ Dateipfad, ich denke, Ihre beste Alternative ist:

string executablePath = Assembly().GetEntryAssembly().Location;

*) Die Implementierung ist komplexer, da sie auch Situationen behandelt, in denen mehrere Anwendungsdomänen und andere Sondersituationen vorhanden sind. Ich habe den Code für die häufigste Situation vereinfacht.

  • Interessantes Problem … jedenfalls habe ich in Assembly.Location konvertiert und es ist gelöst. Vielen Dank 🙂

    – Ryan

    18. Oktober 2012 um 11:13 Uhr

Seltsamer Fehler/Bug. Abgesehen von der Verwendung einer Ersetzungsfunktion oder Erweiterungsmethode, um immer das richtige Format zurückzugeben, könnten Sie versuchen, es zu verwenden

System.Reflection.Assembly.GetExecutingAssembly().Location 

anstelle von ExecutablePath.

1229330cookie-checkSeltsames C#-Pfadproblem

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy