1

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

我是注册表功能的新手,所以我一直在使用虚拟机来处理它们,看看我能做什么。目前,我正在尝试测试子键和 HKEY_CURRENT_USER 的创建、读取和后续删除。目前,除了删除之外,我可以执行该列表中的所有操作。相关代码如下:

//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_CURRENT_USER 下创建子键

testKey2 现在分配给 HKEY_CURRENT_USER\SubKeyTester

testKey2 值 = HKEY_CURRENT_USER\SubKeyTester

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

 //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();

输出通知我:“错误:System.ArgumentException:无法删除子项树,因为子项不存在。” 然后它会列出 HKEY_CURRENT_USER 下的所有子键,其中仍然包括 testKey“SubKeyTester”。

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

4

1 回答 1

0

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

    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_CURRENT_USER//SubKeyTester”,而不仅仅是“SubKeyTester”。但是这样一来,testKey2 只能获得“SubKeyTester”,它允许正确的文件路径到相应的密钥。

我曾尝试使用

Registry.DeleteSubKeyTree(testKey2.ToString());

绕过路径错误,但“注册表”没有 DeleteSubKeyTree 方法,因此根本不起作用。

此外,此解决方案不需要 .close() 语句,因为没有打开任何密钥。

于 2017-06-12T16:07:48.000 回答