Исключение SaveFileDialog в моем приложении WPF

Один из моих клиентов испытывает сбой в моем приложении WPF при сохранении файла.

Код моего файла сохранения:

var saveFileDialog = new SaveFileDialog {
  InitialDirectory = string.Concat(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), @"\MyApp"),
  FileName = "MyFile", 
  OverwritePrompt = true,
  AddExtension = true
};

if (saveFileDialog.ShowDialog() == true) {
  ...
}

И вот исключение, которое они получают:

Value does not fall within the expected range.

A System.ArgumentException occurred
   at MS.Internal.Interop.HRESULT.ThrowIfFailed(String message)
   at MS.Internal.AppModel.ShellUtil.GetShellItemForPath(String path)
   at Microsoft.Win32.FileDialog.PrepareVistaDialog(IFileDialog dialog)
   at Microsoft.Win32.FileDialog.RunVistaDialog(IntPtr hwndOwner)
   at Microsoft.Win32.FileDialog.RunDialog(IntPtr hwndOwner)
   at Microsoft.Win32.CommonDialog.ShowDialog()

(Где ShowDialog в последней строке относится к вызову, который я делаю в своем коде выше.)

Итак, я предполагаю, что в случае моего клиента вызов Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) возвращает что-то, что SaveFileDialog не нравится как InitialDirectory. Я обнаружил в веб-поиске (и подтвердил), что эта ошибка возникает при передаче относительного пути как InitialDirectory диалогового окна SaveFileDialog. Возможно ли, что Environment.SpecialFolder.MyDocuments может быть возвращен как относительный путь? Если нет, кто-нибудь знает другой потенциально недопустимый формат? Может ли быть причиной определенный сетевой путь SpecialFolder.MyDocuments? Любые другие идеи?

У меня нет прямого доступа к машине моего клиента, и они не особо разбираются в технологиях, поэтому невозможно быть на 100% уверенным в том, что происходит.


person Ross    schedule 26.03.2012    source источник
comment
Вы видели эту stackoverflow.com/questions/5385619/ и этот stackoverflow.com/questions/6433373/?   -  person Andrei Schneider    schedule 26.03.2012
comment
Да, оба не связаны. Во-первых, это относится к относительным путям к файлам (о чем я специально спрашиваю в своем вопросе о SpecialFolder.MyDocuments). У второго есть ответ, который я даже не вижу в связи с исходным вопросом - тем не менее, он мне не помогает.   -  person Ross    schedule 26.03.2012
comment
Возможный дубликат OpenFileDialog.ShowDialog() вызывает исключение?   -  person Ian Kemp    schedule 18.01.2017


Ответы (3)


Я обнаружил, что с помощью

fullPath = System.IO.Path.GetFullPath(relPath);

устранил проблему для меня. Судя по всему, FileDialog.ShowDialog не нравятся относительные InitialDirectory значения.

person shadow    schedule 19.06.2012

Нашел.

InitialDirectory = string.Concat(
    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
    @"\MyApp"
)

Environment.SpecialFolder.MyDocuments возвращался на машине моего клиента с завершающим символом '\', поэтому полный конкатенированный путь содержал двойную '\'.

SaveFileDialog аварийно завершает работу, когда вы проходите путь InitialDirectory, содержащий двойной "\" (что, на мой взгляд, является недостатком - он должен более изящно обрабатывать или принуждать недопустимые входные данные).

Вместо этого я использую статический метод Path.Combine для обработки обоих вариантов:

InitialDirectory = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
    "MyApp"
)

И больше не вылетает.

person Ross    schedule 27.03.2012

Для тех, у кого была такая же проблема:

Исключение также возникает, когда Environment.SpecialFolder.MyDocuments указывает на сетевой диск (доменное окружение) и он каким-то образом недоступен. Тогда GetFullPath или Path.Combine не помогает.

Я решил перехватить исключение и вызвать ShowDialog во второй раз после установки InitialDirectory в системный корень, например. "С:\".

person Lumo    schedule 02.11.2017