Каков наилучший способ хранения пользовательских настроек для приложения .NET? - PullRequest
57 голосов
/ 25 августа 2008

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

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

C: \ Documents and Settings \ имя_пользователя \ Локальные настройки \ Приложение Data \ company_name \ product_name \ product_version \

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

Ответы [ 8 ]

79 голосов
/ 25 августа 2008

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

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

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

8 голосов
/ 21 марта 2011

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

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

5 голосов
/ 25 августа 2008

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

2 голосов
/ 25 августа 2008

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

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

1 голос
/ 25 июня 2015

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

файл, хранящийся в папке приложения, для использования, 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 Set (section_name, name, value) и Get (section_name, name, value)

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);
    }
}
0 голосов
/ 26 августа 2008

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

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

0 голосов
/ 25 августа 2008

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

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

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

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

0 голосов
/ 25 августа 2008

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

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

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