C# 如何删除注册表项:获取错误“;无法删除。。。因为子键不存在";

C# 如何删除注册表项:获取错误“;无法删除。。。因为子键不存在";,c#,registry,registrykey,delete-method,C#,Registry,Registrykey,Delete Method,首先,我认识到这个问题似乎与其他问题相似。然而,到目前为止,我的研究还没有找到解决我所面临的具体问题的方法,只是找到了许多解决类似情况问题的方法 我不熟悉注册表函数,所以我一直在使用VM来处理它们,看看我能做些什么。目前,我正在尝试测试子项和HKEY_当前用户的创建、读取和后续删除。目前,除了删除,我可以做列表中的所有事情。有关守则如下: //This first sample will attempt to create a test key under HKEY_CURRENT_USER

首先,我认识到这个问题似乎与其他问题相似。然而,到目前为止,我的研究还没有找到解决我所面临的具体问题的方法,只是找到了许多解决类似情况问题的方法

我不熟悉注册表函数,所以我一直在使用VM来处理它们,看看我能做些什么。目前,我正在尝试测试子项和HKEY_当前用户的创建、读取和后续删除。目前,除了删除,我可以做列表中的所有事情。有关守则如下:

//This first sample will attempt to create a test key under HKEY_CURRENT_USER
        Console.WriteLine("Creating subkey under HKEY_CURRENT_USER");
        RegistryKey testKey2 = Registry.CurrentUser.CreateSubKey("SubKeyTester");
        Console.WriteLine("testKey2 is now assigned to {0}", testKey2);

        //This ensures that testKey2 is the value that I think it is
        Console.WriteLine("testKey2 value = {0}\n", testKey2);
输出为:

开始测试。。。 在HKEY_当前用户下创建子项

testKey2现在分配给HKEY_CURRENT_USER\SubKeyTester

testKey2值=HKEY\U当前用户\SubKeyTester

值得注意的是,testKey2存储了“HKEY_CURRENT_USER\SubKeyTester”,而不是我所期望的“SubKeyTester”。 在此之后,我可以检查HKEY_CURRENT_USER下的子键,并验证CurrentUser子键中是否确实存在“SubKeyTester”。现在,我只需要删除它。我的代码如下:

 //This portion of the test will attempt to delete SubKeyTester from 
        //HKEY_CURRENT_USER
        Console.WriteLine("Attempting to delete test subkey\n");
        try
        {
            Registry.CurrentUser.DeleteSubKeyTree(testKey2.ToString());
            Console.WriteLine("Target has been deleted\n");
        }
        catch(Exception e)
        {
            Console.WriteLine("The key targeted for deletion... is not found.\nError: {0}\n", e);
        }

        //Another safety check to verify that only SubKeyTester has been deleted
        Console.WriteLine("There are {0} subkeys under {1}.",
            Registry.CurrentUser.SubKeyCount.ToString(), Registry.CurrentUser.Name);
        foreach (string subKeyName in Registry.CurrentUser.GetSubKeyNames())
            Console.WriteLine(subKeyName);

        testKey2.Close();
    Console.WriteLine("Creating subkey under HKEY__CURRENT_USER\n");
    const string testKey2 = "SubKeyTester";
    Registry.CurrentUser.CreateSubKey(testKey2);
输出通知我: “错误:System.ArgumentException:无法删除子项树,因为该子项不存在。” 然后列出HKEY_CURRENT_USER下的所有子键,其中仍然包括testKey“SubKeyTester”


我相信这个问题可以通过在DeleteSubKeyTree调用中硬编码该子键的路径来解决,但我想避免这种情况。我更希望能够调用testKey2作为参数,并以这种方式删除键。有什么方法可以做到这一点吗?

我发现了我的错误,而且我走上了正确的道路。正确的代码如下:

 //This portion of the test will attempt to delete SubKeyTester from 
        //HKEY_CURRENT_USER
        Console.WriteLine("Attempting to delete test subkey\n");
        try
        {
            Registry.CurrentUser.DeleteSubKeyTree(testKey2.ToString());
            Console.WriteLine("Target has been deleted\n");
        }
        catch(Exception e)
        {
            Console.WriteLine("The key targeted for deletion... is not found.\nError: {0}\n", e);
        }

        //Another safety check to verify that only SubKeyTester has been deleted
        Console.WriteLine("There are {0} subkeys under {1}.",
            Registry.CurrentUser.SubKeyCount.ToString(), Registry.CurrentUser.Name);
        foreach (string subKeyName in Registry.CurrentUser.GetSubKeyNames())
            Console.WriteLine(subKeyName);

        testKey2.Close();
    Console.WriteLine("Creating subkey under HKEY__CURRENT_USER\n");
    const string testKey2 = "SubKeyTester";
    Registry.CurrentUser.CreateSubKey(testKey2);
这样,testKey2总是“SubKeyTester”。然后,唯一需要的修改是删除函数的参数

Registry.CurrentUser.DeleteSubKeyTree(testKey2);
正在删除ToString()方法

我相信问题在于,正如我所说的,testKey2得到的是“HKEY\u CURRENT\u USER//SubKeyTester”,而不仅仅是“SubKeyTester”。但是通过这种方式,testKey2只获得“SubKeyTester”,它允许正确的文件路径到适当的键

我试过使用

Registry.DeleteSubKeyTree(testKey2.ToString());
为了避免路径错误,但是“注册表”没有DeleteSubKeyTree方法,所以这根本不起作用


此外,此解决方案不需要.close()语句,因为从未打开过任何键。

我发现了错误,我的思路是正确的。正确的代码如下:

 //This portion of the test will attempt to delete SubKeyTester from 
        //HKEY_CURRENT_USER
        Console.WriteLine("Attempting to delete test subkey\n");
        try
        {
            Registry.CurrentUser.DeleteSubKeyTree(testKey2.ToString());
            Console.WriteLine("Target has been deleted\n");
        }
        catch(Exception e)
        {
            Console.WriteLine("The key targeted for deletion... is not found.\nError: {0}\n", e);
        }

        //Another safety check to verify that only SubKeyTester has been deleted
        Console.WriteLine("There are {0} subkeys under {1}.",
            Registry.CurrentUser.SubKeyCount.ToString(), Registry.CurrentUser.Name);
        foreach (string subKeyName in Registry.CurrentUser.GetSubKeyNames())
            Console.WriteLine(subKeyName);

        testKey2.Close();
    Console.WriteLine("Creating subkey under HKEY__CURRENT_USER\n");
    const string testKey2 = "SubKeyTester";
    Registry.CurrentUser.CreateSubKey(testKey2);
这样,testKey2总是“SubKeyTester”。然后,唯一需要的修改是删除函数的参数

Registry.CurrentUser.DeleteSubKeyTree(testKey2);
正在删除ToString()方法

我相信问题在于,正如我所说的,testKey2得到的是“HKEY\u CURRENT\u USER//SubKeyTester”,而不仅仅是“SubKeyTester”。但是通过这种方式,testKey2只获得“SubKeyTester”,它允许正确的文件路径到适当的键

我试过使用

Registry.DeleteSubKeyTree(testKey2.ToString());
为了避免路径错误,但是“注册表”没有DeleteSubKeyTree方法,所以这根本不起作用


此外,此解决方案不需要.close()语句,因为从未打开过任何键。

除了我的答案,如果有人知道更好的答案,请随时发布。我当然愿意学习!撇开我的答案不谈,如果有人知道更好的答案,请随时发布。我当然愿意学习!