2009-05-30 11 views
15

Warum ändert OpenFileDialog mein Arbeitsverzeichnis? Sollte ich annehmen, dass viele Funktionen in System.Windows.Forms mein Arbeitsverzeichnis ändern?Warum ändert OpenFileDialog mein Arbeitsverzeichnis?

OpenFileDialog open = new OpenFileDialog(); 
    open.Filter = filter; 
    a = Directory.GetCurrentDirectory(); //<-- correct 
    if (open.ShowDialog() == DialogResult.OK) //-- select a file on my desktop 
    { 
     a = Directory.GetCurrentDirectory(); //<-- incorrect, is set to my desktop 

Antwort

6

Das aktuelle Arbeitsverzeichnis kann sich zur Laufzeit ändern, ja.

Betrachten

Directory.GetParent(Assembly.GetExecutingAssembly().Location) 

oder

System.AppDomain.CurrentDomain.BaseDirectory 

verwenden, wenn Sie Ihre Anwendungen Verzeichnis benötigen.

+0

heh, nicht so einfach. Ich benutze nur get/set wenn ich muss. Ich benutze MSVS, um das Arbeitsverzeichnis so einzustellen, dass es keine Möglichkeit für mich gibt zu erkennen, wo es sein sollte (außer ich es in die exe fest codiere) –

7

Es ist ein Schmerz, obwohl man es in mancherlei Hinsicht voraussehen kann ... Wenn Sie mehrere Male in einen geöffneten Dialog gehen (in einer App), finden Sie ihn oft dort, wo Sie ihn zuletzt verlassen haben.

Wenn der Code beeinträchtigt wird, können Sie vor dem Öffnen des Dialogfelds einen Snapshot von GetCurrentDirectory() erstellen und anschließend wiederherstellen (damit der Code die Änderung nicht erkennt). Sie möchten möglicherweise das Benutzer Arbeitsverzeichnis separat speichern (und tauschen Sie sie aus), so dass der Benutzer auch ihr erwartetes Verhalten erhält.

+0

Das ist genau was ich getan habe. Es war nur überraschend zu sehen, dass es passierte. Ich bin froh, dass du denkst, dass es auch ein Schmerz ist. –

+0

Dass der OpenFileDialog den gleichen Ordner beim nächsten Mal in derselben App öffnet, hat nichts damit zu tun, dass er das aktuelle Verzeichnis einstellt. Es sind einige Fenster, die in Magie eingebaut sind, um sich an das letzte Verzeichnis für diese Dialoge zu erinnern (wahrscheinlich irgendwo in der Registrierung). – ChrisWue

8

Was wir in einem aktuellen Projekt entdeckt haben, ist, dass der OpenFileDialog das aktuelle Verzeichnis nicht mehr ändert, wodurch die Eigenschaft .RestoreDirectory veraltet wird. Der Code in der Anwendung, mit dem das aktuelle Verzeichnis beim Öffnen einer Datei geändert wird (unter Windows XP). In Windows 7 wird das nicht mehr durchgeführt. Dadurch wurde die Anwendung beschädigt, da unser Dataset nicht mehr weiß, in welchem ​​Verzeichnis sich die Datei befindet, wenn wir versuchen, die Datei zu deserialisieren, indem wir den Dateinamen ohne den vollständigen Pfad verwenden. Nur ein Wort der Vorsicht, wenn Sie planen, zu Windows 7 zu migrieren.

+2

good lord, ich habe gerade diesen Kommentar gefunden, nachdem ich ungefähr 3 Stunden lang mit dieser Verrücktheit gekämpft habe und versucht zu verstehen, warum zum Teufel ich verschiedene Verhaltensweisen auf XP und Windows 7 für einen verdammten Dateidialog hatte. – Galactus

+0

Ich fragte mich, warum ausführen. \ Foo.exe funktionierte nicht auf XP :) – paulm

0

für Warum in XP die filialialog das aktuelle Verzeichnis ändern, ist es besser, MS zu fragen. Jedenfalls hat der geöffnete Dateidialog in XP dieses seltsame Verhalten, aber in W7 oder höher nicht. können Sie einfach das aktuelle Verzeichnis festlegen, nachdem Sie den Pfad aus SaveFileDialog gespeichert haben, damit das aktuelle Verzeichnis geändert wird.

poste ich meine Methode, wo Sie, dass der Pfad zu den Einstellungen wird sehen können chosed gespeichert und setzen Sie das aktuelle Verzeichnis

private void ShowSaveFileDialog(object sender, RoutedEventArgs e) 
    {  
     private const int xpVerMajorNumber = 5;   
     var saveFileDialog = new SaveFileDialog() 
     {     
      FileName = Settings.Default.ExcelFileName, 
      DefaultExt = "*.xlsx", 
      Filter = "Excel Workbook (.xlsx)|*.xlsx" 
     }; 

     if (saveFileDialog.ShowDialog(this) == true) 
      Settings.Default.ExcelFileName = saveFileDialog.FileName; 


     if (Environment.OSVersion.Version.Major <= xpVerMajorNumber) 
     { 
     Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory); 
     } 

    } 
+0

Dies liefert keine Antwort auf die Frage. OP wollte wissen ** WARUM ** – lokusking

+0

Ich denke jetzt ja – luka

+0

1) Die anderen Antworten sagte alles, was gesagt werden musste 2) XP ist nicht mehr als Unterstützung OS 3) Die Frage ist 7 Jahre alt, warum antwortest du! –

Verwandte Themen