usar ruta combine c# c string path slash

combine - Problema de ruta de C#impar



string ruta c# (2)

Mi aplicación C # escribe su ruta completa rodeada de comillas dobles en un archivo, con:

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

Normalmente funciona, el archivo escrito contiene

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

Pero, si la ruta ejecutable de mi aplicación contiene un #, sucede algo extraño. La salida se convierte en:

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

Las barras después de # se convierten en barras delanteras. Esto causa problemas con el sistema que estoy desarrollando.

¿Por qué sucede esto y hay una manera de evitar que sea más elegante que la cadena? ¿Reemplazar la ruta antes de escribir?


Acabo de ver el código fuente de Application.ExecutablePath , y la implementación es esencialmente esto *:

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();

La propiedad Assembly.CodeBase devolverá la ubicación como un URI. Algo como:

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

El # es el marcador de fragmento en un URI; Marca el comienzo del fragmento. Aparentemente, la clase Uri altera el uri dado cuando se analiza y se convierte nuevamente en una cadena.

Dado que Assembly.Location contiene una ruta de archivo ''normal'', supongo que su mejor alternativa es:

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

* ) La implementación es más compleja que esto, porque también se ocupa de situaciones en las que existen múltiples aplicaciones y otras situaciones especiales. Simplifiqué el código para la situación más común.


Error impar / error. Aparte de usar una función de reemplazo o un método de extensión para devolver siempre el formato correcto que podría intentar usar

System.Reflection.Assembly.GetExecutingAssembly().Location

En lugar de ExecutablePath.