Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与应用程序的文件类型关联(C#)_C#_.net_Registry_File Type - Fatal编程技术网

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

与应用程序的文件类型关联(C#),c#,.net,registry,file-type,C#,.net,Registry,File Type,我有几个相关的问题: 1) 是否可以使我的程序更改文件类型关联,但只能在运行时进行?你觉得这种行为有什么不对吗 2) 我看到的另一个选择是让用户决定用我的应用程序打开或恢复默认关联。。。类似于:“捕获所有.lala文件”或“还原.lala关联”。我该怎么做?你认为什么是最好的方法?这可能是可以做到的,但我认为最终会很麻烦。所有文件类型关联都存储在注册表中,因此每次应用程序启动和停止时,您都必须写入/还原注册表项。此外,根据您执行此操作的频率,可能不会立即在Windows资源管理器中获取新关联 这

我有几个相关的问题:

1) 是否可以使我的程序更改文件类型关联,但只能在运行时进行?你觉得这种行为有什么不对吗


2) 我看到的另一个选择是让用户决定用我的应用程序打开或恢复默认关联。。。类似于:“捕获所有.lala文件”或“还原.lala关联”。我该怎么做?你认为什么是最好的方法?

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

这些关联在注册表的HKEY_CLASSES_ROOT下列出,可以通过多种方式映射(mime类型/progIDs/etc)

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

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

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

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


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

关于文件关联,我至少在早些时候写了一个答案

这还应该为您指明如何处理备份和恢复的正确方向。通过c#直接访问注册表,无需使用.reg文件,因此您可以在应用程序中随意备份以前的值,也可以从中还原

这里的关键问题是:是否应该随机更改文件关联?至少提前询问用户显然是必要的(正如您所指出的)

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

编辑

例如,有一种方法可以基于每个用户更改本地文件关联,即使对于非管理员也是如此(这就是我在上一段中提到“全局关联”的原因)。他还提到了为什么去那里不太可取。

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

这种方法的主要优点是只需修改注册表一次

这种方法的主要缺点是:

  • 您需要一个助手进程
  • “拥有”这些文件扩展名的应用程序可以检测到更改并向用户投诉,提示“修复”,从而使您摆脱困境
或者,您可以在主程序启动时更改文件关联。这甚至对非管理员用户也有效。虽然文件关联存储在
HKEY\u CLASSES\u ROOT
中,但有一个小技巧-HKCR实际上是
HKEY\u LOCAL\u MACHINE\SOFTWARE\CLASSES
HKEY\u CURRENT\u USER\SOFTWARE\CLASSES
的映射。因此,您可以在HKCU中临时注册当前用户的文件扩展名,并从HKLM“隐藏”原始关联


当然,我建议您不要使用这种方法,因为您的应用程序只需要一次崩溃,就可以使该关联永久化,而且由于很少有应用程序知道如何处理HKCU中的文件关联,对于原始应用程序来说,很可能出现无法恢复的情况。

另一个问题是,如果应用程序崩溃,则会使扩展错误关联。有一个程序像那样更改计算机设置,并在崩溃时让它们“损坏”,这真是令人讨厌