12
Сен
У многих начинающих бывают проблемы с тем как сохранить данные игры. ini – файлы одно из решений.
Ini.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | using System.Collections.Generic; using System.IO; using System.Text; using UnityEngine; public class Ini { /// /// Функция сохраняет данные в ini файл /// /// имя файла в директории Data приложения (в редакторе используется папка Assets) /// данные в виде словаря public static void Save(string fileName, Dictionary data) { // используем построитель строк для получения полного текста файла StringBuilder sb = new StringBuilder(); // для каждой пары ключ-значение добавляем строку foreach (KeyValuePair keyValuePair in data) { sb.AppendLine(keyValuePair.Key + "=" + keyValuePair.Value); } // получаем полный путь string path = GetFullPath(fileName); // сохраняем File.WriteAllText(path, sb.ToString()); } /// /// Функция читает данные из ini файла /// /// имя файла в директории Data приложения (в редакторе используется папка Assets) /// public static Dictionary Load(string fileName) { // создаем словарь Dictionary data = new Dictionary(); // получаем полный путь к файлу 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; } /// /// Функция получаения полного пути в папке Data приложения (Assets в режиме редактора) /// /// Относительный путь к файлу /// Полный путь 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 файлы содержат разделы, и конечно этого я не предусмотрел, но можно вполне пользоваться.
Пример использования:
1 2 3 4 5 6 7 8 9 10 11 12 | Dictionary dataToSave = new Dictionary(); dataToSave.Add("test", "testValue"); dataToSave.Add("int", 123.ToString()); dataToSave.Add("float", 123.5f.ToString()); Ini.Save("data.ini", dataToSave); Dictionary loadedData = Ini.Load("data.ini"); foreach (KeyValuePair keyValuePair in loadedData) { Debug.Log(keyValuePair.Key + "=" + keyValuePair.Value); } |
почему-то подсветка синтаксиса съела объявление словаря правильно. Делается это так Dictionary< string, string >
Всем удачи
3 комментария на «Чтение/запись ini файлов»
Ваш отзыв
Вы должны войти, чтобы оставлять комментарии.
16 Дек 2010 в 19:08
Возникли два вопроса по этому коду, возможно из-за недостатка знаний.
1. У меня почему-то выдает эту ошибку:
Assets/GalaxyData/Scripts/FilesIO/Read_and_write_value_in_string.cs(15,51): error CS0246: The type or namespace name `Dictionary’ could not be found. Are you missing a using directive or an assembly reference?
2. Если вставляю это объявление словаря, получаю “parsing error”
Что делать?
17 Дек 2010 в 3:34
Лучше на форуме спросить. Там точно быстрее ответят.
23 Дек 2013 в 16:05
lewisohn@dora.progandist” rel=”nofollow”>.…
спс….