删除注册表项

时间:2018-10-02 10:46:52

标签: c#

我正在尝试删除一个恰好是SAPI 5用户配置文件的注册表项子树,如下所示。 “ nameofprofile”是子项的数据值,子项名称是CLSID,但是它带有一个异常,告诉我该子项不存在?

RegistryKey RegKey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Speech\\RecoProfiles\\Tokens\\", true);
RegKey.DeleteSubKeyTree("NameOfProfile"); 

3 个答案:

答案 0 :(得分:1)

您可以尝试一下。

string keyName = @"Software\Microsoft\Speech\RecoProfiles\Tokens";
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyName, true))
{
   key.DeleteSubKeyTree("NameOfProfile",false);   
}

如果再次出现错误,则可以尝试以管理员模式运行应用程序。

答案 1 :(得分:0)

首先搜索string[] GetSubKeyNames(),然后查看子键是否存在。

如果遇到问题,请尝试忽略大小写。

var name = @"Software\Microsoft\Speech\RecoProfiles\Tokens";
var regKey = Registry.CurrentUser.OpenSubKey(name, true);
if (regKey != null) {
    using (regKey) {
        var subKeyName = "CLSID";
        var actual = regKey.GetSubKeyNames()
            .FirstOrDefault(n => string.Equals(n, subKeyName, StringComparison.InvariantCultureIgnoreCase));
        if (actual != null) {
            regKey.DeleteSubKeyTree(actual);
        }
    }
}

答案 2 :(得分:0)

最后,我自己解决了这个问题,并且效果很好。我应该在帖子中说我一直都知道配置文件名称,但我不知道CLSID。毫无疑问,有一种更简便的方法(不需要特殊权限,如果可能的话,最好是这样):

public static void DeleteKey (String profileName)
    {            
        // Folder for SAPI 5 user profile tokens
        String keyLocation = @"Software\Microsoft\Speech\RecoProfiles\Tokens";
        RegistryKey key = Registry.CurrentUser.OpenSubKey(keyLocation, true);  
        // Get a list of Key names and work out which one is the "test" profile
        String [] subKeyNames = key.GetSubKeyNames();
        // Enumerate through the sub key names to find out which one is the "Test" profile
        for(int i = 0; i < subKeyNames.Length; i++)
        {
            RegistryKey subKey =     
            Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Speech\\RecoProfiles\\Tokens\\" + subKeyNames[i]);                
            if(((String)subKey.GetValue("")).Equals(profileName))
            {                                                    
                key.DeleteSubKeyTree(subKeyNames[i]);
                return;
            }                                
        }                            
    }