Как поменять в программе путь хранения настроек - C#
Формулировка задачи:
Есть программа с открытым исходным кодом (LazyCure). Мне не нравится, что она сохраняет настройки в
Но что для меня странно и непонятно, при нажатии кнопки Step Into оно не заходит в этот метод, а пробегается по нему, как по одной команде, из-за чего не могу отловить, что именно происходит в этом методе. Класс
А интерфейс
В нем я вижу объявление этого самого метода, но саму реализацию этого метода я не нашел, хотя изрыл поиском код вдоль и поперек
Я больше не знаю, как найти этот самый метод и для меня его содержимое остается загадкой. Помогите пожалуйста! Наверное я чего-то недопонимаю или жестко туплю....
Код этого проекта открыт и доступен здесь: http://lazycure.svn.sourceforge.net/viewvc/lazycure/tags/4.0/
Local Settings\Application Data
, так как пользуюсь несколькими ОСями и каждую могу раз в неделю с бекапа восстанавливать. Из-за этого приходится каждый раз заливать user.config на диск C после каждой смены системы (я часто используемые программы храню не на системном диске). Хочу сделать, чтобы программа сохраняла настройки в свою родную папку, как она это делает с другими своими файлами, но никак не получается разобраться в коде программы, прошу помощи Пробовал пошагово выполнять программу и отследил, что она их сохраняет при выполнении методаsettings.Save();
Листинг программы
- private void ok_Click(object sender, EventArgs e)
- {
- TimeSpan parsedReminderTime;
- if (TimeSpan.TryParse(reminderTime.Text, out parsedReminderTime))
- {
- CultureInfo previousUICulture = Thread.CurrentThread.CurrentUICulture;
- UpdateSettings(parsedReminderTime);
- CultureInfo currentUICulture = Thread.CurrentThread.CurrentUICulture;
- settings.Save();
- Dialogs.LazyCureDriver.ApplySettings(settings);
- Dialogs.MainForm.PostToTwitterEnabled = enableTwitterCheckbox.Checked;
- Dialogs.MainForm.RegisterHotKeys();
- Hide();
- if (!previousUICulture.Equals(currentUICulture))
- NotifyAboutLanguageApplyAfterRestart();
- }
- else
- MessageBox.Show(String.Format(Constants.InvalidReminderTime, reminderTime.Text), Constants.IncorrectSettings);
- }
settings
в программе объявлен так:
Листинг программы
- private ISettings settings;
ISettings
объявлен так:
Листинг программы
- public interface ISettings: ILanguageSettingsProvider
- {
- int ActivitiesNumberInTray { get; set; }
- string HotKeyToActivate { get; set; }
- string HotKeyToSwitch { get; set; }
- bool LeftClickOnTray { get; set; }
- Point MainWindowLocation { get; set; }
- int MaxActivitiesInHistory { get; set; }
- TimeSpan ReminderTime { get; set; }
- void Save();
- bool SaveAfterDone { get; set; }
- bool SplitByComma { get; set; }
- bool SwitchOnLogOff { get; set; }
- bool SwitchTimeLogAtMidnight { get; set; }
- string TimeLogsFolder { get; set; }
- string TweetingActivity { get; set; }
- string TwitterAccessToken { get; set; }
- string TwitterAccessTokenSecret { get; set; }
- bool TwitterEnabled { get; set; }
- bool UseTweetingActivity { get; set; }
- }
Решение задачи: «Как поменять в программе путь хранения настроек»
textual
Листинг программы
- using System;
- using System.Collections;
- using System.Collections.Specialized;
- using System.Configuration;
- using System.IO;
- using System.Windows.Forms;
- using System.Xml;
- namespace LifeIdea.LazyCure
- {
- /// <summary>
- /// PortableSettingsProvider class ensures that application settings can be saved to the application folder itself
- /// instead of the user profile. Used in the configuration of Application Settings.
- /// Code of Portable Settings Provider from
- /// [url]http://www.codeproject.com/KB/vb/CustomSettingsProvider.aspx[/url] (C# version by gpgemini)
- /// </summary>
- public class PortableSettingsProvider : SettingsProvider
- {
- private const string SETTINGSROOT = "Settings";
- //XML Root Node
- public override void Initialize(string name, NameValueCollection col)
- {
- base.Initialize(this.ApplicationName, col);
- }
- public override string ApplicationName
- {
- get
- {
- if (Application.ProductName.Trim().Length > 0)
- {
- return Application.ProductName;
- }
- else
- {
- FileInfo fi = new FileInfo(Application.ExecutablePath);
- return fi.Name.Substring(0, fi.Name.Length - fi.Extension.Length);
- }
- }
- set { }
- //Do nothing
- }
- public override string Name
- {
- get { return "PortableSettingsProvider"; }
- }
- public virtual string GetAppSettingsPath()
- {
- //Used to determine where to store the settings
- System.IO.FileInfo fi = new System.IO.FileInfo(Application.ExecutablePath);
- return fi.DirectoryName;
- }
- public virtual string GetAppSettingsFilename()
- {
- //Used to determine the filename to store the settings
- return ApplicationName + ".settings";
- }
- public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection propvals)
- {
- //Iterate through the settings to be stored
- //Only dirty settings are included in propvals, and only ones relevant to this provider
- foreach (SettingsPropertyValue propval in propvals)
- {
- SetValue(propval);
- }
- try
- {
- SettingsXML.Save(Path.Combine(GetAppSettingsPath(), GetAppSettingsFilename()));
- }
- catch (Exception)
- {
- }
- //Ignore if cant save, device been ejected
- }
- public override SettingsPropertyValueCollection GetPropertyValues(SettingsContext context,
- SettingsPropertyCollection props)
- {
- //Create new collection of values
- SettingsPropertyValueCollection values = new SettingsPropertyValueCollection();
- //Iterate through the settings to be retrieved
- foreach (SettingsProperty setting in props)
- {
- SettingsPropertyValue value = new SettingsPropertyValue(setting);
- value.IsDirty = false;
- value.SerializedValue = GetValue(setting);
- values.Add(value);
- }
- return values;
- }
- private XmlDocument _settingsXML = null;
- private XmlDocument SettingsXML
- {
- get
- {
- //If we dont hold an xml document, try opening one.
- //If it doesnt exist then create a new one ready.
- if (_settingsXML == null)
- {
- _settingsXML = new XmlDocument();
- try
- {
- _settingsXML.Load(Path.Combine(GetAppSettingsPath(), GetAppSettingsFilename()));
- }
- catch (Exception)
- {
- //Create new document
- XmlDeclaration dec = _settingsXML.CreateXmlDeclaration("1.0", "utf-8", string.Empty);
- _settingsXML.AppendChild(dec);
- XmlNode nodeRoot = default(XmlNode);
- nodeRoot = _settingsXML.CreateNode(XmlNodeType.Element, SETTINGSROOT, "");
- _settingsXML.AppendChild(nodeRoot);
- }
- }
- return _settingsXML;
- }
- }
- private string GetValue(SettingsProperty setting)
- {
- string ret = "";
- try
- {
- if (IsRoaming(setting))
- {
- ret = SettingsXML.SelectSingleNode(SETTINGSROOT + "/" + setting.Name).InnerText;
- }
- else
- {
- ret =
- SettingsXML.SelectSingleNode(SETTINGSROOT + "/" + Environment.MachineName + "/" + setting.Name).
- InnerText;
- }
- }
- catch (Exception)
- {
- if ((setting.DefaultValue != null))
- {
- ret = setting.DefaultValue.ToString();
- }
- else
- {
- ret = "";
- }
- }
- return ret;
- }
- private void SetValue(SettingsPropertyValue propVal)
- {
- XmlElement MachineNode = default(XmlElement);
- XmlElement SettingNode = default(XmlElement);
- //Determine if the setting is roaming.
- //If roaming then the value is stored as an element under the root
- //Otherwise it is stored under a machine name node
- try
- {
- if (IsRoaming(propVal.Property))
- {
- SettingNode = (XmlElement)SettingsXML.SelectSingleNode(SETTINGSROOT + "/" + propVal.Name);
- }
- else
- {
- SettingNode =
- (XmlElement)
- SettingsXML.SelectSingleNode(SETTINGSROOT + "/" + Environment.MachineName + "/" + propVal.Name);
- }
- }
- catch (Exception)
- {
- SettingNode = null;
- }
- //Check to see if the node exists, if so then set its new value
- if ((SettingNode != null))
- {
- SettingNode.InnerText = Convert.ToString(propVal.SerializedValue);
- }
- else
- {
- if (IsRoaming(propVal.Property))
- {
- //Store the value as an element of the Settings Root Node
- SettingNode = SettingsXML.CreateElement(propVal.Name);
- SettingNode.InnerText = propVal.SerializedValue.ToString();
- SettingsXML.SelectSingleNode(SETTINGSROOT).AppendChild(SettingNode);
- }
- else
- {
- //Its machine specific, store as an element of the machine name node,
- //creating a new machine name node if one doesnt exist.
- try
- {
- MachineNode =
- (XmlElement)SettingsXML.SelectSingleNode(SETTINGSROOT + "/" + Environment.MachineName);
- }
- catch (Exception)
- {
- MachineNode = SettingsXML.CreateElement(Environment.MachineName);
- SettingsXML.SelectSingleNode(SETTINGSROOT).AppendChild(MachineNode);
- }
- if (MachineNode == null)
- {
- MachineNode = SettingsXML.CreateElement(Environment.MachineName);
- SettingsXML.SelectSingleNode(SETTINGSROOT).AppendChild(MachineNode);
- }
- SettingNode = SettingsXML.CreateElement(propVal.Name);
- SettingNode.InnerText = Convert.ToString(propVal.SerializedValue);
- MachineNode.AppendChild(SettingNode);
- }
- }
- }
- private bool IsRoaming(SettingsProperty prop)
- {
- //Determine if the setting is marked as Roaming
- foreach (DictionaryEntry d in prop.Attributes)
- {
- Attribute a = (Attribute)d.Value;
- if (a is System.Configuration.SettingsManageabilityAttribute)
- {
- return true;
- }
- }
- return false;
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д