Статьи:Простое чтение и сохранение ini-файлов

Материал из Blitz3D to Unity3D Wiki Project
Перейти к: навигация, поиск

Этот пример я написал по просьбам трудящихся ;)

Ini.cs

using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;

public class Ini
{
    /// <summary>
    /// Функция сохраняет данные в ini файл
    /// </summary>
    /// <param name="fileName">имя файла в директории Data приложения (в редакторе используется папка Assets)</param>
    /// <param name="data">данные в виде словаря</param>
    public static void Save(string fileName, Dictionary<string, string> data)
    {
        // используем построитель строк для получения полного текста файла
        StringBuilder sb = new StringBuilder();

        // для каждой пары ключ-значение добавляем строку
        foreach (KeyValuePair<string, string> keyValuePair in data)
        {
            sb.AppendLine(keyValuePair.Key + "=" + keyValuePair.Value);
        }

        // получаем полный путь
        string path = GetFullPath(fileName);

        // сохраняем
        File.WriteAllText(path, sb.ToString());
    }

    /// <summary>
    /// Функция читает данные из ini файла
    /// </summary>
    /// <param name="fileName">имя файла в директории Data приложения (в редакторе используется папка Assets)</param>
    /// <returns></returns>
    public static Dictionary<string, string> Load(string fileName)
    {
        // создаем словарь
        Dictionary<string, string> data = new Dictionary<string, string>();

        // получаем полный путь к файлу
        string path = GetFullPath(fileName);

        // читаем файл в массив строк
        string[] lines = File.ReadAllLines(path);

        // выполняем получение данных из кадой строки
        foreach (string line in lines)
        {
            string dataString = line.Trim();

            // пустые строки пропускаем
            if (string.IsNullOrEmpty(dataString)) continue;

            // пропускаем комментарии
            if (dataString.StartsWith(";")) continue;

            // так же пропускаем строки, не содержащие равно
            if (dataString.Contains("="))
            {
                // находим позицию первого равно
                int pos = dataString.IndexOf("=");

                // получаем данные
                string key = dataString.Substring(0, pos).Trim();
                string value = "";
                if ((pos + 1) < dataString.Length)
                {
                    value = dataString.Substring(pos + 1, dataString.Length - pos - 1).Trim();
                }
                // сохраняем данные в коллекцию
                data.Add(key, value);
            }

        }
        return data;
    }

    /// <summary>
    /// Функция получаения полного пути в папке Data приложения (Assets в режиме редактора)
    /// </summary>
    /// <param name="localPath">Относительный путь к файлу</param>
    /// <returns>Полный путь</returns>
    public static string GetFullPath(string localPath)
    {
        string basePath = Application.dataPath.Trim();
        if (!(basePath.EndsWith("/") || basePath.EndsWith("\\")))
        {
            basePath += "/";
        }

        localPath = localPath.Trim();
        if (localPath.StartsWith("/") || localPath.StartsWith("\\"))
        {
            localPath = localPath.Substring(1);
        }

        return basePath + localPath;
    }
}

Конечно настоящие ini файлы содержат разделы, и конечно этого я не предусмотрел, но можно вполне пользоваться.

Пример использования:

Dictionary<string,string> dataToSave = new Dictionary<string, string>();
dataToSave.Add("test", "testValue");
dataToSave.Add("int", 123.ToString());
dataToSave.Add("float", 123.5f.ToString());
Ini.Save("data.ini", dataToSave);

Dictionary<string, string> loadedData = Ini.Load("data.ini");

foreach (KeyValuePair<string, string> keyValuePair in loadedData)
{
     Debug.Log(keyValuePair.Key + "=" + keyValuePair.Value);
}

Всем удачи :)