【问题标题】:How can I programmatically check file that a file association exists before attempting to Process.Start() it?在尝试 Process.Start() 之前,如何以编程方式检查文件是否存在文件关联?
【发布时间】:2011-08-30 12:39:30
【问题描述】:

我的 .Net Windows Forms 应用程序生成一个 PDF 报告,我想向用户显示。

不只是假设客户端 PC 安装了 PDF 查看器并盲目地将 PDF 扔到操作系统上打开,有没有办法事先检查客户端上的文件关联列表 ,然后如果 PDF 不是注册类型,则显示“您需要安装 PDF 查看器应用程序 - 这里有一些建议..”对话框?

我找到了很多关于更改或注册文件关联的问题和答案,但我只是想要一种简单的方法来查询列表,而不是更改它。

我想要一个适用于 Windows XP 及更高版本(WinXP、Vista、Win7)的解决方案。

感谢您的帮助

【问题讨论】:

  • 如果没有注册的处理程序,Windows 将自动显示确切的对话框。不要在您的应用程序中重新发明轮子。
  • @Cody,这是一个很好的观点,我通常会(默认情况下)同意这一点。在这种情况下,我认为 windows 对话框并没有真正解释 my 应用程序正在尝试显示报告 - 我认为它不够明确,例如:windowsxp.mvps.org/images/webservice.JPG
  • 是的,我假设您运行的是现代版本的 Windows。对话有了很大的改善。它更加用户友好。不过,我会坚持使用标准对话框。如果用户仍在运行早期版本的操作系统,那就是他们熟悉的对话框。无论您花多少时间设计它,展示一个定制的产品更有可能让他们感到困惑。

标签: c# .net windows file-association


【解决方案1】:

我发现注册表中有一个.pdf键,也许它可以帮助你:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.pdf]
"Content Type"="application/pdf"
@="AcroExch.Document"

[HKEY_CLASSES_ROOT\.pdf\OpenWithList]
@=""

[HKEY_CLASSES_ROOT\.pdf\OpenWithList\AcroRd32.exe]
@=""

[HKEY_CLASSES_ROOT\.pdf\ShellEx]

[HKEY_CLASSES_ROOT\.pdf\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}]
@="{DC6EFB56-9CFA-464D-8880-44885D7DC193}"

【讨论】:

  • 我怀疑您是通过打开注册表编辑器并运行搜索关键字找到了这个。这让我的皮肤爬行; it's always the wrong way of figuring out how to do something in Windows。在这种情况下,您勉强避开了反对票,因为编辑注册表实际上记录在案的更改文件关联的方式。但这非常很少见,所以这不应该成为一种习惯。 [结束咆哮]
  • @Cody Gary,我不认为 Marino 建议编辑注册表,但这并不清楚。不知道有没有更好的办法。
【解决方案2】:

最好不要直接使用注册表,而是依赖 Windows API。这是一个提供 .NET 解决方案的 SO 链接:How do I get File Type Information based on extension? (not MIME) in c#

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-07
    • 2013-07-22
    • 2011-01-22
    • 1970-01-01
    • 2021-05-31
    • 2015-02-21
    • 2010-09-25
    相关资源
    最近更新 更多