5

我的一位客户在保存文件时遇到我的 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. 我在网络搜索中发现(并验证)当传递相对路径作为InitialDirectorySaveFileDialog 时会发生此错误。是否有可能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 设置为系统根目录后,我解决了它捕获异常并第二次调用 ShowDialog,例如“C:\”。

于 2017-11-02T14:02:43.430 回答