XNA - 如何加载.ini文件的全部内容

时间:2012-12-09 22:15:43

标签: c# xna ini

我设法写入并从.ini文件中读取特定参数 我想知道是否有办法加载.ini文件的整个内容并将其存储在一个特殊的类中。这样,我只需要加载一次.ini文件。这样它可以减少游戏的负载量。

我知道在小型游戏中,它可能并不重要,但如果有人能指出我正确的方向,我仍然会感激。

2 个答案:

答案 0 :(得分:3)

我相信C#的创建者倾向于将人们推向基于XML的配置文件,而不是INI文件 - 因此没有任何内置的东西。我在CodeProject上找到了这篇文章,它包装了一个很好的类。这会有什么帮助吗?

http://www.codeproject.com/Articles/1966/An-INI-file-handling-class-using-C

我没有写它 - 并没有因此而受到赞誉,但它可能正是你所寻求的:)

答案 1 :(得分:1)

假设INI是一个简单的键/值对,用新行拆分可以使用类似的东西将整个INI文件作为字典或强类型对象提供。

该方法允许您将ini文件加载到这样的对象中。

class IniStructure
{
    public short Field1;
    public int Property1 { get; set; }
    public string Property2 { get; set; }
}

IniStructure ini = IniLoader.Load<IniStructure>(<fileName>);

或仅使用非T方法进入字典。

public static class IniLoader
    {
        public static T Load<T>(string fileName)
        {
            T results = (T)Activator.CreateInstance(typeof(T));

            PropertyInfo[] tProperties = typeof(T).GetProperties();
            FieldInfo[] tFields = typeof(T).GetFields();

            var iniFile = Load(fileName);

            foreach (var property in tProperties)
                if (iniFile.ContainsKey(property.Name))
                {
                    object s = System.Convert.ChangeType(iniFile[property.Name].ToString(), property.PropertyType);
                    property.SetValue(results, s, null);
                }
            foreach (var field in tFields)
                if (iniFile.ContainsKey(field.Name))
                {
                    object s = System.Convert.ChangeType(iniFile[field.Name].ToString(), field.FieldType);
                    field.SetValue(results, s);
                }

            return results;
        }

        public static Dictionary<string, object> Load(string fileName)
        {
            Dictionary<string, object> results = new Dictionary<string, object>();

            string fileText = File.ReadAllText(fileName);
            string[] fileLines = fileText.Split('\r');
            if (fileLines.Length > 0)
                for (int i = 0; i < fileLines.Length; i++)
                {
                    string line = fileLines[i].Trim();
                    if (!string.IsNullOrEmpty(line))
                    {
                        int equalsLocation = line.IndexOf('=');
                        if (equalsLocation > 0)
                        {
                            string key = line.Substring(0, equalsLocation).Trim();
                            string value = line.Substring(equalsLocation + 1, line.Length - equalsLocation - 1);

                            results.Add(key, value);
                        }
                    }
                }

            return results;
        }
    }