2010-06-10 10 views
18

Znalazłem dziwne zachowanie, gdy korzystasz z okna dialogowego otwierania plików w języku C#.Dlaczego obecny katalog roboczy zmienia się, gdy używasz okna dialogowego Otwórz plik w systemie Windows XP?

Jeśli użyjesz tego kodu w Windows XP, bieżący katalog roboczy zmienia się na ścieżkę wybranego pliku, jednak jeśli uruchomisz ten kod w Windows 7, bieżący katalog roboczy się nie zmieni.

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); 
    } 

Ktoś wie, dlaczego to zachowanie? Dlaczego bieżący katalog zmienia się w XP, a nie w Windows 7?

Odpowiedz

15

podstawie Twojego opisu brzmi jak domyślna wartość nieruchomości RestoreDirectory różni się między XP i Windows7. Nie jestem pewien, dlaczego tak się stało, ale możesz rozwiązać ten problem, jawnie ustawiając wartość w kodzie. Ustawienie na true spowoduje przywrócenie katalogu w oknie dialogowym close.

+0

Dzięki za ciebie odebrać i tak naprawdę nie wiedział, jak rozwiązać ten problem. Chcę tylko poznać przyczynę tego zachowania. – RRUZ

+0

@RRUZ, jestem ciekawy sam. Kopanie poprzez kod w reflektorze widzę specjalnej metody Vista (HandleVistaFileOK). Moje podejrzenie jest ta metoda jest odpowiedzialny, ale po raz kolejny, że tak naprawdę nie odpowiedzieć na pytanie, dlaczego. – JaredPar

10

FileDialog (klasa podstawowa OpenFileDialog) ma właściwość o nazwie AutoUpgradeEnabled, która określa, czy okno dialogowe korzysta z nowszych okien dialogowych plików, które zostały wprowadzone w systemie Vista i nowszych systemach operacyjnych, gdy są dostępne. (Wewnętrznie jest to różnica między wywołaniem GetOpenFileName w comdlg32 lub przy użyciu interfejsu IFileDialog).

Powodem jest to, że robi to nowsze dialogi wspierać szereg funkcji jak „miejsca” bar (zobacz kolekcję CustomPlaces). Nieoczekiwanym skutkiem ubocznym tego jest to, że nowsza implementacja IFileDialog nie zmienia bieżącego katalogu, podczas gdy starsza wersja to zrobiła.

Jest to błąd w realizacji dialogowym plik i dzieje się niezależnie od wartości nieruchomości RestoreDirectory

Jeśli nie chcesz korzystać z funkcji dialogowe plików nowszą, najprostszym rozwiązaniem jest ustawienie AutoUpgradeEnabled na false.

Powiązane problemy