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

我有几个相关的问题:

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

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

关于文件关联,我之前写了一个答案,至少涵盖了“如何” 。

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

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

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

编辑

正如Franci Penov在他的回答中指出的那样 ,有一种方法可以在每个用户的基础上更改本地文件关联,即使对于非管理员也是如此(这就是为什么我在上一段中谈到“全球关联”)。 他还提到过为什么去那里不太可取。

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

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

这种方法的主要缺点是:

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

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

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

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

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

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

我不认为我会推荐“即时”文件类型关联

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

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

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