Сведения о вопросе

Kimsanov

04:39, 1st August, 2020

Теги

c#   .net    

Как лучше всего хранить пользовательские настройки для приложения .NET?

Просмотров: 395   Ответов: 8

У меня есть .NET 2.0 Windows бланков заявки. Где лучше всего разместить настройки пользователя магазина (учитывая рекомендации Windows)?

Некоторые люди указывали на Application.LocalUserAppDataPath . Однако это создает структуру папок, как:

C:\Documents и Settings\user_name\Local Settings\Application Data\company_name\product_name\product_version\

Если я выпущу версию 1 своего приложения и сохраню там файл XML, а затем выпущу версию 2, это изменится на другую папку, верно? Я бы предпочел иметь одну папку для каждого пользователя, чтобы хранить настройки, независимо от версии приложения.



  Сведения об ответе

lesha

11:18, 4th August, 2020

Я люблю использовать встроенные настройки приложения . Затем у вас есть встроенная поддержка для использования конструктора параметров, если вы хотите использовать его во время разработки или во время выполнения:

// read setting
string setting1 = (string)Settings.Default["MySetting1"];
// save setting
Settings.Default["MySetting2"] = "My Setting Value";

// you can force a save with
Properties.Settings.Default.Save();

Он действительно хранит настройки в аналогичной структуре папок, как вы описываете (с версией в пути). Тем не менее, с помощью простого вызова:

Properties.Settings.Default.Upgrade(); 

Приложение будет тянуть все настройки предыдущих версий, чтобы сохранить их.


  Сведения об ответе

PIRLO

00:50, 15th August, 2020

.NET приложения имеют встроенный механизм настройки, который прост в использовании. Проблема с ним, на мой взгляд, заключается в том, что он хранит эти настройки в довольно неясном каталоге, и конечные пользователи не смогут его найти. Кроме того, простое переключение с debug на release build изменяет расположение этого каталога, что означает, что любые настройки, сохраненные в одной конфигурации, теряются в другой.

По этим и другим причинам я придумал свой собственный код настроек для Windows форм . Он не совсем такой гладкий, как тот, который поставляется с .NET, но он более гибкий, и я использую его все время.


  Сведения об ответе

ASER

21:42, 12th August, 2020

Или запишите свои настройки в файл xml и сохраните его с помощью изолированного хранилища . В зависимости от используемого хранилища он сохраняет его в папке данных приложения. Вы также можете выбрать хранилище с включенным роумингом, что означает, что при входе пользователя на другой компьютер параметры перемещаются вместе с ними.


  Сведения об ответе

LIZA

17:32, 21st August, 2020

Один из подходов, который работал для меня в прошлом, заключался в создании класса настроек и использовании сериализации XML для записи его в файловую систему. Вы можете расширить эту концепцию, создав коллекцию объектов настроек и сериализовав ее. Вы будете иметь все свои настройки для всех пользователей в одном месте, не беспокоясь об управлении файловой системой.

Прежде чем кто-нибудь даст мне какой-нибудь отпор за частичное повторное изобретение колеса, позвольте мне сказать несколько вещей. Во-первых, это всего лишь несколько строк кода для сериализации и записи файла. Во-вторых, если у вас есть объект, содержащий ваши настройки, вам не нужно делать несколько вызовов объекта appSettings при загрузке приложения. И, наконец, очень легко добавлять элементы, представляющие состояние ваших приложений, что позволяет вам возобновить длительную работу, когда приложение загружается в следующий раз.


  Сведения об ответе

nYU

20:55, 2nd August, 2020

Я попробовал некоторые методы, чтобы сохранить мои настройки в простой текстовый файл, и я нашел лучший способ:

