2010-06-18 8 views
7

Tengo una aplicación WPF que se instala en la máquina cliente a través del Windows Installer. Esta aplicación también registra una extensión de archivo (.xyz), por lo que cuando el usuario hace doble clic en un archivo, abre mi aplicación WPF y muestra el archivo (como Microsoft Word). Este programa también tiene una tonelada de archivos que no están marcados como recursos o archivos de contenido que utiliza (manuales de usuario, dibujos de partes, etc.).WPF Working Directory

El problema surge cuando el usuario hace doble clic en un archivo .xyz y abre la aplicación WPF. La aplicación ahora tiene un directorio de trabajo del directorio donde se encuentra el archivo .xyz. Ahora el programa no puede encontrar ninguno de los archivos (manuales de usuario, dibujos de partes, etc.) que necesita.

¿Cuál es la mejor manera de manejar este tipo de problema? Podría establecer el directorio de trabajo (Environment.CurrentDirectory), pero el cuadro de diálogo Abrir archivo cambia el directorio de trabajo cuando el usuario guarda o abre un archivo .xyz. Podría usar un paquete uri para los dibujos de piezas, pero utilizo Process.Start para los manuales del usuario porque son PDF. Intenté buscar, pero no pude encontrar nada.

Respuesta

5

Usted debe ser capaz de llegar a su directorio de instalación, ya sea mediante la búsqueda de directorio del ejecutable o mediante el uso de la reflexión para encontrar el directorio de una assemly:

Al encontrar ejecutable, puede agregar una referencia a Windows.Forms para que esto funcione (no es ideal):

using System.IO; 
using System.Windows.Forms; 

string appPath = Path.GetDirectoryName(Application.ExecutablePath); 

El uso de la reflexión:

using System.IO; 
using System.Reflection; 

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

O

string path = System.Reflection.Assembly.GetExecutingAssembly().Location; 

probablemente puede almacenar en caché ese camino onload de su aplicación, ya que no va a cambiar.

+0

Application.ExecutablePath no existe en WPF, por lo que utiliza la reflexión. Esto funciona para los archivos PDF y para los archivos de imagen. Estoy usando un URI de paquete. Simplemente parece que habría una forma mejor de manejar este escenario. – awilinsk

+0

Agregó un método alternativo ... – brendan

+0

Como [este enlace] (http://stackoverflow.com/a/948438/419348) dijo, 'System.Reflection.Assembly.GetExecutingAssembly(). Location' podría obtener la ubicación después 'shadow-copiando'. – AechoLiu

1

Otra cosa que podría querer hacer es simplemente reiniciar el directorio de trabajo actual al inicio.

Directory.SetCurrentDirectory(GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)); 

Eso te pondrá al día.

-1

En caso de que necesites envolver tu cerebro para conseguir un camino, te dejo con mi ejemplo. Usé el nombre del proyecto para rastrear cómo separar la cadena de ruta completa. Incluso dejaré la línea original, para que puedas entender el proceso de pensamiento.

var filepath = System.Reflection.Assembly.GetExecutingAssembly().Location; 
var rootindex = filepath.IndexOf("TestProject\\"); 
var wordlength = "TestProject".Count(); 
var rootpath = filepath.Remove(rootindex + wordlength); 
sDir = filepath.Remove(rootindex + wordlength); 
//sDir = "c:\\dev\\Test_Solution\\TestProject"; 

Sé que esto es lo básico, pero he estado fuera del trabajo durante unos meses ya veces es bueno tener un poco de ayuda con las cosas obvias.

2

Existe una diferencia entre la ubicación del ensamblaje y el directorio de trabajo de la aplicación. A veces, estos pueden ser los mismos, pero este no debe ser el caso. Para cambiar el directorio de trabajo, puede ejecutar su aplicación desde cmd.exe o simplemente crear un acceso directo con un directorio diferente en la propiedad Start in.

, usted puede obtener el directorio de trabajo de la aplicación como esta:

System.IO.Path.GetFullPath(".") 

Nota: El. -Directorio es siempre el directorio de trabajo actual, que acaba de obtener la ruta absoluta a la misma. A veces puede que no necesites el camino absoluto. Por ejemplo, si desea leer un archivo en el directorio de trabajo:

new StreamReader("./file-in-the-working-directory.txt"); 

o incluso:

new StreamReader("file-in-the-working-directory.txt"); 
+1

¿Por qué se favorecen todas esas otras respuestas? Este es el único correcto. Todos los demás dan la ubicación del ejecutable en lugar del directorio de trabajo. – marc40000

0
Path.GetDirectoryName(Application.ResourceAssembly.Location)