10 / 10 / 4
Регистрация: 05.08.2009
Сообщений: 101

Где хранить настройки программы (свойства формы и её компонентов)

06.08.2009, 15:44. Показов 21456. Ответов 50
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые, мне необходимо где-то хранить настройки программы (например, если пользователь не хочет видеть статусную панель и её отключил через меню, то при запуске формы она не должна быть показана). Я слышал, что для хранения подобных настроек можно использовать файл settings, файл конфигурации, ini-файл, txt-файл, реестр, но один знакомый прогер посоветовал мне использовать XML, дескать, если C#, то C# + XML = мегабомба. Может кто помочь с сериализацией.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.08.2009, 15:44
Ответы с готовыми решениями:

Где хранить настройки программы
Собственно, вопрос в названии. Пишу программу, в которой много настроек, как зашифрованных, так и нет. Сейчас встал вопрос: "Где...

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

Где лучше хранить настройки?
Мне нужно сохранить в основном цвета. Допустим я задел цвет линиям красный, фон черный и так далее. Потом после нового запуска программы...

50
 Аватар для dimasamchenko
336 / 269 / 21
Регистрация: 30.03.2009
Сообщений: 500
23.12.2009, 16:12
Студворк — интернет-сервис помощи студентам
Да, есть у каждого, это первая строка окна "свойства" (Property)-- ApplicationSettings
там при раскрытии выбираете необходимое из возможных,
а сохраняется все автоматически! Очень удобно.
Удачи.
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
23.12.2009, 16:39
Еще раз спасибо! Вы очень помогли. Если появится еще какой-то 'подводный камень' - я напишу. Буду надеяться на помощь.

Добавлено через 9 минут
Кстати, а где эти данные будут храниться?
0
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
23.12.2009, 16:52
Блин, а я вот сам написал класс для хранения настроек... этот класс сам создаёт что-то типа *.ini файла. Отличие в том, что мой класс ещё и шифрует настройки....

Если хотите, могу поделиться....
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
23.12.2009, 20:22
Не отказался бы. Я тоже когда-то написал, но это слишком долго по сравнению с уже встроенными функциями.
0
 Аватар для dimasamchenko
336 / 269 / 21
Регистрация: 30.03.2009
Сообщений: 500
24.12.2009, 10:05
Цитата Сообщение от body90 Посмотреть сообщение
Еще раз спасибо! Вы очень помогли. Если появится еще какой-то 'подводный камень' - я напишу. Буду надеяться на помощь.

Добавлено через 9 минут
Кстати, а где эти данные будут храниться?
Спасибо за доброе слово. Я рад, что смог помочь.
Пишите, если смогу-помогу.
Данные хранятся в файле user.config типа XML, расположен он в дикой подвложенности текущего юзера, где-то примерно так
C:\Documents and Settings\UserName\Local Settings\Application Data\организация на котор рег VS по умолчанию\Приложение.vshost.exe_Url_gejn h5upq3i4qkln4iucya52vyhgzbi0\1.0.0.0\use r.config.
Удачи.
1
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
24.12.2009, 22:13
Цитата Сообщение от dimasamchenko Посмотреть сообщение
Да, создастся(при закрытии приложения)! Если при первом запуске приложения файла нет то происходит инициализация значениями по умолчанию(не забудь определить эти значения не все подставляются автоматом!!!).
Позвольте с Вами не согласиться. Я не знаю как с пользовательскими настройками, а вот настройки приложения автоматом не создаются. Проверено. Я сначала мучилась и не могла понять - если нет этого файла, откуда же приложение берет данные? Долго не могла понять. Оказывается, когда ты в студио создаешь файл настроек, эти настройки являются по умолчанию и типа прописываются в самом приложении. Они используются приложением при отсутствии файла настроек. А если этот файл есть, то оно берет настройки из него, но новый файл не создается - это точно.

А вообще мне очень понравилась простота работы с файлом настроек. В дальнейшем буду им обязательно пользоваться. Единственное что - мне-то удобно, а вот безрукому пользователю трудно разобраться в xml файле, чтобы изменить настройки, в ini проще и нагляднее.
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
25.12.2009, 01:58
Я не проверял, но по идее, файл создается автоматически когда изменяются стандартные настройки. Иначе б в нем не было смысла. Может быть Вы не использовали метож .Save()?
Не по теме:
Приятно, что среди нас, программистов, есть немало девушек.
0
 Аватар для dimasamchenko
