Почему OpenFileDialog меняет рабочий каталог?

Почему 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

Ответы

Ответ 2

То, что мы обнаружили в текущем проекте, состоит в том, что OpenFileDialog больше не изменяет текущий каталог, что делает свойство .RestoreDirectory устаревшим. Код в приложении, используемый для изменения текущего каталога всякий раз, когда мы открываем файл (при работе в Windows XP). Это больше не работает в Windows 7. В результате это нарушило наше приложение, потому что теперь наш набор данных не знает, в какой директории находится файл, когда мы пытаемся десериализировать его, используя имя файла без полного пути. Просто предостережение, если вы планируете перейти на Windows 7.

Ответ 3

Это боль, хотя вы каким-то образом можете ее предвидеть... если вы заходите в открытое диалоговое окно несколько раз (в приложении), вы часто находите его там, где вы в последний раз его оставили.

Если это повлияет на ваш код, вы можете сделать снимок GetCurrentDirectory() перед тем, как войти в диалог, и затем восстановить его (чтобы ваш код не видел изменения). Вы можете захотеть сохранить рабочий каталог пользователя отдельно (и поменять их), чтобы пользователь также получил ожидаемое поведение.

Ответ 4

Текущая рабочая директория может меняться во время выполнения, да.

Рассмотрим использование

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

или

System.AppDomain.CurrentDomain.BaseDirectory

когда вам нужен каталог приложений.

Ответ 5

for Почему в XP filedialog меняет текущий каталог, лучше спросить MS. так или иначе, диалог открытия файла в XP имеет это странное поведение, но в w7 или выше нет. поэтому вы можете просто установить текущий каталог после сохранения пути, выбранного из SaveFileDialog, чтобы изменить текущий каталог.

Я отправляю свой метод, где вы можете видеть, что путь, который был заблокирован, сохраняется в настройках и reset текущий каталог

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

    }