2012-03-26 7 views
4

Einer meiner Kunden stürzt beim Speichern einer Datei in meiner WPF-Anwendung ab.SaveFileDialog-Ausnahme in meiner WPF-App

meine Datei Code speichern ist:

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

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

Und hier ist die Ausnahme, sie werden immer:

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

(Wo die ShowDialog in der letzten Zeile auf den Aufruf bezieht sich ich in meinem Code machen oben.)

Also meine Ahnung ist, dass in meinem Kunden der Aufruf von Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments) etwas zurückgibt, dass die SaveFileDialog mag nicht wie die InitialDirectory. Ich habe in Websuchen gefunden (und validiert), dass dieser Fehler auftritt, wenn ein relativer Pfad als des SaveFileDialog übergeben wird. Ist es möglich, dass Environment.SpecialFolder.MyDocuments als relativer Pfad zurückgegeben werden konnte? Wenn nicht, weiß jemand ein anderes möglicherweise ungültiges Format? Könnte ein bestimmter SpecialFolder.MyDocuments-Netzwerkpfad die Ursache sein? Irgendwelche anderen Ideen?

Ich habe keinen direkten Zugriff auf die Maschine meines Kunden und sie sind nicht besonders technisch versiert, so dass es nicht möglich ist, 100% sicher zu sein, was passiert.

+0

Haben Sie dieses http://stackoverflow.com/questions/5385619/issue-with-debugging-visual-studio-2010-solution-that-utiles-filedialog-from-t und diesen http: // stackoverflow gesehen. com/questions/6433373/wpf-vb-net-openfiledialog-showdialog-wirft eine ausnahme? –

+0

Ja, beide nicht verwandt. Zunächst geht es um relative Dateipfade (die ich speziell in meiner Frage in Bezug auf SpecialFolder erkundige).Meine Dokumente). Das zweite hat eine Antwort, die ich nicht einmal mit der ursprünglichen Frage in Verbindung bringen kann - egal, es hilft mir nicht. – Ross

+0

Mögliches Duplikat von [OpenFileDialog.ShowDialog() löst eine Ausnahme aus?] (Http://stackoverflow.com/questions/6433373/openfiledialog-showdialog-throws-an-exception) –

Antwort

1

Es gefunden.

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

Environment.SpecialFolder.MyDocuments wird auf meiner Kundenmaschine mit einem nachgestellten zurückgegeben wird ‚\‘ Charakter, und so der komplette verketteten Weg hatte ein Doppel ‚\‘ drin.

SaveFileDialog stürzt ab, wenn Sie einen InitialDirectory Pfad übergeben, der ein doppeltes '\' enthält (was meiner Meinung nach ein Fehler ist - sollte ungültige Eingaben ungültiger handhaben oder erzwingen).

Ich verwende die Path.Combine statische Methode stattdessen nun beide Varianten zu handhaben:

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

Und es stürzt nicht mehr.

6

Ich fand, dass

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

das Problem für mich mit eliminiert. Anscheinend FileDialog.ShowDialog mag relative InitialDirectory Werte nicht.

0

Für diejenigen, die das gleiche Problem hatte:

Die Ausnahme geschieht auch, wenn Environment.SpecialFolder.MyDocuments Punkte auf einem Netzlaufwerk (Domänenumgebung), und es ist irgendwie nicht erreichbar. Dann hilft GetFullPath oder Path.Combine nicht.

Ich löste es die Ausnahme abfangen und ShowDialog ein zweites Mal nach dem Setzen von InitialDirectory auf das System Root, z. "C: \"