【问题标题】:SaveFileDialog exception in my WPF app我的 WPF 应用程序中的 SaveFileDialog 异常
【发布时间】:2012-04-10 03:40:33
【问题描述】:

我的一位客户在保存文件时遇到 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 的内容。我在网络搜索中发现(并经过验证),当将相对路径作为 SaveFileDialog 的 InitialDirectory 传递时会发生此错误。 Environment.SpecialFolder.MyDocuments 是否有可能作为相对路径返回?如果没有,是否有人知道另一种可能无效的格式?某个 SpecialFolder.MyDocuments 网络路径可能是原因吗?还有其他想法吗?

我无法直接访问客户的机器,他们也不是特别精通技术,因此无法 100% 确定发生了什么。

【问题讨论】:

标签: wpf savefiledialog special-folders argumentexception


【解决方案1】:

我发现使用

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

为我解决了这个问题。 显然,FileDialog.ShowDialog 不喜欢相对的 InitialDirectory 值。

【讨论】:

    【解决方案2】:

    找到了。

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

    它不再崩溃。

    【讨论】:

      【解决方案3】:

      对于那些有同样问题的人:

      Environment.SpecialFolder.MyDocuments 指向网络驱动器(域环境)并且不知何故无法访问时,也会发生异常。然后GetFullPathPath.Combine 没有帮助。

      在将 InitialDirectory 设置为系统根目录后,我解决了它捕获异常并第二次调用 ShowDialog,例如"C:\"。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 2013-09-15
        • 2011-08-27
        • 1970-01-01
        相关资源
        最近更新 更多