Хранение настроек приложения в папке проекта, а не в AppData - PullRequest
3 голосов
/ 21 февраля 2012

У меня есть файл Settings.cs в моем проекте, и я получаю к нему доступ из моей программы через

Properties.Settings.Default.MyProperty

Сгенерированный файл настроек хранится в следующем месте

C:\Users\Foo\AppData\Local\MyApp\MyApp.exe_Url_jknwq2raeohczydfp1loj02nf05zldfk\1.0.0.0\user.config

Проблема заключается в том, что это не только зависит от пользователя, но также приводит к тому, что в программе имеется много файлов user.config для каждой подписи (отладка / выпуск и т. Д.), Что вынуждает пользователя-разработчика заполнять все настройки снова каждый раз, когда он запускает «версию» программы, у которой еще нет определенного user.config. (Если я не совсем ясно, я буду рад предоставить более подробную информацию)

Я бы хотел, чтобы в моем приложении были единые файлы настроек для всех пользователей, независимо от «версии» (отладка / выпуск или другое). Таким образом, разработчик должен будет установить настройки один раз, и эти настройки будут эффективны при каждом запуске приложения, без необходимости повторного ввода их для других подписей / пользователей.

Ответы [ 4 ]

1 голос
/ 21 февраля 2012

Вы можете сохранить и прочитать настройки, как и все расширенные программы в Реестре , и вот как это сделать:

public object GetRegistryValue(string KeyName, object DefaultValue)
        {
            object res = null;
            try
            {
                Microsoft.VisualBasic.Devices.Computer c = new Microsoft.VisualBasic.Devices.Computer();
                Microsoft.Win32.RegistryKey k = c.Registry.CurrentUser.OpenSubKey("Software\\YourAppName", true);
                if (k != null)
                {
                    res = k.GetValue(KeyName, DefaultValue);
                }
                else
                {
                    k = c.Registry.CurrentUser.CreateSubKey("Software\\YourAppName");
                }
                if (k != null)
                    k.Close();
                // ex As Exception
            }
            catch
            {
                //PromptMsg(ex)
            }
            return res;
        }

public void SetRegistryValue(string KeyName, object _Value)
        {
            try
            {
                Microsoft.VisualBasic.Devices.Computer c = new Microsoft.VisualBasic.Devices.Computer();

                Microsoft.Win32.RegistryKey k = c.Registry.CurrentUser.OpenSubKey("Software\\YourAppName", true);
                if (k != null)
                {
                    k.SetValue(KeyName, _Value);
                }
                else
                {
                    k = c.Registry.CurrentUser.CreateSubKey("Software\\YourAppName");
                    k.SetValue(KeyName, _Value);
                }
                if (k != null)
                    k.Close();
                // ex As Exception
            }
            catch
            {
                //PromptMsg(ex)
            }
        }

Другой вариант , который у вас есть, этовы создаете сериализуемый класс ( [Serializable ()] attrib), который содержит все ваши настройки в качестве свойств, а затем сохраняете его в каталоге приложения с помощью класса BinaryFormatter.

public void saveBinary(object c, string filepath)
{
    try
    {
        using (System.IO.Stream sr = System.IO.File.Open(filepath, System.IO.FileMode.Create))
        {
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            bf.Serialize(sr, c);
            sr.Close();
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

public object loadBinary(string path)
{
    try
    {
        if (System.IO.File.Exists(path))
        {
            using (System.IO.Stream sr = System.IO.File.Open(path, System.IO.FileMode.Open))
            {
                System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                object c = bf.Deserialize(sr);
                sr.Close();
                return c;
            }
        }
        else
        {
            throw new Exception("File not found");
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    return null;
}
1 голос
/ 21 февраля 2012

Я разработал простое решение с некоторыми недостатками:

public void WriteLocalValue(string localKey, string curValue)
{
    Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
    KeyValueConfigurationElement k = config.AppSettings.Settings[localKey];
    if (k == null)
        config.AppSettings.Settings.Add(localKey, curValue);
    else
        k.Value = curValue;
    config.Save();
}

public string ReadLocalValue(string localKey, string defValue)
{
    string v = defValue;
    try
    {
        Configuration config = ConfigurationManager.OpenExeConfiguration( Application.ExecutablePath);
        KeyValueConfigurationElement k = config.AppSettings.Settings[localKey];
        if (k != null) v = (k.Value == null ? defValue : k.Value);
            return v;
    }
    catch { return defValue; }
}

Проблема: вам нужно UAC-подтверждение для записи поверх вашей исполняемой конфигурации, и вы не можете использовать синтаксис Properties.Settings.Default.MyProperty.

1 голос
/ 21 февраля 2012

Просто используйте настройки с областью применения.

0 голосов
/ 09 марта 2012

Я, наконец, выбрал более простую и простую альтернативу, заключающуюся в создании простого класса настроек и его сериализации / десериализации, как описано здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...