Друзья,раньше в своих прогарммах на Deplhi или VB я использовал для хранения настроек INI файлы,в С# насколько я знаю в качестве такого лучше использовать XML файл.
Pls,привидите пример работы с работы с настройками в XML файле на C#?
Здравствуйте, Аноним, Вы писали:
А>Друзья,раньше в своих прогарммах на Deplhi или VB я использовал для хранения настроек INI файлы,в С# насколько я знаю в качестве такого лучше использовать XML файл.
А>Pls,привидите пример работы с работы с настройками в XML файле на C#?
Очень просто. Пусть ваше приложение называется программа.exe. Создаете рядом файл с названием программа.exe.config, саписываете туде следующий кусочек xml-я
<configuration>
<appSettings>
<add key="Мой ключ" value="Мое значение"/>
</appSettings>
</configuration>
и в приложении получаете значение параметра через
ConfigurationSettings.AppSettings["Мой ключ"]
А вообще все это и многое другое можно найти здесь:
ms-help://MS.MSDNVS/cpguide/html/cpconconfiguringnetframeworkapplications.htm
Здравствуйте <Аноним>, Вы писали:
А>Pls,привидите пример работы с работы с настройками в XML файле на C#?
Примерчик тебе? Ща приведу.
Это из Януса, конфиг евойный.
using System;
using System.IO;
using System.Xml.Serialization;
using System.Drawing;
using System.ComponentModel;
using System.Collections;
namespace RSDN.Janus
{
/// <summary>
/// Кофигурация
/// </summary>
public struct FormBounds
{
public int X;
public int Y;
public int Width;
public int Height;
public FormBounds(int x,int y,int w,int h)
{
X = x;
Y = y;
Width = w;
Height = h;
}
[XmlIgnore]
public Rectangle Bounds
{
get
{
return new Rectangle(X,Y,Width,Height);
}
set
{
X = value.X;
Y = value.Y;
Width = value.Width;
Height = value.Height;
}
}
}
public enum SizeToolBar
{
Size16,
Size24
}
[Flags]
public enum ChangeAction
{
NoAction = 0,
Refresh = 1,
Restart = 2
}
[AttributeUsage(AttributeTargets.Property)]
public class ChangePropertyAttribute : System.Attribute
{
private ChangeAction _action;
public ChangePropertyAttribute( ChangeAction action)
{
_action = action;
}
public virtual ChangeAction Action
{
get { return _action; }
}
}
public class Config
{
private static object lockFlag = new object();
private static Config instance;
[XmlIgnore]
public static Config Instance
{
get
{
lock(lockFlag)
{
if(instance == null)
{
try
{
using(FileStream fs = new FileStream(LocalUser.GetDatabasePath()+"\\config.xml",FileMode.Open))
{
System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(Config));
instance = (Config)xs.Deserialize(fs);
}
}
catch(Exception e)
{
System.Windows.Forms.MessageBox.Show(e.Message);
instance = new Config();
}
}
}
return instance;
}
}
private SizeToolBar imgToolBar = SizeToolBar.Size24;
[DisplayName("Размер иконок"),
Description("Размер иконок на тулбаре. (Требует перезапуска приложения)"),
Category("Общие"),
ChangeProperty( ChangeAction.Restart)]
public SizeToolBar SizeImageToolBar
{
get{return imgToolBar;}
set{imgToolBar = value;}
}
private bool showFullForumNames = true;
[DisplayName("Полные имена форумов"),
Description("Показывать полные наименования форумов"),
Category("Форумы"),
ChangeProperty( ChangeAction.Refresh)]
public bool ShowFullForumNames
{
get{return showFullForumNames;}
set{showFullForumNames = value;}
}
private int markMessageReadInterval = 2000;
[DisplayName("Интервал установки сообщения прочитанным"),
Description("Интервал в миллисекундах, после которого открытое сообщение помечается как прочитанное"),
Category("Форумы")]
public int MarkMessageReadInterval
{
get{return markMessageReadInterval;}
set{markMessageReadInterval = value;}
}
public bool ShowMessagesFlat = false;
public string Login = "";
public string EncodedPassword = "";
public FormBounds MainFormBounds = new FormBounds(0,0,800,600);
public FormBounds WriteMessageFormBounds = new FormBounds(0,0,640,480);
public int ForumSplitterPosition = 200;
private string tagLine = "... << @@appname @@version @@subversion >>";
[DisplayName("Строка подписи клиента"),
Description(@"Строка, которую клиент будет добавлять в конец каждого прочитанного сообщения для указания
способа которым было написано это сообщение. Доступны следующие макросы:\n
@@appname - имя клиента;\n
@@version - версия клиента;\n
@@subversion - подверсия клиента;\n
@@build - билд клиента;\n
@@copyright - строка копирайта;\n
@@nick - ваш ник;\n
@@osname - название ОС;\n
@@osversion = версия ОС;"),
Category("Форумы")]
public string TagLine
{
get{return tagLine;}
set{tagLine = value;}
}
private bool msgListGridLines = true;
[DisplayName("Линии сетки в гриде"),
Description("Видимость линий сетки в дереве сообщений сообщений"),
Category("Форумы"),
ChangeProperty( ChangeAction.Refresh)]
public bool MsgListGridLines
{
get{return msgListGridLines;}
set{msgListGridLines = value;}
}
public int[] ForumColumnOrder = new int[]{0,1,2,3,4};
public int[] ForumColumnWidth = new int[]{320,100,50,35,80};
public ForumFormState ForumFormState = ForumFormState.Normal;
private bool downloadUsers = true;
[DisplayName("Локальная база пользователей"),
Description("Создавать локальную копию базы пользователей (увеличивает трафик)"),
Category("Пользователи rsdn.ru")]
public bool DownloadUsers
{
get{return downloadUsers;}
set{downloadUsers = value;}
}
private int maxUsersPerSession = -1;
[DisplayName("Пользователей в сессии"),
Description("Максимальное количество пользователей, забираемое за один раз"),
Category("Пользователи rsdn.ru")]
public int MaxUsersPerSession
{
get{return maxUsersPerSession;}
set{maxUsersPerSession = value;}
}
[XmlIgnore]
public Hashtable lastReadMessage = new Hashtable();
//Для сериализации
public struct PositionEntry
{
public int forumId;
public int msgId;
}
[Browsable(false)]
public PositionEntry[] serLastReadMessage
{
get
{
PositionEntry[] pea = new PositionEntry[lastReadMessage.Count];
int i = 0;
foreach(DictionaryEntry de in lastReadMessage)
{
pea[i].forumId = (int)de.Key;
pea[i].msgId = (int)de.Value;
i++;
}
return pea;
}
set
{
lastReadMessage.Clear();
foreach(PositionEntry pe in value)
{
lastReadMessage.Add(pe.forumId,pe.msgId);
}
}
}
private int gridIndent = 5;
[DisplayName("Размер отступа в дереве"),
Description("Отступ ответов в дереве сообщений, пикселей"),
Category("Форумы")]
public int GridIndent
{
get {return gridIndent;}
set {gridIndent = value;}
}
public byte[] dockingLayout = null;
public byte[] customShortcuts = null;
private bool minimizeToTray = true;
[DisplayName("Минимизировать в трей"),
Description("Сворачивать окно в трей"),
Category("Общие")]
public bool MinimizeToTray
{
get {return minimizeToTray;}
set {minimizeToTray = value;}
}
private bool confirmClosing = true;
[DisplayName("Предупреждать при выходе"),
Description("Показывать окно с предупреждением при выходе"),
Category("Общие")]
public bool ConfirmClosing
{
get {return confirmClosing;}
set {confirmClosing = value;}
}
private int httpTimeout = 100000;
[DisplayName("Таймаут соединения"),
Description("Время ожидания отклика от сервера, миллисекунд"),
Category("Синхронизация")]
public int HttpTimeout
{
get {return httpTimeout;}
set {httpTimeout = value;}
}
private int retriesCount = 3;
[DisplayName("Количество попыток соединения"),
Description("Количество попыток, которые будут предприниматься для связи с сервером при проблемах с соединением"),
Category("Синхронизация")]
public int RetriesCount
{
get {return retriesCount;}
set {retriesCount = value;}
}
private bool showSplash = true;
[DisplayName("Показывать заставку"),
Description("Показывать заставку при старте приложения"),
Category("Общие")]
public bool ShowSplash
{
get {return showSplash;}
set {showSplash = value;}
}
public int outboxSplitterPosition = 200;
private bool autoSync = false;
[DisplayName("Автосинхронизация"),
Description("Автоматически запускать синхронизацию через указанный промежуток времени"),
Category("Синхронизация"),
ChangeProperty( ChangeAction.Refresh)]
public bool AutoSync
{
get {return autoSync;}
set {autoSync = value;}
}
private int autoSyncInterval = 300;
[DisplayName("Интервал автосинхронизации"),
Description("Интервал, по прошествии которого будут производиться попытки автосинхронизации, секунд"),
Category("Синхронизация"),
ChangeProperty( ChangeAction.Refresh)]
public int AutoSyncInterval
{
get {return autoSyncInterval;}
set {autoSyncInterval = value;}
}
public Config()
{
}
public void Save()
{
using(FileStream fs = new FileStream(LocalUser.GetDatabasePath()+"\\config.xml",FileMode.Create))
{
System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(Config));
xs.Serialize(fs,instance);
}
}
public static void Reload()
{
instance = null;
}
public static Config GetClone()
{
return (Config)instance.MemberwiseClone();
}
public static void NewConfig(Config cfg)
{
instance = cfg;
}
}
}
Если будет интересно подробнее (там к примеру есть гуевый редактор этих самых настроек, причем автоматический, атрибуты это для него) то с CVS можешь забрать полные исходники.
... << RSDN@Home 1.0 alpha 12 (developers build)>>