файл, хранящийся в папке приложения, для использования, settings.txt : (внутри файла настроек одобренные комментарии, попробуйте //comment)

//to получить значение настроек

Settings.Get("name", "Ivan");

//to установить значение настроек

Settings.Set("name", "John");

с помощью:

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

//you можно хранить также с названием раздела, для использования, просто добавьте название раздела(section_name,имя,значение) и получить(section_name,имя,значение)

public static class Settings
{
    private static string SECTION =  typeof(Settings).Namespace;//"SETTINGS";
    private static string settingsPath = Application.StartupPath.ToString() + "\\settings.txt";
    [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);
    public static String GetString(String name)
    {
        StringBuilder temp = new StringBuilder(255);
        int i = GetPrivateProfileString(SECTION,name,"",temp,255,settingsPath);
        return temp.ToString();
    }
    public static String Get(String name, String defVal)
    {
        return Get(SECTION,name,defVal);
    }
    public static String Get(string _SECTION, String name, String defVal)
    {
        StringBuilder temp = new StringBuilder(255);
        int i = GetPrivateProfileString(_SECTION, name, "", temp, 255, settingsPath);
        return temp.ToString();
    }
    public static Boolean Get(String name, Boolean defVal)
    {
        return Get(SECTION, name, defVal);
    }
    public static Boolean Get(string _SECTION, String name, Boolean defVal)
    {
        StringBuilder temp = new StringBuilder(255);
        int i = GetPrivateProfileString(_SECTION,name,"",temp,255,settingsPath);
        bool retval=false;
        if (bool.TryParse(temp.ToString(),out retval))
        {
            return retval;
        } else
        {
            return retval;
        }
    }
    public static int Get(String name, int defVal)
    {
        return Get(SECTION, name, defVal);
    }
    public static int Get(string _SECTION, String name, int defVal)
    {
        StringBuilder temp = new StringBuilder(255);
        int i = GetPrivateProfileString(SECTION,name,"",temp,255,settingsPath);
        int retval=0;
        if (int.TryParse(temp.ToString(),out retval))
        {
            return retval;
        } else
        {
            return retval;
        }
    }
    public static void Set(String name, String val)
    {
        Set(SECTION, name,val);
    }
    public static void Set(string _SECTION, String name, String val)
    {
        WritePrivateProfileString(_SECTION, name, val, settingsPath);
    }
    public static void Set(String name, Boolean val)
    {
        Set(SECTION, name, val);
    }
    public static void Set(string _SECTION, String name, Boolean val)
    {
        WritePrivateProfileString(_SECTION, name, val.ToString(), settingsPath);
    }
    public static void Set(String name, int val)
    {
        Set(SECTION, name, val);
    }
    public static void Set(string _SECTION,String name, int val)
    {
        WritePrivateProfileString(SECTION, name, val.ToString(), settingsPath);
    }
}


  Сведения об ответе

davran

22:23, 10th August, 2020

Изолированное хранилище в основном используется для приложений, распределенных с использованием ClickOnce и работающих в безопасной песочнице. Базовый путь определяется для вас, и вы не сможете определить его в своем коде. Путь будет выглядеть примерно так: "\LocalSettings\ApplicationData\IsolatedStorage\ejwnwe.302\kfiwemqi.owx\url.asdaiojwejoieajae....", не все так дружелюбно. Ваше место для хранения также ограничено.

Райан Фарли был прав .


  Сведения об ответе

SEEYOU

04:26, 24th August, 2020

Настройки - это стандартные пары ключ-значение (строка-строка). Я мог бы завернуть их в файл XML, если это поможет.

Я бы предпочел использовать файловую систему вместо Реестра. Кажется, его легче поддерживать. В сценариях поддержки, если пользователю нужно вручную открыть / изменить настройки, это будет проще, если он находится в файловой системе.


  Сведения об ответе

+-*/

12:38, 26th August, 2020

Я бы пошел вниз по списку папок, который вы опубликовали, за исключением версии продукта. Вы не хотите, чтобы настройки были сброшены после выпуска обновления.

На самом деле я удаляюсь от реестра для пользовательских настроек из-за фактора отладки/следа. В настоящее время я храню только несколько основных настроек (размер окна, положение, версия файла данных) в реестре, и я столкнулся с большим количеством проблем, если обновление идет плохо или пользователь теряет второй монитор, и именно туда открывалось приложение. Некоторые из них достаточно сообразительны, чтобы понять regedit, но для rest они должны сделать переустановку, которая происходит быстро, но я думаю, что они немного ворчат. С файловой версией все, что мне нужно сделать, это открыть файл XML в блокноте и сделать быструю настройку.

Кроме того, я хочу сделать свое приложение доступным для запуска с диска USB flash, и привязка настроек к файлу кажется гораздо более дружественной к этому процессу. Я уверен, что могу сделать некоторый код для проверки/очистки реестра, но я думаю, что большинство из нас уже устали от беспорядка реестра, который, кажется, съедает наши машины в настоящее время.

Я знаю, что есть некоторые компромиссы в области безопасности, но ни одна из данных, которые я сортирую, не имеет такого критического значения для этой причины, и я не страдаю от каких-либо сбоев производительности из-за размера приложения.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться