Исключение 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% уверенным в том, что происходит.

3 ответа

Решение

Нашел это.

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"
)

И это больше не падает.

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

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

устранил проблему для меня. По-видимому, FileDialog.ShowDialog не любит родственников InitialDirectory ценности.

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

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

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

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