文件类型与应用程序的关联(C#)

时间:2008-10-21 16:35:44

标签: c# .net registry file-type

我有几个问题:

1)是否可以让我的程序更改文件类型关联但仅在运行时?你觉得这种行为有什么问题吗?

2)我看到的另一个选项是让用户决定使用我的应用程序打开或恢复默认关联...类似于:“捕获所有.lala文件”或“恢复.lala关联”。我怎样才能做到这一点?您认为这是最好的方法?

4 个答案:

答案 0 :(得分:7)

关于文件关联,我之前写过一个至少covers the "How"的答案。

这也应该指出如何处理备份和恢复的正确方向。通过c#直接注册表访问,不需要使用.reg文件,因此您可以在应用程序中自由备份以前的值,并从那里恢复它。

这里的关键问题是: 你应该随机改变文件关联吗?至少要求用户预先显然是必要的(正如你所指出的那样)。

此外,启用了UAC的Vista用户或其他Windows版本的非特权用户可能没有更改全局文件关联所需的权限。程序的(un)安装过程可能是唯一可以成功的地方。

修改

作为Franci Penov indicated in his answer 是一种基于每个用户更改本地文件关联的方法,即使对于非管理员也是如此(这就是为什么我谈到了“全局关联”)前一段)。他还提到为什么去那里不太合理。

答案 1 :(得分:3)

您可以通过将一个小的可执行文件与该文件扩展名相关联来实现“动态”文件关联更改,该文件扩展名在启动时将检查您的主应用程序是否正在运行并将文件名传递给它或者它是否未运行它调用“常规”关联应用程序。

这种方法的主要优点是您只需要使用注册表一次。

这种方法的主要缺点是:

  • 您需要帮助程序
  • “拥有”这些文件扩展名的应用程序可以检测到更改并向用户发出抱怨,提示“修复”,从而使您无法使用。

或者,您可以在主程序启动时更改文件关联。这甚至适用于非管理员用户。虽然文件关联存储在HKEY_CLASSES_ROOT中,但有一个小技巧 - HKCR实际上是HKEY_LOCAL_MACHINE\SOFTWARE\ClassesHKEY_CURRENT_USER\SOFTWARE\Classes的映射。因此,您可以在HKCU中临时注册当前用户的文件扩展名,并从HKLM“隐藏”原始关联。

当然,我会建议不要采用这种方法,因为在您的应用程序中只需要一次崩溃就可以使该关联成为永久性关联,并且由于很少有应用程序知道如何处理HKCU中的文件关联,因此很可能是原始申请无法恢复的情况。

答案 2 :(得分:2)

它可能已经完成,但我认为它最终会变得很麻烦。所有文件类型关联都存储在注册表中,因此每次应用程序启动和停止时都必须编写/恢复注册表项。此外,根据您执行此操作的频率,可能无法立即在Windows资源管理器中获取新关联。

关联在注册表中的HKEY_CLASSES_ROOT下列出,可以映射到无数种方式(mime types / progIDs / etc)。

我见过的许多应用程序询问您是否要在安装期间将某些文件类型与应用程序相关联,并允许您选择退出并保留当前设置。

我认为我不推荐“动态”文件类型关联

答案 3 :(得分:1)

1)您可以定义Open Dialog文件类型下拉列表中的文件类型。 除此之外,可能在应用程序打开时更改文件类型默认值,然后在应用程序关闭期间替换,因为文件类型关联只是一个注册表设置。

至于错误,我不会。第一个原因是它不是应用程序的标准行为。第二个原因是,如果您的应用程序或PC意外退出,则存在不将关联返回到其原始设置的风险。

2)默认情况下,Windows允许用户使用右键单击和“打开方式”命令选择这些选项。