我真的很抱歉我的英语很差。我正在编写一个程序来读取已安装的webBrowsers的版本信息。问题是我在下面得到这个例外
An entry with the same key already exists.
这是“已安装的浏览器”的注册表项的路径
private const string AppPath = @"Software"
我将路径值传递给我的函数,然后我比较了这个
的browserlistprivate readonly string[] _browserList ={"Google", "Mozilla"};
和注册表中的子名称以查找匹配项。
void GetBrowserInfo(string path)
{
RegistryKey key = Registry.CurrentUser.OpenSubKey(AppPath);
Dictionary<string,string>keyvalDictionary=new Dictionary<string, string>();
try
{
if (key != null)
{
string[] subKeys = key.GetSubKeyNames();
for (int i = 0; i < subKeys.Length; i++)
{
for (int j = 0; j < _browserList.Length; j++)
{
if (Array.IndexOf(subKeys, _browserList[j]) != -1)
{
RegistryKey openSubKey = Registry.CurrentUser.OpenSubKey(AppPath);
if (openSubKey != null)
{
string pathds = Path.Combine(openSubKey.ToString(), _browserList[j]);
string value= SelectedBrowser(_browserList[j],pathds);
keyvalDictionary.Add(_browserList[j],value);
}
}
}
}
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
private string SelectedBrowser(string name ,string path)
{
string value = "";
switch (name)
{
case "Google":
value = Registry.GetValue(path + "\\Chrome\\BLBeacon", "version", "").ToString();
break;
case "Mozilla":
value = Registry.GetValue(path + @"\Mozilla Firefox\35.0 (x86 tr)\Uninstall", "Description", "").ToString();
break;
}
return value;
}
这是调试输出
答案 0 :(得分:2)
你不需要外环。你做了n次同样的事情(其中n是subKeys的长度)。放下这个循环:
for (int i = 0; i < subKeys.Length; i++)
我认为现在一切都会奏效。
您收到此异常,因为在第一次迭代subKeys循环后,您将相同的键添加到字典中。
答案 1 :(得分:0)
if (key != null)
{
int j = 0;
string[] subKeys = key.GetSubKeyNames();
for (int i = 0; i < subKeys.Length; i++)
{
if (j < _browserList.Length)
{
if (Array.IndexOf(subKeys, _browserList[j]) != -1)
{
RegistryKey openSubKey = Registry.CurrentUser.OpenSubKey(AppPath);
if (openSubKey != null)
{
string pathds = Path.Combine(openSubKey.ToString(), _browserList[j]);
string value = SelectedBrowser(_browserList[j], pathds);
keyvalDictionary.Add(_browserList[j], value);
j++;
}
}
}
else
break;
}
}