RegistryKey.GetSubKeyNames中的元素顺序

时间:2013-05-06 19:32:01

标签: c# .net

函数RegistryKey.GetSubKeyNames以什么顺序返回子键?它们是按字母顺序排列的吗?或者它们是否以与存储在注册表中的存储相对应的随机顺序?

我已经完成了多次搜索并检查了MSDN,但我还没有找到明确的答案。理想情况下,MSDN会声明密钥出来排序或明确说明它们的顺序是随机的......

我想知道的原因是我想编写代码来检测注册表中所有版本的COM类。它们的名称类似于< base-name> 13,< base-name> 14等。如果密钥已经排序,我可以找到匹配的第一个,遍历与我的搜索匹配的所有密钥,并且一旦按键不再匹配我的搜索,电路就会消失。然后我就不必遍历所有子键。

3 个答案:

答案 0 :(得分:5)

由于文档不保证任何特定订单,您不能承担任何特定订单。如果您需要特定订单,您必须自己排序。 (顺序不是随机的,但也没有排序。)

答案 1 :(得分:1)

我不能说这是一个确定的答案,但是当我试图为自己回答同样的问题时,我得出的结论是这是存储顺序,即FIFO或自然顺序。

我使用过的所有注册表编辑器都按字母顺序对键和值名称进行排序。这不是自然的顺序。 RegScanner向我展示了我认为HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ Run的自然顺序。

除了删除键中的所有值然后按字母顺序放回去,我不知道有什么方法可以使自然顺序与字母顺序匹配。但是,如果以后添加新值,则会破坏此顺序,因为该新值将在末尾添加。

答案 2 :(得分:0)

我同意,如果没有记录,你就不能假设,但很多时候文档可能是错误的,过时的或不存在的。

因此,当使用JetBrains的dotPeek,并查看mscorlib.dll时,我们看到以下代码用于提取SubKeyNames:

[SecuritySafeCritical]
Public String[] GetSubKeyNames()
{
  this.CheckPermission(RegistryKey.RegistryInternalCheck.CheckKeyReadPermission, (String) null, False, RegistryKeyPermissionCheck.Default);
  Return this.InternalGetSubKeyNames();
}

[SecurityCritical]
internal unsafe String[] InternalGetSubKeyNames()
{
  this.EnsureNotDisposed();
  Int length1 = this.InternalSubKeyCount();
  String[] strArray = New String[length1];
  If (length1 > 0)
  {
    Char[] chArray = New Char[256];
    fixed (Char* lpName = &chArray[0])
    {
      For (Int dwIndex = 0; dwIndex < length1; ++dwIndex)
      {
        Int length2 = chArray.Length;
        Int errorCode = Win32Native.RegEnumKeyEx(this.hkey, dwIndex, lpName, ref length2, (Int[]) null, (StringBuilder) null, (Int[]) null, (Long[]) null);
        If (errorCode != 0)
          this.Win32Error(errorCode, (String) null);
        strArray[dwIndex] = New String(lpName);
      }
    }
  }
  Return strArray;
}

所以 - 订单将始终使用RegEnumKeyEx函数。在那里我们看到&#34;因为子键没有被排序,所以任何新的子键都将具有任意索引。这意味着该函数可以按任何顺序返回子键。&#34;

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724862(v=vs.85).aspx

这是你明确的答案。