2012-03-26 7 views
4

Один из моих клиентов испытывает сбой в моем приложении WPF при сохранении файла.Исключение SaveFileDialog в моем приложении 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% уверенным, что происходит.

+0

Вы видели это http://stackoverflow.com/questions/5385619/issue-with-debugging-visual-studio-2010-solution-that-utilises-filedialog-from-t и этот http: // stackoverflow. ком/вопросы/6433373/МОФ-VB-нетто-OpenFileDialog-ShowDialog броски-ан-исключение? –

+0

Да, оба не связаны. Во-первых, это касается относительных путей к файлам (о которых я конкретно задаю в своем вопросе в отношении SpecialFolder.Мои документы). У второго есть ответ, что я даже не вижу, чтобы быть связанным с исходным вопросом - независимо от того, что это не помогает мне. – Ross

+0

Возможный дубликат [OpenFileDialog.ShowDialog() выдает исключение?] (Http://stackoverflow.com/questions/6433373/openfiledialog-showdialog-throws-an-exception) –

ответ

1

Найдено.

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

И он выходит из строя не более.

6

Я обнаружил, что использование

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

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

0

Для тех, кто имел такую ​​же проблему:

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

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