2012-04-02 11 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)); 
      } 
     } 

Niezależnie od tego, czy ustawię wartość RestoreDirectory na true, zawsze przejdę do katalogu LAST używanego, jeśli mój początkowy katalog jest ustawiony na ścieżkę, która nie istnieje. Gdzie jest ostatnio używany katalog zapisany przez OpenFileDialog? I czy istnieje sposób na obejście tego zachowania? (Np. zawsze chcę ustawić C: \ jeśli początkowy katalog nie istnieje?)Domyślna ścieżka OpenFileDialog

Odpowiedz

11

Gdzie jest ostatni katalog używany zapisany?

Jest przechowywany w rejestrze. Dokładna lokalizacja zależy od wersji Windows, dla Win7 jest to HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ ComDlg32. Szybki rzut z regeditem powinien cię przekonać, że nie musisz się z tym bałaganić.

Proste rozwiązanie polega na podaniu poprawnej ścieżki. Jeśli obliczona przez ciebie wartość jest niepoprawna, Directory.Exists zwraca wartość false, a następnie podaj poprawny. Podobnie jak folder Dokumenty zwrócony przez Environment.GetFolderPath(). Z drugiej strony, nic złego w ostatnim używanym, użytkownik łatwo rozpozna je z dobrymi szansami, że jest blisko pożądanego.

+0

Dzięki za obie odpowiedzi, zaznaczę twoją odpowiedź jako zaakceptowaną, chociaż druga odpowiedź jest również dobra. Fakt, że WRESZCIE mam odpowiedź na GDZIE DOKŁADNIE zapisana jest ścieżka, jest dla mnie plus. Dzięki jeszcze raz! –

+0

Upvoting _Hans Passant_ jest tak bezcelowy ... – itsho

1

Sprawdź, czy istnieje opcja ExcelFilePath, sprawdź, czy jest pusta, czy nie, ale jeśli przed tym blokujesz sprawdź, czy katalog istnieje, a jeśli nie resetuje wartości do pustego łańcucha, powinieneś być złoty.

(tak trzeba zastosować logikę nazwy pliku etc wcześniej) jednak kiedy już analizowany wszystko to na zewnątrz, to jest trywialne, aby określić, czy katalog wychodzi

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

Wydaje się, że wszystko, czego Należy wykonać następujące czynności:

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

To jest chyba, że ​​czegoś brakuje.

+0

openFileDialog1.InitialDirectory = Directory.Exists (ścieżka)?ścieżka: @ "C: \"; –

3

Nie sądzę, że jest w tym coś wbudowanego. Wystarczy sprawdzić przed otwarciem okna dialogowego:

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

W przypadku używasz nazwę pliku zapisanego w pewnym ciągiem, to lepiej użyć ścieżki wyciąć nazwę pliku (na moim W10 otwarte okno dialogowe nie otworzy się w początkowym katalogu, jeśli dostarczamy tylko nazwa pliku):

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

dla przyszłych mi

pamiętać zrobić:

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

Pomaga to w sytuacji, gdy użytkownik otworzył plik z lokalizacji, który już nie istnieje (np. Pamięć USB, zmapowany dysk sieciowy) - ShowDialog zgłasza wyjątek, jeśli InitialDirectory jest nieprawidłowy.