函数RegistryKey.GetSubKeyNames
以什么顺序返回子键?它们是按字母顺序排列的吗?或者它们是否处于与注册表中存储相对应的随机顺序?
我已经完成了多次搜索并检查了MSDN,但我还没有找到明确的答案。理想情况下,MSDN会声明密钥出来排序或明确说明他们的订单是随机的......
我想知道的原因是我想编写代码来检测注册表中所有版本的COM类。它们的名称类似于<base-name> 13,<base-name> 14等。如果按键排序,我可以找到匹配的第一个,迭代所有匹配我的搜索,并短路一旦密钥不再匹配我的搜索。然后我不必遍历所有子键。
由于文档不保证任何特定订单,您不能承担任何特定订单。如果您需要特定订单,您必须自己排序。 (订单不是随机的,但也没有排序。)
我同意,如果没有记录,你不能假设某些东西,但很多时候文档可能是错误的,过时的或不存在的。
因此,当使用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函数。在那里我们看到“因为子键没有被排序,所以任何新的子键都将具有任意索引。这意味着该函数可以以任何顺序返回子键。”
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724862(v=vs.85).aspx
这是你明确的答案。