В данном гайде я расскажу вам как можно просто сохранять и загружать настройки вашей программы.
Приступим:
Откроем или созданим новый проект. Накидаем на форму элементы управления, в которых мы будем отображать и редактированить наши настройки.
Я накидал 2 текстбокса и 2 лейбла и 2 кнопки
[Ссылки могут видеть только зарегистрированные пользователи. ]
Теперь переходим к коду.
Создадим класс, который будет отображать структуру наших настроек.
Код:
public class Settings
{
// Свойство Email
public String Email { get; set; }
// Свойство Password
public String Password { get; set; }
// Конструктор класса
public Settings(string email, string password)
{
this.Email = email; this.Password = password;
}
}
Теперь создадим класс, который будет производить чтение/записать настроек из файла
Подключим вначале неймспейс, открывающий нам возможности по работе с файлами
Код:
using System.IO;
Теперь опишем наш класс
Код:
public class SettingsManager
{
// Путь к файлу, в котором будут наши настройки
private string fileName = "settings.conf";
// Конструктор
public SettingsManager() { }
// Метод сохранения настроек в файл
public void Save(Settings settings)
{
try
{
// Создаем объект класса, который будет производить запись в файл
using (StreamWriter sw = new StreamWriter(File.Open(fileName, FileMode.Create)))
{
// Записываем строку (наш емейл)
sw.WriteLine(settings.Email);
// Записываем строку (наш пароль)
sw.WriteLine(settings.Password);
// Закрываем писатель
sw.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
// Метод загрузки настроек из файла
public Settings Load()
{
try
{
// Проверка на существование файла
if (File.Exists(fileName))
{
// Создадим объект класса пустой, который мы потом заполним данными при загрузке
Settings rtnSetting = new Settings("", "");
// Создаем объект класса, который будет читать наш файл настроек
using (StreamReader sr = new StreamReader(File.Open(fileName, FileMode.Open)))
{
// Читаем 1ую строку, а именно емейл
rtnSetting.Email = Crypt(sr.ReadLine());
// Читаем 2ую строку, а именно пароль
rtnSetting.Password = Crypt(sr.ReadLine());
// Закрываем читатель
sr.Close();
}
// Возваращаем объект класса настроек после удачного прочтения
return rtnSetting;
}
// Возвращаем ничего, если файла не существует
return null;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Information);
// Возвращаем ничего, если произошла ошибка
return null;
}
}
}
Теперь начнем использовать наши 2 самописных класса для наших нужд.
2 раза кликнем по нашим кнопках "Сохранить" и "Загрузить", чтобы создать методы, которые будут вызываться при нажатии на кнопки.
Создадим объект класса SettingsManager в теле нашего основного класса
Код:
private SettingsManager manager;
При инициализации нашего главного класса, в моем случаи эта форма, проинициализируем наш объект класса SettingsManager
Код:
manager = new SettingsManager();
Теперь напишем код, выполняемый при нажатии на кнопку "Сохранить".
Код:
// Вызываем метод сохранения передавая новый объект класса настроек
// с нашими данными из текстовых полей
// tEmail - мой текстбокс, хранящий email
// tPassword - мой текстбокс, хранящий пароль
manager.Save(new Settings(tEmail.Text, tPassword.Text));
Теперь напишем код, выполняемый при нажатии на кнопку "Загрузить".
Код:
// Создаем объект класса Settings
// и загружаем в него данные из файла
Settings settings = manager.Load();
// Если данные загрузились,
// то заполняем текстбоксы
if (settings != null)
{
tEmail.Text = settings.Email;
tPassword.Text = settings.Password;
}
Все, теперь собираем наш проект, тестируем, радуемся
Хотя у нас и получился отличный работоспособный код, но пароль хранить в не защифрованном виде не безопастно.
Напишем простейший метод, который будет шифровать наши данные.
Код:
// Метод шифрующий входящую строку
private string Crypt(string text)
{
// Создаем строку, которую будет возвращать
string rtnStr = string.Empty;
// В цикле перебираем каждый символ входящей строки
foreach (char c in text)
{
// Добавляем в возвращаемую строку наш переработанный символ
// (int)c - переводи символ в его код
// ((int) c ^ 52) - применение XOR к номеру символа
// (char)((int) c ^ 52) - получаем символ из измененного номера
// Число, которым мы XORим можете поставить любое. Эксперементируйте.
rtnStr += (char)((int)c ^ 52);
}
return rtnStr;
}
Вставим этот метод в тело класса SettingsManager и добавить шифрование при записи и дешифрование при чтении.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace SaveSettingsInFile
{
public partial class Main : Form
{
public class Settings
{
// Свойство Email
public String Email { get; set; }
// Свойство Password
public String Password { get; set; }
// Конструктор класса
public Settings(string email, string password)
{
this.Email = email; this.Password = password;
}
}
public class SettingsManager
{
// Путь к файлу, в котором будут наши настройки
private string fileName = "settings.conf";
// Конструктор
public SettingsManager() { }
// Метод сохранения настроек в файл
public void Save(Settings settings)
{
try
{
// Создаем объект класса, который будет производить запись в файл
using (StreamWriter sw = new StreamWriter(File.Open(fileName, FileMode.Create)))
{
// Записываем строку (наш емейл)
sw.WriteLine(Crypt(settings.Email));
// Записываем строку (наш пароль)
sw.WriteLine(Crypt(settings.Password));
// Закрываем писатель
sw.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
// Метод загрузки настроек из файла
public Settings Load()
{
try
{
// Проверка на существование файла
if (File.Exists(fileName))
{
// Создадим объект класса пустой, который мы потом заполним данными при загрузке
Settings rtnSetting = new Settings("", "");
// Создаем объект класса, который будет читать наш файл настроек
using (StreamReader sr = new StreamReader(File.Open(fileName, FileMode.Open)))
{
// Читаем 1ую строку, а именно емейл
rtnSetting.Email = Crypt(sr.ReadLine());
// Читаем 2ую строку, а именно пароль
rtnSetting.Password = Crypt(sr.ReadLine());
// Закрываем читатель
sr.Close();
}
// Возваращаем объект класса настроек после удачного прочтения
return rtnSetting;
}
// Возвращаем пустой, если файла не существует
return null;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Information);
// Возвращаем, если произошла ошибка
return null;
}
}
// Метод шифрующий входящую строку
private string Crypt(string text)
{
// Создаем строку, которую будет возвращать
string rtnStr = string.Empty;
// В цикле перебираем каждый символ входящей строки
foreach (char c in text)
{
// Добавляем в возвращаемую строку наш переработанный символ
// (int)c - переводи символ в его код
// ((int) c ^ 52) - применение XOR к номеру символа
// (char)((int) c ^ 52) - получаем символ из измененного номера
// Число, которым мы XORим можете поставить любое. Эксперементируйте.
rtnStr += (char)((int)c ^ 52);
}
return rtnStr;
}
}
private SettingsManager manager;
public Main()
{
InitializeComponent();
manager = new SettingsManager();
}
private void bLoad_Click(object sender, EventArgs e)
{
// Создаем объект класса Settings
// и загружаем в него данные из файла
Settings settings = manager.Load();
// Если данные загрузились,
// то заполняем текстбоксы
if (settings != null)
{
tEmail.Text = settings.Email;
tPassword.Text = settings.Password;
}
}
private void bSave_Click(object sender, EventArgs e)
{
// Вызываем метод сохранения передавая новый объект класса настроек
// с нашими данными из текстовых полей
// tEmail - мой текстбокс, хранящий email
// tPassword - мой текстбокс, хранящий пароль
manager.Save(new Settings(tEmail.Text, tPassword.Text));
}
}
}
________________ Fireball - Быстрое снятие и загрузка скриншотов на хостинг.
Последний раз редактировалось Kitsune; 06.07.2010 в 22:18.
Класс System.IO.File предоставляет ряд статических методов, которые могут облегчить выполнение одноразовых операций над файлами, например, создание, запись, чтение и т.д.
Цитата:
using (StreamWriter sw = new StreamWriter(File.Open(fileName, FileMode.Create)))
{
// Записываем строку (наш емейл)
sw.WriteLine(Crypt(settings.Email));
// Записываем строку (наш пароль)
sw.WriteLine(Crypt(settings.Password));
// Закрываем писатель
sw.Close();
}
Описанный способ не удобен в том случае, если предполагается, что пользователь программы будет сам изменять файл настроек вручную (текстовым редактором).
В этом случае лучше сохранять параметры со своими ключами.
К примеру, чтобы файл настроек выглядил так:
Цитата:
[Settings]
Email=[Ссылки могут видеть только зарегистрированные пользователи. ]
Password=qwerty
Здесь данные находятся в секции Settings, у каждой записи свой ключ. E-mail адрес записан с ключом Email, а пароль с ключом Password. Пользователь легко может догадаться, для чего каждая строчка.
Если хочется готового решение, то можно использовать Win32API. Конкретно, тут подойдут функции WritePrivateProfileString, GetPrivateProfileString. Прочитать о них можно здесь: [Ссылки могут видеть только зарегистрированные пользователи. ]
В C# понадобится использовать DllImport.
Код:
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section,
string key,string val,string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section,
string key,string def, StringBuilder retVal,
int size,string filePath);
Гляньте на [Ссылки могут видеть только зарегистрированные пользователи. ], чтобы не писать это всё вручную.
Также вы можете самостоятельно открывать файл настрок и обрабатывать строки. Понадобится читать каждую строчку до знака "=". Сравнивать прочитанное с нужным параметром, а потом уже читать\записывать значение.
Leo_ня, данный гайд лишь показывает правильную стуктуру кода и логику сохранения/загрузки простых конфигов.
Данный материал ориентирован в основном для фейков, а значит, пользователю, которому вручат фейк не нужно видеть наши настройки к тому же в удобном виде
Файл с натройками можно например назвать kernel.dll и не важно, что содержание его будет совсем не как у библиотеки, но большинство пользователей не додумается, что это наш файл с настройками.
________________ Fireball - Быстрое снятие и загрузка скриншотов на хостинг.
TBX1n, с какой целью вы делаете такие замудренные гайды? Весь ваш код в 3-4 раза превысил мой код на шарпе, только у меня кроме импорта из файл - используется симметричное шифрование (как вы сказали выше "для фейков" это бесценно)
TBX1n, с какой целью вы делаете такие замудренные гайды? Весь ваш код в 3-4 раза превысил мой код на шарпе, только у меня кроме импорта из файл - используется симметричное шифрование (как вы сказали выше "для фейков" это бесценно)
Покажи мне свой код на СиШарпе
________________
We are Ducks. We are birds. We like bread. We cryack. Cryack.
Я конечно понимаю что сейчас каждый мнит себя мега прогером научившись писать на управляемом языке. Но если уж лезите в это то хотя бы следуйте рекомендациям разработчиков этого самого языка. А именно для хранения настроек рекомендуется использовать класс Settings наследуемый от класса ApplicationSettingsBase тоесть грубо говоря в VS на вкладочке Settings в настройке проекта забить список необходимых переменных и обращатся к ним типа Settings.Default.<variable>.
В данном варианте объекты имеют зоны видемости уровня приложения либо пользователя.
А главное для шифрования сам же мелкософт рекомендует использовать класс RijndaelManaged который во первых полностью реализован на управляемом коде, а во вторых отвечает стандартам стойкости алгоритмов. Не надо выдумывать велосипед там где уже давно идут поездаю
Я конечно понимаю что сейчас каждый мнит себя мега прогером научившись писать на управляемом языке. Но если уж лезите в это то хотя бы следуйте рекомендациям разработчиков этого самого языка. А именно для хранения настроек рекомендуется использовать класс Settings наследуемый от класса ApplicationSettingsBase тоесть грубо говоря в VS на вкладочке Settings в настройке проекта забить список необходимых переменных и обращатся к ним типа Settings.Default.<variable>.
В данном варианте объекты имеют зоны видемости уровня приложения либо пользователя.
А главное для шифрования сам же мелкософт рекомендует использовать класс RijndaelManaged который во первых полностью реализован на управляемом коде, а во вторых отвечает стандартам стойкости алгоритмов. Не надо выдумывать велосипед там где уже давно идут поездаю
Я с тобой согласен, чтобы сохранить, а затем загрузить настройки нужно всего 4 строки кода! На формлоад и закрытие формы(для 2 полей-логин/пароль, id/auth)
Переименуй элементы или измени код на свои имена...
tEmail = textBox1
tPassword = textBox1
Для Crypt'а видимо забыл указать:
Цитата:
private string Crypt(string text)
{
// Создаем строку, которую будет возвращать
string rtnStr = string.Empty;
// В цикле перебираем каждый символ входящей строки
foreach (char c in text)
{
// Добавляем в возвращаемую строку наш переработанный символ
// (int)c - переводи символ в его код
// ((int) c ^ 52) - применение XOR к номеру символа
// (char)((int) c ^ 52) - получаем символ из измененного номера
// Число, которым мы XORим можете поставить любое. Эксперементируйте.
rtnStr += (char)((int)c ^ 52);
}
return rtnStr;
}
________________
-Отложи на послезавтра то что можешь сделать сегодня, и тогда у тебя появятся два свободных дня!