Подтвердить что ты не робот

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

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

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

C:\Documents and Settings\имя_пользователя\Local Settings\Application Data\company_name\product_name\product_version\

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

4b9b3361

Ответ 1

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

// 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(); 

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

//для получения значения настроек

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

//для установки значения настроек

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

с помощью:

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

//вы также можете сохранить имя раздела, чтобы просто добавить имя в раздел Set (имя_сектора, имя, значение) и Get (имя_сектора, имя, значение)

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);
    }
}

Ответ 7

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

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

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

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

Ответ 8

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

Райан Фарли имеет право.