2010-06-10 66 views
18

在c#中使用打开的文件对话框时,我发现了一个奇怪的行为。当在Windows XP中使用打开文件对话框时,为什么当前工作目录更改?

如果在Windows XP中使用此代码,则当前工作目录将更改为所选文件的路径,但如果在Windows 7中运行此代码,则当前工作目录不会更改。

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

有人知道这种行为的原因吗?为什么当前目录在XP中更改,而不是在Windows 7

回答

15

根据您的描述,它听起来像RestoreDirectory属性的默认值是不同的XP和Windows7之间。我不确定为什么会出现这种情况,但是您可以通过在代码中明确设置值来解决此问题。将其设置为true将恢复对话框关闭时的目录。

+0

感谢您的回答我真的知道如何解决这个问题。我只想知道这种行为的原因。 – RRUZ 2010-06-10 22:30:06

+0

@RRUZ,我很好奇自己。通过反射器中的代码挖掘,我看到了Vista的一种特殊方法(HandleVistaFileOK)。我的怀疑是这种方法是负责任的,但它再次没有真正回答为什么。 – JaredPar 2010-06-10 22:32:20

10

FileDialog(OpenFileDialog的基类)具有一个名为AutoUpgradeEnabled的属性,该属性控制对话框是否利用在Vista及更新的操作系统可用时更新的文件对话框。 (在内部,这是调用comdlg32中的GetOpenFileName或使用IFileDialog接口之间的区别)。

这样做的原因是,较新的对话框支持许多功能,如“位置”栏(请参阅CustomPlaces集合)。这意想不到的副作用是,新的IFileDialog实现不会更改当前目录,而旧版本则不会。

这是在文件对话框中执行一个错误,不管发生在RestoreDirectory属性的值

如果你不想使用新文件对话框的功能,最容易做的事情是设置的AutoUpgradeEnabled为false。