Исключение SaveFileDialog в моем приложении WPF - PullRequest
4 голосов
/ 26 марта 2012

Один из моих клиентов испытывает сбой в моем приложении 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 ]

6 голосов
/ 19 июня 2012

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

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

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

1 голос
/ 27 марта 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"
)

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

0 голосов
/ 02 ноября 2017

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

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

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

.
...