Введение
В интернете приведено очень много способов хранения настроек программы, но все они как-то разбросаны, поэтому я решил их собрать вместе и расписать, как этим пользоваться.
C# и объект Properties.Settings
Информация о Properties.Settings
Организация объекта Properties.Settings — это обычный xml файл, который можно найти в папке пользователя:
С:\ Users \ [user name] \ AppData \ Local \ [ (Project Name) or (AssemblyCompany) ] \ [name project_cashBuild] \ [AssemblyVersion] \ user.config
Для начала нам нужно создать такие переменные для Properties.Settings. Перейдем в Properties -> Settings.settings:
Я создал 3-и переменные и выбрал область их использования: 2- область пользователь и 1- приложение.
Различие между областями просты. Область приложения можно только читать, а пользователь — изменять и читать.
Вернемся к переменным:
- Version — версия нашей программы. Определил ее строкой и областью приложение. Т.к. версия может содержать буквы (например, b — от beta). А область выбрал, чтоб не менялась наша версия приложения (т.к. AssemblyVersion редко кто использует).
- Save_text — это переменная, куда мы будем сохранять наш текст.
- open_sum — сколько раз мы открыли программу.
Теперь перейдем к коду
namespace Habrahabr { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Text += " " + Properties.Settings.Default.Version; //Добавляем в название программы, версию. Properties.Settings.Default.open_sum++; //Добавляем +1 к кол-ву запусков программы. label2.Text = Properties.Settings.Default.open_sum.ToString(); //выводим в Label2 кол-во запусков программы. richTextBox1.Text = Properties.Settings.Default.Save_text; // Загружаем ранее сохраненный текст Properties.Settings.Default.Save(); // Сохраняем переменные. } private void button1_Click(object sender, EventArgs e) { Properties.Settings.Default.Save_text = richTextBox1.Text; // Записываем содержимое richTextBox1 в Save_text Properties.Settings.Default.Save(); // Сохраняем переменные. MessageBox.Show("Текст сохранен", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); // Говорим пользователю, что сохранили текст. } } }
Результаты работы программы
Первый запуск, мы видим, что кол-во запусков равно 1. И теста в richTextBox1 нет.
Теперь напишем и сохраним текст.
При втором запуске мы видим, что текст сохранен, и кол-во запусков уже 2-ва.
Вывод
Очень удобно использовать этот объект, если надо работать в разных областях видимости в одном проекте. Метод хорош, когда вам не надо, чтоб рядовой пользователь рылся в файлах настройки программы.
C# и ini-файлы
С ini-файлами все на оборот, они лежат в папке рядом с программой, что позволяет пользователю изменить настройки вне-программы. Данный способ хорош, если настройки программы заносятся вручную. Например, эмулятор для запуска игры без лицензии (тотже revLoader).
Теперь перейдем к нашей теме. Для работы с таким типом файлов, нам нужно создать класс по работе с ним. Создаем класс, например «IniFile», подключаем пространство имен (библиотеки), которых нет:
using System.IO; using System.Reflection; using System.Runtime.InteropServices; using System.Text;
А теперь разбираем по-порядку:
using System.IO; using System.Reflection; using System.Runtime.InteropServices; using System.Text; namespace IniFiles { class IniFile { string Path; //Имя файла. [DllImport("kernel32")] // Подключаем kernel32.dll и описываем его функцию WritePrivateProfilesString static extern long WritePrivateProfileString(string Section, string Key, string Value, string FilePath); [DllImport("kernel32")] // Еще раз подключаем kernel32.dll, а теперь описываем функцию GetPrivateProfileString static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath); // С помощью конструктора записываем пусть до файла и его имя. public IniFile(string IniPath) { Path = new FileInfo(IniPath).FullName.ToString(); } //Читаем ini-файл и возвращаем значение указного ключа из заданной секции. public string ReadINI(string Section, string Key) { var RetVal = new StringBuilder(255); GetPrivateProfileString(Section, Key, "", RetVal, 255, Path); return RetVal.ToString(); } //Записываем в ini-файл. Запись происходит в выбранную секцию в выбранный ключ. public void Write(string Section, string Key, string Value) { WritePrivateProfileString(Section, Key, Value, Path); } //Удаляем ключ из выбранной секции. public void DeleteKey(string Key, string Section = null) { Write(Section, Key, null); } //Удаляем выбранную секцию public void DeleteSection(string Section = null) { Write(Section, null, null); } //Проверяем, есть ли такой ключ, в этой секции public bool KeyExists(string Key, string Section = null) { return ReadINI(Section, Key).Length > 0; } } }
Теперь переходим в основную программу.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace IniFiles { public partial class Form1 : Form { IniFile INI = new IniFile("config.ini"); public Form1() { InitializeComponent(); auto_read(); } private void auto_read() { if (INI.KeyExistsINI("SettingForm1", "Width")) numericUpDown2.Value = int.Parse(INI.ReadINI("SettingForm1", "Height")); else numericUpDown1.Value = this.MinimumSize.Height; if (INI.KeyExistsINI("SettingForm1", "Height")) numericUpDown1.Value = int.Parse(INI.ReadINI("SettingForm1", "Width")); else numericUpDown2.Value = this.MinimumSize.Width; if (INI.KeyExistsINI("SettingForm1", "Width")) textBox1.Text = INI.ReadINI("Other", "Text"); this.Height = int.Parse(numericUpDown1.Value.ToString()); this.Width = int.Parse(numericUpDown2.Value.ToString()); } private void button1_Click(object sender, EventArgs e) { INI.WriteINI("SettingForm1", "Height", numericUpDown2.Value.ToString()); INI.WriteINI("SettingForm1", "Width", numericUpDown1.Value.ToString()); INI.WriteINI("Other", "Text", textBox1.Text); MessageBox.Show("Настройки SettingForm1 и Other сохранены", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); // Говорим пользователю, что сохранили текст. } private void button2_Click(object sender, EventArgs e) { auto_read(); // Чтоб не повторяться. } private void button3_Click(object sender, EventArgs e) { INI.WriteINI("SettingForm1", "Height", numericUpDown2.Value.ToString()); INI.WriteINI("SettingForm1", "Width", numericUpDown1.Value.ToString()); this.Height = int.Parse(numericUpDown1.Value.ToString()); this.Width = int.Parse(numericUpDown2.Value.ToString()); MessageBox.Show("Настройки SettingForm1 сохранены и применены", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); // Говорим пользователю, что сохранили текст. } } }
Результаты работы программы
При первом запуска, у нас нет файла config.ini. Поэтому при проверке возвращаются fasle и мы приравниваем окно к минимальным параметрам.
Меняем параметры окна и жмем «Применить»
Редактируем файл config.ini руками и жмем загрузить.
На этом все, в следующий раз опишу работу с xml файлами и с бинарными файлами.
ссылка на оригинал статьи http://habrahabr.ru/post/271483/
Добавить комментарий