对如何获得RegistryKey值感到困惑

时间:2015-03-20 10:47:37

标签: c# winforms registry

我真的很抱歉我的英语很差。我正在编写一个程序来读取已安装的webBrowsers的版本信息。问题是我在下面得到这个例外

An entry with the same key already exists.

这是“已安装的浏览器”的注册表项的路径

private const string AppPath = @"Software"

我将路径值传递给我的函数,然后我比较了这个

的browserlist
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\35.0 (x86 tr)\Uninstall", "Description", "").ToString();
                    break;

            }
            return value;
        }

这是调试输出 enter image description here

2 个答案:

答案 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;
                }

            }