2010-06-01 10 views
19
string path = Path.GetDirectoryName(
        Assembly.GetAssembly(typeof(MyClass)).CodeBase); 

de salida:¿Cómo puedo quitar el 'file: \' Desde el valor de retorno de Path.GetDirectoryName() en C#

archivo: \ d: \ aprender \ cs \ test \ test. xml

¿Cuál es la mejor manera de devolver sólo d: \ aprender \ cs \ test \ test.xml

file:\\ lanzará una excepción cuando llamo doc.Save(returnPath), sin embargo doc.Load(returnPath); funciona bien. Gracias.

+0

posible duplicado de [¿Existe un método de .NET Framework para convertir archivos URI a rutas con letras de unidad?] (Http://stackoverflow.com/questions/278761/is-there-a-net-framework-method- for-converting-file-uris-to-paths-with-drive-le) – nawfal

Respuesta

14

Si desea que el directorio del ensamblaje de esa clase, puede usar la propiedad Assembly.Location:

string path = Path.GetDirectoryName(Assembly.GetAssembly(typeof(MyClass)).Location); 

Esto no es exactamente lo mismo que la propiedad CodeBase, sin embargo. El Location es la "ruta o ubicación UNC del archivo cargado que contiene el manifiesto", mientras que CodeBase es la "ubicación del ensamblado como se especificó originalmente, por ejemplo, en un objeto AssemblyName".

+0

Gracias por su solución simple pero perfecta. @todos, gracias. –

+4

La ubicación es la ubicación del ensamblaje después de la copia oculta, mientras que Codebase es la ubicación original, antes de que se realizara la copia oculta. Por lo tanto, si se habilita la copia oculta y desea la ubicación original, se debe usar CodeBase. –

2

Mi primer enfoque sería así ...

path = path.Replace("file://", ""); 
+8

Si bien esto podría responder a la pregunta en cuestión para OP, esta es una solución pobre. La clase uri maneja muchos más casos de esquina. – nawfal

+1

@nawfal - "La clase uri maneja muchas más cajas de esquina" ... y también presenta muchos casos de esquina propios. Por ejemplo, si CodeBase para su ensamblado está en el archivo: /// c: /temp/#my_test#/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.EXE y pasa ese valor CodeBase al constructor de Uri, obtendrá c : \\ temp para uri.LocalPath. Los caracteres hash hacen que no funcione como uno esperaría. – dcp

0

utilice el método de cadena subcadena para agarrar el nombre de archivo después de archivo: \

47
string path = new Uri(Assembly.GetAssembly(typeof(MyClass)).CodeBase).LocalPath; 
+6

Me gustaría agregar que, si bien la solución de Chris se marcó como Respuesta, fue la solución de Matthew la que realmente proporcionó una solución adecuada a la pregunta en el título y a mi problema: Cómo convertir un archivo: // ruta de estilo a una ruta de estilo C: \ Gracias Matthew! –

8
System.Uri uri = new System.Uri(Assembly.GetAssembly(typeof(MyClass)).CodeBase); 
    string path = Path.GetDirectoryName(uri.LocalPath); 
-3

De esta manera se agrega el nombre del programa al final (C: \ Carpeta \ proyecto \ proyecto \ bin \ debug \ myapp.exe \ xyz.txt).

String replace es la solución más segura en mi opinión.

Cuestiones relacionadas