如何删除注册表项:出现错误 "Cannot delete... because the subkey does not exist"
How to delete registry key: getting error "Cannot delete... because the subkey does not exist"
首先,我发现这个问题与其他问题相似。但是,到目前为止,我的研究还没有找到解决我所面临的具体问题的方法,只是针对类似情况的问题提供了很多解决方案。
我是注册表功能的新手,所以我一直在使用 VM 来弄乱它们,看看我能做些什么。目前,我正在尝试测试 subKey 和 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();
输出告诉我:
"Error: System.ArgumentException: Cannot delete a subkey tree because the subkey does not exist."
然后它会列出 HKEY_CURRENT_USER 下的所有子项,其中仍然包括 testKey "SubKeyTester".
我相信只需在 DeleteSubKeyTree 调用中硬编码该子项的路径即可解决该问题,但我想避免这种情况。我宁愿只能够调用 testKey2 作为参数并以这种方式删除密钥。有办法吗?
我发现了我的错误,我走在了正确的轨道上。正确代码如下:
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());
绕过路径错误,但是 "Registry" 没有 DeleteSubKeyTree 方法,所以这根本行不通。
此外,此解决方案不需要 .close() 语句,因为从未打开任何密钥。
首先,我发现这个问题与其他问题相似。但是,到目前为止,我的研究还没有找到解决我所面临的具体问题的方法,只是针对类似情况的问题提供了很多解决方案。
我是注册表功能的新手,所以我一直在使用 VM 来弄乱它们,看看我能做些什么。目前,我正在尝试测试 subKey 和 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();
输出告诉我: "Error: System.ArgumentException: Cannot delete a subkey tree because the subkey does not exist." 然后它会列出 HKEY_CURRENT_USER 下的所有子项,其中仍然包括 testKey "SubKeyTester".
我相信只需在 DeleteSubKeyTree 调用中硬编码该子项的路径即可解决该问题,但我想避免这种情况。我宁愿只能够调用 testKey2 作为参数并以这种方式删除密钥。有办法吗?
我发现了我的错误,我走在了正确的轨道上。正确代码如下:
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());
绕过路径错误,但是 "Registry" 没有 DeleteSubKeyTree 方法,所以这根本行不通。
此外,此解决方案不需要 .close() 语句,因为从未打开任何密钥。