所以我写了一些代码,并使用RegistryKey.GetValue
,我似乎无法得到它返回正确的字符串数组。我会使用RegSaveKeyEx,除非我需要更改密钥保存在我创建的reg文件中的位置。C#RegistryKey.GetValue不返回空行
我查询的MultiString有两条线,:
和一个空行。 Regedit为hex(7):3a,00,00,00,00,00
提供所述值的reg文件导出。这是对的。 3a将是:
,然后为零空白行,最后再有两个空值表示值的结尾。我的代码给出hex(7):3a,00,00,00
,这将是一个:
和MultiString上的双零EOL字符。当导入回注册表hex(7):3a,00,00,00
只是一个:
,空行缺失。
如果我导入hex(7):3a,00,00,00,00,00
然后查看注册表中的值,我看到:
和一个空行。这是正确的,这是我想要我的代码做的。
当我在C#4.0中用RegistryKey.GetValue
查询这个值时,我得到一个string[]
只有一个元素:
。
对于其他MultiString值,我得到一个包含每行的元素的数组,如我所期望的。
RegistryKey.GetValue
不会为空行返回任何内容。它不会在数组中返回null,空白字符串,也不会返回任何内容。
除了空白行之外的所有内容都返回与regedit导出完全相同的结果。需要更改哪些内容才能返回包含空行的数组?
这里是我的代码,如果这是有帮助的:
private static string RegMultiStringExtraction(RegistryKey UsersSubKey, string Key)
{
string[] InputStrs = (string[])UsersSubKey.GetValue(Key, Environment.NewLine, RegistryValueOptions.DoNotExpandEnvironmentNames);
StringBuilder sb = new StringBuilder();
foreach (string str in InputStrs)
{
char[] Values = str.ToCharArray();
foreach (char letter in Values)
{
int ValueInt = Convert.ToInt32(letter);
sb.Append(ValueInt.ToString("x"));
sb.Append(",00,");
if (Values.Length == 0)
{
if (sb.Length == 0)
{
sb.Append("00,");
}
else if (sb.Length > 1)
{
sb.Append(",00,");
}
}
}
sb.Append("00,00,");
}
string Value = ('"' + Key.ToString() + @"""=" + "hex(7):" + sb.ToString().TrimEnd(','));
return Value;
}
这就是事情,注册表输出给出十六进制(7):3a,00,00,00,00,00作为输出,其中包含一个空行。它也可以导入,并且导入也可以工作,创建MultiString,它确实包含导出文件将显示它应该的空行。 –
只要你想要,你可以在那里粘贴尽可能多的空值。一旦解析器连续遇到两个,它认为该列表已被终止。 –
此外,我的问题是为什么注册表输出给十六进制(7):3a,00,00,00,00,00作为值(其工作)和RegistryKey.GetValue只给出非空行的数组元素MultiString。如果注册表可以创建一个包含双null的.reg文件,为什么RegistryKey.GetValue在MultiString中甚至没有该行的元素? –