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

10

我有几个相关问题:

1)我的程序是否可以在运行时改变文件类型关联?您认为这种行为有什么问题吗?

2)另一个选项是让用户决定是否使用我的应用程序打开文件或还原默认关联,类似于:“捕获所有.lala文件”或“恢复.lala关联”。我该如何做到这一点?您认为哪种方法最好?

4个回答

7
关于文件关联,我之前写过一个答案,至少涵盖了“如何处理”
这也应该指向正确的方向来处理备份和恢复。通过C#直接访问注册表,就不需要使用.reg文件,因此您可以在应用程序中自由地备份先前的值,并从那里还原它。
关键问题是:您是否应该随意更改文件关联?至少事先询问用户显然是必要的(正如您所指出的)。
此外,启用UAC的Vista用户或其他Windows版本的非特权用户可能没有更改全局文件关联所需的权限。您的程序的(卸载)安装过程可能是唯一可以成功的地方。
编辑

正如Franci Penov在他的回答中所指出的, 有一种方法可以按用户更改本地文件关联,即使对于非管理员也是如此(这就是我在上一段中提到“全局关联”的原因)。他还提到了为什么不建议这样做。


4
另一个问题是,如果您的应用程序崩溃,它将错误地关联扩展。拥有这样的程序会让人非常恼火,因为它会更改计算机设置,并在崩溃时使它们“损坏”。 - Euro Micelli

3
您可以通过将一个小的可执行文件与该文件扩展名相关联并在启动时检查主应用程序是否正在运行并将文件名传递给它,或者如果它未运行,则调用“常规”关联应用程序来实现“即时”文件关联更改。
这种方法的主要优点是您只需要修改注册表一次。
这种方法的主要缺点是:
- 您需要一个辅助进程 - 拥有这些文件扩展名的应用程序可以检测到更改并向用户发出投诉,提示“修复”,从而让您退出画面。
另外,您可以在主程序启动时更改文件关联。这将适用于非管理员用户。尽管文件关联存储在HKEY_CLASSES_ROOT中,但有一个小技巧——HKCR实际上是HKEY_LOCAL_MACHINE\SOFTWARE\Classes和HKEY_CURRENT_USER\SOFTWARE\Classes的映射。因此,您可以在HKCU中为当前用户暂时注册文件扩展名,并从HKLM“遮盖”原始关联。
当然,我不建议采用这种方法,因为您的应用程序崩溃一次就会使该关联变成永久性的,由于很少有应用程序知道如何处理HKCU的文件关联,原始应用程序的情况可能是无法恢复的。

2
可能可以实现,但我认为这样做会变得很繁琐。所有文件类型的关联都存储在注册表中,因此您需要在每次应用程序启动和停止时编写/恢复注册表项。而且,根据您执行此操作的频率,新的关联可能无法立即在Windows资源管理器中生效。
这些关联在注册表中列在HKEY_CLASSES_ROOT下,并且可以通过多种方式进行映射(mime类型/progID等)。
我看到许多应用程序在安装期间询问您是否要将某些文件类型与该应用程序关联,并提供选择退出并保留当前设置的能力。
我不认为我会推荐“即时”文件类型关联。

1

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

至于错误,我不会这样做。第一个原因是它不是应用程序的标准行为。第二个原因是,如果您的应用程序或PC意外退出,您有可能无法将关联返回到其原始设置。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接