336 / 269 / 21
Регистрация: 30.03.2009
Сообщений: 500
25.12.2009, 10:02
Цитата Сообщение от body90 Посмотреть сообщение
Я не проверял, но по идее, файл создается автоматически когда изменяются стандартные настройки. Иначе б в нем не было смысла. Может быть Вы не использовали метож .Save()?
Не по теме:
Приятно, что среди нас, программистов, есть немало девушек.
Доброго дня Всем!
Правильно, только если что-то изменяли, тогда файл создается.
.Save() тоже необходимо использовать перед закрытием приложения.
body90, полностью с Вами согласен не по теме!

Добавлено через 4 минуты
Цитата Сообщение от Лакшми Посмотреть сообщение
Позвольте с Вами не согласиться. Я не знаю как с пользовательскими настройками, а вот настройки приложения автоматом не создаются. Проверено. Я сначала мучилась и не могла понять - если нет этого файла, откуда же приложение берет данные? Долго не могла понять. Оказывается, когда ты в студио создаешь файл настроек, эти настройки являются по умолчанию и типа прописываются в самом приложении. Они используются приложением при отсутствии файла настроек. А если этот файл есть, то оно берет настройки из него, но новый файл не создается - это точно.

А вообще мне очень понравилась простота работы с файлом настроек. В дальнейшем буду им обязательно пользоваться. Единственное что - мне-то удобно, а вот безрукому пользователю трудно разобраться в xml файле, чтобы изменить настройки, в ini проще и нагляднее.
Доброго дня.
Позвольте и мне с Вами не согласиться.
Напрямую файл изменять даже,как-то некультурно.
А безрукому пользователю вообще лазить по системным вещам противопоказано!
1
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
25.12.2009, 18:08
Цитата Сообщение от body90 Посмотреть сообщение
Я не проверял, но по идее, файл создается автоматически когда изменяются стандартные настройки. Иначе б в нем не было смысла. Может быть Вы не использовали метож .Save()?
Да-да, совершенно верно! Он наверняка должен появляться при записи новых значений. У меня просто для чтения этот файл. Я там держу имя сервера, имя базы данных и каким образом происходит аутентификация - через sql или windows, ну и соответственно пользователь и пароль.
Цитата Сообщение от body90 Посмотреть сообщение
Не по теме:
Приятно, что среди нас, программистов, есть немало девушек.

Цитата Сообщение от dimasamchenko Посмотреть сообщение
Доброго дня.
Позвольте и мне с Вами не согласиться.
Напрямую файл изменять даже,как-то некультурно.
А безрукому пользователю вообще лазить по системным вещам противопоказано!
Да я знаю... Предложила начальнику для таких безруких сделать маленькую утилитку для установки нужных значений. А он сказал что т.к. моя прога и так является утилитой, а утилита к утилите это не гуд. Пока вопрос повис, может что-нибудь потом придумаем.
1
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
13.01.2010, 00:29
Возвращаясь к теме...

Завтра собиралась сделать сохранение измененных настроек программы. Однако, косяк выходит... Почитав в инете, я поняла, что изменять можно только пользовательские настройки, которые определены как User, а вот программные, которые определены как Application, являются readOnly... Вот засада-то! Единственное, что приходит в голову - удалять файл настроек и создавать новый. Но каким образом - понятия не имею... Есть еще идеи? Конкретно с файлом настроек, про собственноручно xml-файл пока не говорим.
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
13.01.2010, 02:30
На эту проблему я сам перу дней назад натолкнулся. А почему не хранить настройки для каждого пользователя отдельно? Или создать метод, который будет искать файл настройки у остальных пользователей и копировать в своего)
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
13.01.2010, 19:10
Сделала я настройки для юзера. Все было замечательно весь день - удаляла этот файл, он создавался снова... Но потом что-то я такое сделала, что файл перестал появляться, а программа откуда-то брала настройки... Вся расстроилась под конец рабочего дня... Куда он делся и где его теперь искать, а главное - что я такого сделала, - вот задачка-то...

Подумываю может тупо на ini-файле сделать все? Немного погуглив поняла, что тут тоже не все так просто...
0
 Аватар для dimasamchenko
