예제 #1
0
        internal static IDictionary <string, IDictionary <string, IList <string> > > Parse(string fileOrContent, bool ignoreCase, out IniFileFormat fileFormat)
        {
            fileFormat = IniFileFormat.Default;
            var source = fileOrContent;

            if (string.IsNullOrEmpty(source))
            {
                throw new ArgumentNullException(nameof(fileOrContent));
            }
            var path = PathEx.Combine(source);

            if (File.Exists(path))
            {
                source = File.ReadAllText(path, EncodingEx.Utf8NoBom);
            }
            var lines    = source.Split(TextSeparatorChar.AllNewLineChars, StringSplitOptions.RemoveEmptyEntries);
            var comparer = ignoreCase ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal;
            var content  = new Dictionary <string, IDictionary <string, IList <string> > >(comparer);
            var section  = string.Empty;
            var key      = string.Empty;
            var index    = 0;
            var isHex    = false;

            for (var i = 0; i < lines.Length; i++)
            {
                var line = lines[i];
                if (i == 0)
                {
                    if (line.Equals("Windows Registry Editor Version 5.00", StringComparison.Ordinal))
                    {
                        fileFormat = IniFileFormat.Regedit5;
                    }
                    else if (line.Equals("REGEDIT4", StringComparison.Ordinal))
                    {
                        fileFormat = IniFileFormat.Regedit4;
                    }
                }
                if (isHex && (isHex = IniHelper.IsHex(line)))
                {
                    content[section][key][index] += line.TrimEnd('\\');
                    continue;
                }
                var item = line.Trim();
                if (item.Length < 3 || item[0] == ';' || item[0] == '#')
                {
                    continue;
                }
                int length;
                if (item[0] == '[' && (length = item.LastIndexOf(']') - 1) > 0)
                {
                    section = item.Substring(1, length);
                    if (IniHelper.IsImportantSection(section) && !content.ContainsKey(section))
                    {
                        content.Add(section, default);
                    }
                    continue;
                }
                if ((length = item.IndexOf('=')) < 1 || length > item.Length - 2)
                {
                    continue;
                }
                key = item.Substring(0, length);
                var value = item.Substring(length + 1);
                if (IniHelper.HasHexPrefix(value) && IniHelper.IsHex(value) && value.EndsWith("\\", StringComparison.Ordinal))
                {
                    isHex = true;
                    value = value.TrimEnd('\\');
                }
                if (!content.ContainsKey(section))
                {
                    content.Add(section, new Dictionary <string, IList <string> >(comparer));
                }
                if (!content[section].ContainsKey(key))
                {
                    content[section].Add(key, new List <string>());
                }
                content[section][key].Add(value);
                if (isHex)
                {
                    index = content[section][key].Count - 1;
                }
            }
            return(content);
        }
예제 #2
0
 internal static bool TryParse(string fileOrContent, bool ignoreCase, out IDictionary <string, IDictionary <string, IList <string> > > result, out IniFileFormat fileFormat)
 {
     fileFormat = IniFileFormat.Default;
     try
     {
         result = Parse(fileOrContent, ignoreCase, out fileFormat);
         return(result != null);
     }
     catch (Exception ex) when(ex.IsCaught())
     {
         result = default;
         Log.Write(ex);
     }
     return(false);
 }