5

私の顧客の1人が、ファイルを保存するときに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ます。Web検索(および検証済み)InitialDirectoryで、SaveFileDialogの相対パスを渡すときにこのエラーが発生することがわかりました。Environment.SpecialFolder.MyDocuments相対パスとして返される可能性はありますか?そうでない場合、誰かが別の潜在的に無効なフォーマットを知っていますか?特定のSpecialFolder.MyDocumentsネットワークパスが原因である可能性がありますか?他のアイデアはありますか?

私は顧客のマシンに直接アクセスできず、顧客は特に技術に精通していないため、何が起こっているのかを100%確実にすることはできません。

4

3 に答える 3

7

私はそれを使用して見つけました

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

私にとっては問題を解決しました。どうやら、FileDialog.ShowDialog相対的な値が好きではありませんInitialDirectory

于 2012-06-19T04:23:03.673 に答える
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"
)

そして、それはもうクラッシュしません。

于 2012-03-27T15:15:41.657 に答える
0

同じ問題を抱えていた人のために:

例外はEnvironment.SpecialFolder.MyDocuments、ネットワークドライブ(ドメイン環境)を指している場合にも発生し、何らかの理由で到達できません。その後GetFullPath、またはPath.Combine助けにはなりません。

InitialDirectoryをシステムルート(「C:\」など)に設定した後、例外をキャッチしてShowDialogをもう一度呼び出すことで解決しました。

于 2017-11-02T14:02:43.430 に答える