2009-05-30 4 views
15

Pourquoi OpenFileDialog modifie-t-il mon répertoire de travail? Devrais-je supposer que beaucoup func dans System.Windows.Forms va changer mon répertoire de travail?Pourquoi OpenFileDialog change-t-il de répertoire de travail?

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 

Répondre

6

Le répertoire de travail en cours peut changer pendant l'exécution, oui.

Pensez à utiliser

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

ou

System.AppDomain.CurrentDomain.BaseDirectory 

lorsque vous avez besoin de votre répertoire des applications.

+0

heh, pas facile. J'utilise simplement get/set quand j'en ai besoin. J'utilise MSVS pour définir le répertoire de travail de sorte qu'il n'y a aucun moyen possible pour moi de détecter où il devrait être (sauf si je le hardcode dans l'exe) –

7

C'est une douleur, bien que vous puissiez l'anticiper ... si vous entrez plusieurs fois dans une boîte de dialogue ouverte (dans une application), vous la trouverez souvent là où vous l'avez laissée la dernière fois. Si cela a un impact sur votre code, vous pouvez prendre un instantané de GetCurrentDirectory() avant d'aller dans la boîte de dialogue, et le restaurer ensuite (donc votre code ne voit pas la modification). Vous pouvez stocker le répertoire de travail de l'utilisateur séparément (et les échanger) afin que l'utilisateur obtienne également son comportement attendu.

+0

C'est exactement ce que j'ai fait. C'était juste surprenant de voir ça arriver. Je suis content de vous voir penser que c'est aussi une douleur. –

+0

Le fait que OpenFileDialog ouvre le même dossier la prochaine fois que vous l'introduisez dans la même application n'a rien à voir avec le fait qu'il définit le répertoire courant. C'est quelques fenêtres construites en magie pour se souvenir du dernier répertoire pour ces boîtes de dialogue (probablement quelque part dans le registre). – ChrisWue

8

Ce que nous avons découvert dans un projet actuel est que OpenFileDialog ne modifie plus le répertoire courant, rendant la propriété .RestoreDirectory obsolète. Le code dans l'application utilisée pour changer le répertoire courant chaque fois que nous avons ouvert un fichier (sous Windows XP). Il ne le fait plus dans Windows 7. En conséquence, il a brisé notre application car maintenant notre dataset ne sait pas dans quel répertoire se trouve le fichier lorsque nous essayons de le désérialiser en utilisant le nom du fichier sans le chemin complet. Juste un mot de prudence si vous envisagez de migrer vers Windows 7.

+2

bon seigneur, je viens de trouver ce commentaire après avoir combattu avec cette folie pendant environ 3 heures, en essayant de comprendre pourquoi le diable j'avais des comportements différents sur XP et Windows 7 pour un dialogue de fichier freaking. – Galactus

+0

Je me demandais pourquoi exécuter. \ Foo.exe ne fonctionnait pas sur XP :) – paulm

0

Pourquoi dans XP le filedialog changer le répertoire actuel, il est préférable de demander à MS. de toute façon le dialogue de fichier ouvert dans XP a ce comportement étrange, mais dans w7 ou supérieur non. de sorte que vous pouvez simplement définir le répertoire en cours après avoir enregistré le chemin sélectionné dans SaveFileDialog pour changer le répertoire courant.

je poste ma méthode où vous pouvez voir que le chemin chosed est enregistré dans les paramètres et réinitialiser le répertoire courant

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

Cela ne répond pas à la question. OP voulait savoir ** POURQUOI ** – lokusking

+0

Je pense maintenant oui – luka

+0

1) Les autres réponses disaient tout ce qui devait être dit 2) XP n'est plus comme support OS 3) La question est de 7 ans pourquoi répondez-vous! –

Questions connexes