C# 在Windows XP中使用“打开文件”对话框时,为什么当前工作目录会更改?

C# 在Windows XP中使用“打开文件”对话框时,为什么当前工作目录会更改?,c#,.net,openfiledialog,C#,.net,Openfiledialog,在c#中使用“打开文件”对话框时,我发现了一种奇怪的行为 如果在Windows XP中使用此代码,当前工作目录将更改为所选文件的路径,但是如果在Windows 7中运行此代码,当前工作目录不会更改 private void button1_Click(object sender, EventArgs e) { MessageBox.Show(string.Format("Current Directory {0}",Directory.Ge

在c#中使用“打开文件”对话框时,我发现了一种奇怪的行为

如果在
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中更改?

根据您的描述,该属性的默认值在XP和Windows 7之间似乎有所不同。我不确定为什么会出现这种情况,但可以通过在代码中显式设置值来解决这个问题。将其设置为true将在对话框关闭时还原目录

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

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

这是文件对话框实现中的一个错误,无论RestoreDirectory属性的值如何,都会发生


如果您不想使用较新的文件对话框功能,最简单的方法是将AutoUpgradeEnabled设置为false。

谢谢您的回答,我真的知道如何解决此问题。我只是想知道这种行为的原因。@RRUZ,我自己也很好奇。翻阅reflector中的代码,我看到了Vista的一种特殊方法(HandleVistaFileOK)。我怀疑这种方法是有责任的,但它再一次没有真正回答为什么的问题。