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

5 ответов

Решение

Или вы можете заставить это не делать этого. См. Свойство FileDialog.RestoreDirectory.

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

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

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

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

или же

System.AppDomain.CurrentDomain.BaseDirectory

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

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

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

Почему в ХР файловый диалог меняет текущий каталог, лучше спросить у 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);
        }

    }
Другие вопросы по тегам