2012-04-02 51 views
15
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<string>(openFileDialog1.FileName)); 
      } 
     } 

Independientemente de si o no me puse a RestoreDirectory cierto, siempre se busque el directorio utilizado por último, si mi directorio inicial se establece en un camino 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?)OpenFileDialog ruta predeterminada

Respuesta

11

donde 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 debe convencerlo de que no quiere 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.

+0

Gracias por ambas respuestas, marcaré su respuesta como la aceptada, aunque la segunda respuesta también es buena. El hecho de que FINALMENTE tengo una respuesta a DÓNDE EXACTAMENTE se almacena el camino, es lo mejor para mí. ¡Gracias de nuevo! –

+0

Voto ascendente _Hans Passant_ se siente tan inútil ... – itsho

1

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

(sí se tendrá que aplicar la lógica de su nombre de archivo, etc anterior), sin embargo una vez que haya analizado sintácticamente todo esto a cabo, es trivial para determinar si el directorio sale

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

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 falta algo.

+0

openFileDialog1.InitialDirectory = Directory.Exists (path)?ruta: @ "C: \"; –

3

No creo que haya nada incorporado para eso. Sólo tienes que comprobar antes de abrir el cuadro de diálogo:

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

En caso de que esté utilizando el nombre de archivo almacenado en alguna cadena, es mejor utilizar ruta para cortar el nombre del archivo (en mi W10 del diálogo abierto no se abre en el directorio inicial, si me presento de suministro solo nombre):

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

para el futuro me

acuerdo de hacerlo:

  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ó el archivo desde la ubicación, que ya no existe (ej. Memoria USB, unidad de red asignada): ShowDialog arroja una excepción si InitialDirectory no es válido.

Cuestiones relacionadas