Ruta predeterminada de OpenFileDialog

using (var openFileDialog1 = new OpenFileDialog()) { openFileDialog1.Reset(); if (!string.IsNullOrEmpty(ExcelFilePath)) { string fileName = Path.GetFileName(ExcelFilePath); string fileExt = Path.GetExtension(ExcelFilePath); //Avoid "you can't open this location using this program file" dialog //if there is a file name in the path strip it ) if (!string.IsNullOrEmpty(fileName)) initialDirectory = Path.GetDirectoryName(ExcelFilePath); //if not let it be else initialDirectory = ExcelFilePath; openFileDialog1.InitialDirectory = initialDirectory; } else openFileDialog1.InitialDirectory = "c:\\"; openFileDialog1.Filter = "Excel files (*.xls or *.xlsx)|*.xls;*.xlsx"; //openFileDialog1.Filter = "xls files (*.xls)|*.xls|xlsx files(*.xlsx)|.xlsx"; openFileDialog1.FilterIndex = 2; openFileDialog1.RestoreDirectory = false; openFileDialog1.CheckFileExists = true; openFileDialog1.CheckPathExists = true; if (openFileDialog1.ShowDialog() == DialogResult.OK) { var browseSelectionMade = BrowseSelectionMade; if (browseSelectionMade!=null) browseSelectionMade(this, new DataEventArgs(openFileDialog1.FileName)); } } 

Independientemente de si configuro RestoreDirectory como verdadero o no, siempre buscaré el ÚLTIMO directorio utilizado si mi directorio inicial está configurado en una ruta que no existe. ¿Dónde está guardado el último directorio usado por OpenFileDialog? ¿Y hay una manera de anular este comportamiento? (Por ejemplo, siempre quiero configurarlo en C: \ si el directorio inicial no existe?)

¿Dónde se guarda el último directorio usado?

Se almacena en el registro. La ubicación exacta depende de la versión de Windows, para Win7 es HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ ComDlg32. Una mirada rápida con regedit debería convencerte de que no quieres meterse con eso.

La solución simple es proporcionar una ruta válida. Si el que calcula no es válido, Directory.Exists devuelve falso, luego proporcione uno válido. Como la carpeta Documentos devuelta por Environment.GetFolderPath (). Por otra parte, nada malo con el último usado tampoco, el usuario lo reconocerá fácilmente con buenas probabilidades de que esté cerca del deseado.

Parece que todo lo que necesita hacer es lo siguiente:

 string path; // this is the path that you are checking. if(Directory.Exists(path)) { openFileDialog1.InitialDirectory = path; } else { openFileDialog1.InitialDirectory = @"C:\"; } 

Eso es a menos que me esté perdiendo algo.

No creo que haya nada incorporado para eso. Simplemente revise antes de abrir el diálogo:

 if (!Directory.Exists(initialDirectory)) { openFileDialog1.InitialDirectory = @"C:\"; } 

Además, para establecer la extensión predeterminada, debe establecer la propiedad FilterIndex en lugar de DefaultExt. ver: https://stackoverflow.com/a/6104319/381082

Aquí hay un buen artículo sobre OpenFileDialog en C #: http://www.c-sharpcorner.com/uploadfile/mahesh/openfiledialog-in-C-Sharp/

Compruebe si ExcelFilePath existe, compruebe si es nulo o está vacío, sin embargo, si antes de su locking comprueba si el directorio existe y si no restablece el valor en una cadena vacía, debe estar dorado.

(sí, tendrá que aplicar su lógica de nombre de archivo, etc. antes), sin embargo, una vez que haya analizado todo eso, es trivial determinar si el directorio se cierra.

 if (!Directory.Exists(excelPath)) { ExcelFilePath = String.Empty; } 

En caso de que esté usando un nombre de archivo almacenado en alguna cadena, es mejor usar Path para cortar el nombre del archivo (en mi W10 el diálogo de apertura no se abre en el directorio inicial, si proporciono solo el nombre del archivo):

  if (!System.IO.Directory.Exists(filename)) { openDlg.InitialDirectory = System.IO.Path.GetDirectoryName(filename); } 

Para mi futuro

recuerda hacer:

  try { result = dialog.ShowDialog(Window); } catch { dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); result = dialog.ShowDialog(Window); } 

Esto ayuda en la situación cuando el usuario abrió un archivo desde la ubicación, que ya no existe (por ejemplo, memoria USB, unidad de red asignada) – ShowDialog arroja una excepción si InitialDirectory no es válido.