Показать сообщение отдельно
Старый 12.09.2010, 19:20   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Простое сохранение и чтение ini файлов

Итак по просьбам трудящихся чтение и запись ini файлов.

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);
} 
Всем удачи
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 7 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
FREE MAN (06.08.2012), h1dd3n (13.09.2010), Harter (21.02.2012), Illidan (12.09.2010), Nex (13.09.2010), Nuprahtor (12.09.2010), Shiko1st (10.04.2011)