15

为什么 OpenFileDialog 会更改我的工作目录?我应该假设 System.Windows.Forms 中的许多功能会改变我的工作目录吗?

    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
4

5 回答 5

19

或者你可以让它不这样做。请参阅FileDialog.RestoreDirectory属性。

于 2009-10-09T17:08:22.843 回答
9

我们在当前项目中发现的是 OpenFileDialog 不再更改当前目录,从而使属性 .RestoreDirectory 过时。每当我们打开文件时(在 Windows XP 中运行时),应用程序中的代码用于更改当前目录。它在 Windows 7 中不再这样做。结果它破坏了我们的应用程序,因为现在我们的数据集不知道文件在哪个目录中,当我们尝试使用没有完整路径的文件名来反序列化它时。如果您计划迁移到 Windows 7,请注意。

于 2011-07-06T04:04:37.200 回答
7

当前工作目录可以在运行时更改,是的。

考虑使用

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

或者

System.AppDomain.CurrentDomain.BaseDirectory

当您需要您的应用程序目录时。

于 2009-05-30T23:09:36.733 回答
7

这是一种痛苦,尽管在某些方面你可能会预料到......如果你多次进入一个打开的对话框(在一个应用程序中),你经常会在上次离开它的地方找到它。

如果它影响您的代码,您可以GetCurrentDirectory()在进入对话框之前拍摄快照,然后将其恢复(因此您的代码看不到更改)。您可能希望单独存储用户的工作目录(并交换它们),以便用户也获得预期的行为。

于 2009-05-30T23:09:51.130 回答
0

对于为什么在XP中​​文件对话框更改当前目录,最好问MS。无论如何,XP中的打开文件对话框有这种奇怪的行为,但在w7或更高版本中没有。因此,您可以在保存从 SaveFileDialog 选择的路径后简单地设置当前目录,从而更改当前目录。

我发布了我的方法,您可以在其中看到选择的路径已保存到设置并重置当前目录

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

    }
于 2016-07-01T09:36:31.963 回答