Ответ 1
Или вы можете сделать это не так. См. Свойство FileDialog.RestoreDirectory.
Почему 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
Или вы можете сделать это не так. См. Свойство FileDialog.RestoreDirectory.
То, что мы обнаружили в текущем проекте, состоит в том, что OpenFileDialog больше не изменяет текущий каталог, что делает свойство .RestoreDirectory устаревшим. Код в приложении, используемый для изменения текущего каталога всякий раз, когда мы открываем файл (при работе в Windows XP). Это больше не работает в Windows 7. В результате это нарушило наше приложение, потому что теперь наш набор данных не знает, в какой директории находится файл, когда мы пытаемся десериализировать его, используя имя файла без полного пути. Просто предостережение, если вы планируете перейти на Windows 7.
Это боль, хотя вы каким-то образом можете ее предвидеть... если вы заходите в открытое диалоговое окно несколько раз (в приложении), вы часто находите его там, где вы в последний раз его оставили.
Если это повлияет на ваш код, вы можете сделать снимок GetCurrentDirectory()
перед тем, как войти в диалог, и затем восстановить его (чтобы ваш код не видел изменения). Вы можете захотеть сохранить рабочий каталог пользователя отдельно (и поменять их), чтобы пользователь также получил ожидаемое поведение.
Текущая рабочая директория может меняться во время выполнения, да.
Рассмотрим использование
Directory.GetParent(Assembly.GetExecutingAssembly().Location)
или
System.AppDomain.CurrentDomain.BaseDirectory
когда вам нужен каталог приложений.
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);
}
}