2010-06-10 17 views
18

He encontrado un comportamiento extraño cuando uso el diálogo de abrir archivo en C#.¿Por qué el directorio de trabajo actual cambia cuando se utiliza el cuadro de diálogo Abrir archivo en Windows XP?

Si utiliza este código en Windows XP, el directorio de trabajo actual cambia a la ruta del archivo seleccionado; sin embargo, si ejecuta este código en Windows 7, el directorio de trabajo actual no cambia.

private void button1_Click(object sender, EventArgs e) 
    {    
     MessageBox.Show(string.Format("Current Directory {0}",Directory.GetCurrentDirectory()), "My Application",MessageBoxButtons.OK, MessageBoxIcon.Asterisk); 
     DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog and get result. 
     if (result == DialogResult.OK) 
     { 

     } 
     MessageBox.Show(string.Format("Current Directory {0}", Directory.GetCurrentDirectory()), "My Application", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); 
    } 

¿Alguien conoce el motivo de este comportamiento? ¿Por qué el directorio actual cambia en XP y no en Windows 7?

Respuesta

15

Según su descripción, parece que el valor predeterminado de la propiedad RestoreDirectory es diferente entre XP y Windows7. No estoy seguro de por qué este sería el caso, pero puede solucionar este problema al establecer explícitamente el valor en su código. Establecerlo en true restaurará el directorio en el diálogo cerrar.

+0

Gracias por su respuesta, realmente sabía cómo solucionar el problema. Solo quiero saber el motivo de este comportamiento. – RRUZ

+0

@RRUZ, tengo curiosidad por mí mismo. Excavando a través del código en el reflector veo un método especial para Vista (HandleVistaFileOK). Mi sospecha es que este método es responsable, pero una vez más no responde la pregunta de por qué. – JaredPar

10

FileDialog (la clase base de OpenFileDialog) tiene una propiedad llamada AutoUpgradeEnabled que controla si el diálogo aprovecha los diálogos de archivos más nuevos que se implementaron en Vista y en los sistemas operativos más nuevos cuando están disponibles. (Internamente, esta es la diferencia entre llamar a GetOpenFileName en comdlg32 o utilizar la interfaz IFileDialog).

La razón para hacer esto es que los diálogos más nuevos admiten una serie de características como la barra de "lugares" (consulte la colección CustomPlaces). Un efecto secundario inesperado de esto es que la implementación más nueva de IFileDialog no cambia el directorio actual, mientras que la versión anterior sí.

trata de un error en la ejecución de diálogo de archivos y sucede independientemente del valor de la propiedad RestoreDirectory

Si no desea utilizar la funcionalidad de diálogo archivo más reciente, lo más fácil de hacer es fijar el AutoUpgradeEnabled a falso.

Cuestiones relacionadas