Исключение 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:\".