336 / 269 / 21
Регистрация: 30.03.2009
Сообщений: 500
13.01.2010, 19:41
Цитата Сообщение от Лакшми Посмотреть сообщение
Сделала я настройки для юзера. Все было замечательно весь день - удаляла этот файл, он создавался снова...
Доброго вечера!
А каким образом Вы сделали настройки для юзера? Поделитесь, если не жалко!
С уважением, Дима.
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
13.01.2010, 19:50
Отчего же, не жалко совсем. Я выше писала, что при создании файла настроек можно указать область действия конкретной настройки - приложение или пользователь. Вот там и указывается - Application или User.

Цитата Сообщение от Лакшми Посмотреть сообщение
Файл с настройками лежит в зависимости от того, какой выбран Scope (наверное Вы имели в виду "Область"). Если выбрано Application, то хранится в папке проекта, а если User, то в папке пользователя.

Ну вот это и есть определение - настройки для приложения, которые действуют для всех пользователей, и настройки юзера - только для конкретного.
Добавлено через 3 минуты
Но, вообще, как-то уже боязно использовать этот файл настроек, когда не знаешь что он еще выкинет.... И где его искать и что от него ожидать... Лучше уж допотопный, но надежный ini-шник... Наверное... На крайняк можно использовать xml-файл, хотя не хотелось бы, а то пользователю трудно будет в нем разобраться.
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
13.01.2010, 20:54
А можно как поступали наши деды - в обычный бинарный файл?
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
13.01.2010, 21:05
Неее... Я щас тренируюсь с обычным текстовым файлом. Очень даже здорово получается. Показать?

Добавлено через 9 минут
Есть текстовый файл Setting.txt такого вида:

ServerName=sql_server\sqlexpress
User=SQL_User
Password=123

И такая маленькая программка - все очень просто:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
 
namespace WindowsApplication6
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            string path = Application.StartupPath + "\\Setting.txt";
            string line = "";
            try
            {
                using (StreamReader reader = File.OpenText(path))
                {
                    while (line != null)
                    {
                        line = reader.ReadLine();
                        switch (line.Split('=')[0])
                        { 
                            case "ServerName":
                                textBox1.Text = line.Split('=')[1];
                                break;
                            case "User":
                                textBox2.Text = line.Split('=')[1];
                                break;
                            case "Password":
                                textBox3.Text = line.Split('=')[1];
                                break;
                        }
                    }
                }
            }
            catch
            {
                //Файл не существует
            }
        }
    }
}
Вобщем решено - буду делать именно так и не заморачиваться!
0
 Аватар для FreeWay
84 / 84 / 19
Регистрация: 17.12.2007
Сообщений: 574
13.01.2010, 22:35
Цитата Сообщение от Лакшми Посмотреть сообщение
Я вот тоже сейчас мучаюсь данным вопросом... Знакомый просто создает вручную файл xml и читает из него. А мне кажется более удобным использование settings в самой программе. Пока вроде получается. Ввела параметры вручную в конструкторе, читаю программно.

Часто возникает задача хранить какие-то данныев конфигах, потом быстро и безболезненно их читать, перечитывать, изменять.
Все это очень удобно делать с помощью появившегося с .NET 2.0 средства - Settings.
Добавить их в проект просто - Add new Item - Settings. В моем примере, я дал им красивое и наглядное имя - MySettings

Нажмем OK, и что же произошло? А вот что:

1. Появилось 3 новых файла:
MySettings.Designer.cs
MySettings.settings
MySettings.cs

2. В проекте появился новый член команды - MySettings.settings, если кликнуть по которому, появится красивый дизайнер, с помощью которого можно добавлять свои свойства для хранения.
Каждое свойство содержит следующие критерии:
Name - наименование свойства класса и секции конфига
Type - тип данных (от простых типов, до собственных, лишь бы сериализоваться умели)
Scope - тип хранения и доступа к свойству. Имеет 2 значения - User, Application, на них я остановлюсь попозже.
Value - значение свойства (будет использоваться как значение по умолчанию)

Создадим 2 тестовых свойства:
Name Type Scope Value
MyDate DateTime User любая дата
MyString string Application "какая то строка"


Что при этом происходит:
Волшебным образом в проект добавился app.config (если не был до этого), видим в нем следующее:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsG roup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="ConsoleApplication3.MySettings" type="System.Configuration.ClientSetting sSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSe ttingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="ConsoleApplication3.MySettings" type="System.Configuration.ClientSetting sSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<userSettings>
<ConsoleApplication3.MySettings>
<setting name="MyDate" serializeAs="String">
<value>2008-03-21</value>
</setting>
</ConsoleApplication3.MySettings>
</userSettings>
<applicationSettings>
<ConsoleApplication3.MySettings>
<setting name="MyString" serializeAs="String">
<value>какая то строка</value>
</setting>
</ConsoleApplication3.MySettings>
</applicationSettings>
</configuration>

