Показать сообщение отдельно
Старый 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 fileNameDictionary<stringstringdata)
    {
        
// используем построитель строк для получения полного текста файла
        
StringBuilder sb = new StringBuilder();

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

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

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

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

        
// получаем полный путь к файлу
        
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(0pos).Trim();
                
string value "";
                if ((
pos 1) < dataString.Length)
                {
                    
value dataString.Substring(pos 1dataString.Length pos 1).Trim();
                }
                
// сохраняем данные в коллекцию
                
data.Add(keyvalue);
            }

        }
        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,stringdataToSave = new Dictionary<stringstring>();
dataToSave.Add("test""testValue");
dataToSave.Add("int"123.ToString());
dataToSave.Add("float"123.5f.ToString());
Ini.Save("data.ini"dataToSave);

Dictionary<stringstringloadedData Ini.Load("data.ini");

foreach (
KeyValuePair<stringstringkeyValuePair 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)