函数RegistryKey.GetSubKeyNames返回子键的顺序是什么?它们是按字母顺序排列的吗?或者它们在注册表中的存储顺序是随机的吗?
我已经进行了多次搜索,并检查了MSDN,但我还没有找到一个明确的答案。理想情况下,MSDN会声明键是按顺序排序的,或者显式地声明它们的顺序是随机的……
我想知道的原因是,我想编写代码来检测注册表中COM类的所有版本。如果关键字被排序,我可以只找到第一个匹配的关键字,遍历所有匹配我的搜索的关键字,一旦关键字不再匹配我的搜索,我就会跳过。这样我就不必遍历所有的子键了。
发布于 2013-05-07 04:07:00
由于文档不保证任何特定的顺序,因此您不能假定任何特定的顺序。如果你需要一个特定的订单,你必须自己排序。(顺序不是随机的,但也不排序。)
发布于 2020-07-22 10:45:41
我不能说这是一个明确的答案,但当我试图回答同样的问题时,我得出的结论是这是存储顺序,即FIFO或自然顺序。
我使用过的所有注册表编辑器都按字母顺序对键和值名进行排序。这不是自然的顺序。我认为HKLM\Software\Microsoft\Windows\CurrentVersion\Run.的自然顺序是通过RegScanner来实现的
除了删除键中的所有值,然后按字母顺序放回它们之外,我不知道有什么方法可以使自然顺序与字母顺序相匹配。但是,如果稍后添加一个新值,则此顺序将被打破,因为该新值将添加到末尾。
发布于 2018-01-04 04:28:25
我同意你不能假设没有文档的东西,但很多时候文档可能是错误的,过时的,或者不存在的。
因此,当通过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
这就是你的确切答案。
https://stackoverflow.com/questions/16405858
复制相似问题