从C#应用程序打开文件时,是否值得在注册表中查找默认应用程序?

时间:2009-05-20 06:17:21

标签: c# registry file-type

我正在构建一个应用程序(一个可能不止一次获得stackoverflow社区帮助的副项目),它需要打开各种文件类型(即在Word中打开Word文档,而不是本机在我的申请中。)

我一直在玩一些代码,用于在注册表中查找文件类型的默认应用程序,并将其传递给Process.Start()。这种方法似乎有两个问题:

1)在某些情况下引用应用程序名称,而在其他情况下则不引用 2)Process.Start()要求应用程序路径及其参数分别传递(即Process.Start(“notepad.exe”,@“C:\ myfile.txt”);而不是Process.Start(@“notepad) .exe C:\ myfile.txt“);)。

这意味着当我从注册表中检索路径时,我必须将其拆分(在确定是否需要拆分引号或空格之后)以确定应用程序路径的哪个部分以及哪些部分是参数,然后分别传递它们到Process.Start()。

替代方案似乎只是传递文件名,如Process.Start(@“C:\ myfile.txt”),但我认为只有在应用程序位于Path环境变量中时才有效。

哪种方式更好?在注册表的情况下,是否存在如何进行参数解析的通用解决方案?

感谢您的帮助!

更新
我想简短的回答是'不' 看起来我真的想要过度杀伤路线,并且只要文件名传递,只要注册表中有相关​​值,它就会起作用。即我自己在注册表中找到的任何东西,Process.Start()已经知道该怎么做了。

我确实发现当我尝试使用“new”文件类型时,我得到一个Win32Exception,声明“没有应用程序与此操作的指定文件相关联。” FredrikMörk在评论中提到他在Vista中不会发生这种情况。处理这个问题的正确方法是什么?

3 个答案:

答案 0 :(得分:5)

如果注册扩展程序是使用某个应用程序打开的,则无需在PATH中运行。

答案 1 :(得分:2)

如果只指定文件名,则应用程序不需要在PATH中。以下代码对我来说很好:

            System.Diagnostics.Process.Start(@"C:\Users\Dan\Desktop\minors.pdf");

答案 2 :(得分:0)

您通常不需要为已注册类型查找程序,并且程序通常不需要位于PATH环境变量中。通常,注册表中的命令包含完整路径。这就是.kml文件(Google Earth)的命令(在我的计算机中)的外观:

C:\Program Files\Google\Google Earth\googleearth.exe "%1"

鉴于此,您可以安全地将Process.Start与文档文件名一起使用。如果文件类型未注册,您将为此调用默认的Windows行为(询问您要使用哪个程序,等等)。