2012-10-31 48 views
0

所以我写了一些代码,并使用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; 
    } 

回答

2

双空终止字符串不能包含空行。试图包含空行意味着包含两个连续的空值,并且将其解释为终止而不是空行。 Raymond Chen discussed this quirk更有说服力,我可以。

也许你可以保存到REG_SZ并使用Environment.NewLine作为分隔符。

+0

这就是事情,注册表输出给出十六进制(7):3a,00,00,00,00,00作为输出,其中包含一个空行。它也可以导入,并且导入也可以工作,创建MultiString,它确实包含导出文件将显示它应该的空行。 –

+0

只要你想要,你可以在那里粘贴尽可能多的空值。一旦解析器连续遇到两个,它认为该列表已被终止。 –

+0

此外,我的问题是为什么注册表输出给十六进制(7):3a,00,00,00,00,00作为值(其工作)和RegistryKey.GetValue只给出非空行的数组元素MultiString。如果注册表可以创建一个包含双null的.reg文件,为什么RegistryKey.GetValue在MultiString中甚至没有该行的元素? –