对如何获取 RegistryKey 值感到困惑
Confused about how get RegistryKey value
我真的很抱歉我可怜的人english.I正在编写一个程序来读取已安装的 webBrowsers 的版本信息。问题是我在下面得到这个异常
An entry with the same key already exists.
这是已安装浏览器
注册表项的路径
private const string AppPath = @"Software"
我将路径值传递给我的函数,然后我比较浏览器列表,它是这个
private 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.0 (x86 tr)\Uninstall", "Description", "").ToString();
break;
}
return value;
}
这是调试输出
您不需要外循环。您正在做同样的事情 n 次(其中 n 是子键的长度)。只需删除此循环:
for (int i = 0; i < subKeys.Length; i++)
我想现在一切都会好起来的。
您收到此异常,因为在 subKeys 循环的第一次迭代后,您将相同的键添加到字典中。
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;
}
}
我真的很抱歉我可怜的人english.I正在编写一个程序来读取已安装的 webBrowsers 的版本信息。问题是我在下面得到这个异常
An entry with the same key already exists.
这是已安装浏览器
注册表项的路径private const string AppPath = @"Software"
我将路径值传递给我的函数,然后我比较浏览器列表,它是这个
private 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.0 (x86 tr)\Uninstall", "Description", "").ToString();
break;
}
return value;
}
这是调试输出
您不需要外循环。您正在做同样的事情 n 次(其中 n 是子键的长度)。只需删除此循环:
for (int i = 0; i < subKeys.Length; i++)
我想现在一切都会好起来的。
您收到此异常,因为在 subKeys 循环的第一次迭代后,您将相同的键添加到字典中。
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;
}
}