C# 如何删除每用户文件关联

C# 如何删除每用户文件关联,c#,windows,registry,C#,Windows,Registry,为另一个关于文件关联的问题提前道歉。我已经更改了用于创建文件关联的代码,以便它使用HKEY\U current\U USER\Software\Classes。这就解决了需要管理员权限的问题,感谢David Heffernan坚持我的观点 我发现继续创建文件关联不会在注册表中复制它,而是会更改数据。因此,如果我分配给另一个可执行文件,它将用当前文件替换上一个文件。但是,我想看看如何完全清除文件关联。我只需搜索条目,如果条目存在,请删除密钥: public static void RemoveAs

为另一个关于文件关联的问题提前道歉。我已经更改了用于创建文件关联的代码,以便它使用HKEY\U current\U USER\Software\Classes。这就解决了需要管理员权限的问题,感谢David Heffernan坚持我的观点

我发现继续创建文件关联不会在注册表中复制它,而是会更改数据。因此,如果我分配给另一个可执行文件,它将用当前文件替换上一个文件。但是,我想看看如何完全清除文件关联。我只需搜索条目,如果条目存在,请删除密钥:

public static void RemoveAssociation(string extension) {
       if (!IsAssociated(extension)) return;
       var currentUser = Registry.CurrentUser;
       var softwareKey = getKey(currentUser, "Software");
       if (softwareKey != null) {
           var softwareClasses = getKey(softwareKey, "Classes");
           if (softwareClasses != null) {
               softwareClasses.DeleteSubKey(extension);
           }
       }
}
IsAssociated仅在HKEY_CURRENT_USER\Software\Class中查找扩展密钥

这会删除注册表项,但不会删除注册表中的所有项。我在HKEY_CLASSES_ROOT以及HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\EXTENSIONS中找到了一个条目。我正在运行Win7,所以我想,但我认为这将出现在XP和Vista中

双击扩展现在会出现一个对话框,告诉我windows找不到相关联的可执行文件,可能是因为我将该键保留在class_ROOT中,但通过删除该键删除了连接

那么,如何干净地删除对扩展的所有引用呢

谢谢

编辑

这是我用来创建关联的代码:

public static void Associate(string extension, string progID, string description, string icon, string application) {
    if (extension == null) return;
    if (String.IsNullOrEmpty(progID)) return;
    if (String.IsNullOrEmpty(application)) return;

    var currentUser = Registry.CurrentUser;
    var softwareKey = getKey(currentUser, "Software");

    if (softwareKey != null) {
        var softwareClasses = getKey(softwareKey, "Classes");

        if (softwareClasses != null) {
            softwareClasses.CreateSubKey(extension).SetValue("", progID);

            using (var key = softwareClasses.CreateSubKey(progID)) {
                    if (description != null)
                        key.SetValue("", description);
                    if (icon != null)
                        key.CreateSubKey("DefaultIcon").SetValue("", toShortPathName(icon));
                    //if (application != null)
                        key.CreateSubKey(@"Shell\Open\Command").SetValue("", toShortPathName(application) + " \"%1\"");
                }
        }
    }

}

您的代码似乎删除了文件类型映射,但没有删除progID。你有关于如何安装关联的完整代码吗?我将其添加到原始问题中。感谢根据我阅读的文档,卸载时您将删除progID,但保留扩展名。你做的正好相反。好的,谢谢。我会再看一遍。