Почему текущий рабочий каталог изменяется при использовании диалогового окна "Открыть файл" в Windows XP?
Я обнаружил странное поведение при использовании диалога открытия файла в 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
?
2 ответа
Исходя из вашего описания, звучит так, что значение по умолчанию свойства RestoreDirectory отличается в XP и Windows7. Я не уверен, почему это так, но вы можете решить эту проблему, явно указав значение в своем коде. Установка его в true восстановит каталог при закрытии диалога.
FileDialog (базовый класс OpenFileDialog) имеет свойство AutoUpgradeEnabled, которое определяет, использует ли диалоговое окно преимущества более новых файловых диалогов, которые были внедрены в Vista и более новых операционных системах, когда они доступны. (Внутренне это разница между вызовом GetOpenFileName в comdlg32 или использованием интерфейса IFileDialog).
Причина этого заключается в том, что более новые диалоги поддерживают ряд функций, таких как панель "мест" (см. Коллекцию CustomPlaces). Неожиданным побочным эффектом этого является то, что более новая реализация IFileDialog не меняет текущий каталог, в то время как более старая версия это изменяла.
Это ошибка в реализации диалогового окна файла, которая возникает независимо от значения свойства RestoreDirectory.
Если вы не хотите использовать более новую функцию диалога файлов, проще всего сделать для AutoUpgradeEnabled значение false.