Я думаю для тех, кто понимает xml - коментарии излишни

Теперь зайдем в класс дизайнера и видим следующие сгеренированные нам свойства:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[global::System.Configuration.UserScopedSettingAttribute()]
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.Configuration.DefaultSettingValueAttribute("2008-03-21")]
        public global::System.DateTime MyDate {
            get {
                return ((global::System.DateTime)(this["MyDate"]));
            }
            set {
                this["MyDate"] = value;
            }
        }
        
        [global::System.Configuration.ApplicationScopedSettingAttribute()]
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.Configuration.DefaultSettingValueAttribute("какая то строка")]
        public string MyString {
            get {
                return ((string)(this["MyString"]));
            }
        }
Видно, что свойство Application Scope - есть только get, то есть его можно только читать, а User scope - есть get и set - можно читать и писать.
Кроме этого видим установленные нами свойсва по умолчанию аттрибутами DefaultSettingValueAttribute. Хочу обратить внимание, что значения user scope свойств не хранятся в app.config, он не переписывается при вызове метода Save(), все данные хранятся в домашнем каталоге пользователя. Это значит что если в ОС есть пользователи Петя и Вася, они оба пользуются написанной нами программой - у них будут общие Default значения, а сохраненные значения User scope - у каждого свои.

Использование наших наработок:
C#
1
2
3
4
5
6
7
8
static void Main(string[] args)
        {
            MySettings settings = new MySettings(); //создаю с дефолтовыми значениями
            settings.Reload();  //перечитываю из конфига реальные
            string myStr = settings.MyString;   //достаю из конфига реальное значение
            settings.MyDate = DateTime.Now; //устанавливаю новое значение для User Scope
            settings.Save();    //сохраняю значения свойств User Scope
        }
- минимум усилий максимум скорости - красота, а текстовые файлы, ini и т д это неудобный велостпед + вчерашний день
3
 Аватар для dimasamchenko
336 / 269 / 21
Регистрация: 30.03.2009
Сообщений: 500
14.01.2010, 10:13
Доброго дня всем!
Благодарность FreeWay! Отличное описание!
Всем вопрос- как заставить файл инициализации(я имею ввиду стандартный settings) сохраняться в рабочей директории, там где находится exe?
0
 Аватар для FreeWay
84 / 84 / 19
Регистрация: 17.12.2007
Сообщений: 574
14.01.2010, 17:29
Цитата Сообщение от dimasamchenko Посмотреть сообщение
Доброго дня всем!
Благодарность FreeWay! Отличное описание!
Всем вопрос- как заставить файл инициализации(я имею ввиду стандартный settings) сохраняться в рабочей директории, там где находится exe?
а разве он там (вместе с экзешником) не формируеться???
Может ты CurrentDirectory меняешь?
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
14.01.2010, 19:16
Если настройки для Application, то файл создастся в папке с файлом программы. А если для User, то в папке юзера Documents and Settings\<имя пользователя>\Application Data\<имя проекта>

Добавлено через 3 минуты
Цитата Сообщение от FreeWay Посмотреть сообщение
минимум усилий максимум скорости - красота, а текстовые файлы, ini и т д это неудобный велостпед + вчерашний день
Очень даже удобный велосипед! Пускай старый, но ездит все еще очень даже ничего. К тому же вполне надежный.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.01.2010, 19:16
Помогаю со студенческими работами здесь

Где хранить иконки для компонентов?
Хочу научить компонент прорисовывать иконки. Если упаковать его в jar, как их сохранить??

Как и где хранить настройки приложения
Есть WIN приложение, есть возможность указать в нем некоторые опции. Как обычно поступают? Создают класс опций а потом обращаются к...

Где в UWP хранить настройки приложения?
В WPF есть Setting.setting а в UWP нету в Properties

Где лучше хранить сведения о параметрах компонентов?
Разрабатывается IDE. Вопрос: сведения о параметрах компонентов лучше хранить в XML файле или разработать для этого иерархию классов, или и...

Где лучше всего хранить настройки приложения
Доброго времени суток. Пишу программу на Windows Forms. Нужно сохранять некие настройки программы. База работает с БД Access, но туда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru