C хранение настроек в файле

Обновлено: 07.07.2024

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

Я понимаю, что есть три варианта доступно:

  • ConfigurationSettings file (appname.исполняемый.config)
  • реестр
  • пользовательский XML-файл

Я видел другие дискуссии на эту тему, но мне все еще не ясно.

если вы работаете с Visual Studio, то это довольно легко получить устойчивые настройки. Щелкните правой кнопкой мыши проект в обозревателе решений, выберите Свойства. Выберите вкладку Настройки, нажмите на гиперссылку, если настройки не существуют. Используйте вкладку Параметры для создания параметров приложения. Visual Studio создает файлы Settings.settings и Settings.Designer.settings , которые содержат одноэлементный класс Settings наследуется от ApplicationSettingsBase. Вы можете получить доступ к этому классу из кода для чтения/записи настройки приложения:

этот метод применим как для консоли, Windows Forms, так и для других типов проектов.

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

Если вы планируете сохранить в файл в том же каталоге, что и исполняемый файл, вот хорошее решение, которое использует JSON:

The ApplicationSettings класс не поддерживает сохранение настроек приложения.конфигурационный файл. Это очень много по дизайну, приложения, которые работают с должным образом защищенной учетной записью пользователя (думаю, Vista UAC) не имеют доступа на запись в папку установки программы.

Вы можете бороться с системой с ConfigurationManager класса. Но тривиальный обходной путь состоит в том, чтобы войти в конструктор настроек и изменить область настройки на пользователя. Если это вызывает трудности (скажем, настройка актуальна для каждого пользователя), вы следует поместить функцию параметров в отдельную программу, чтобы вы могли запросить запрос на повышение привилегий. Или отказаться от использования настроек.

Я хотел поделиться библиотекой, которую я построил для этого. Это крошечная библиотека, но большое улучшение (ИМХО) закончилось .файл настроек.

библиотека называется Jot (GitHub), вот статья проекта кода я писал об этом.

вот как вы будете использовать его, чтобы отслеживать размер и расположение окна:

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

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

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

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

аргумент registry/configurationSettings/XML по-прежнему кажется очень активным. Я использовал их все, как технология прогрессировала, но мой любимый основан на Threed все!--5--> в сочетании с Изолированное Хранилище.

следующий пример позволяет хранить объекты с именем свойства в файле в изолированном хранилище. Например:

свойства могут быть восстановлены с помощью:

это просто образец, не наводящий на размышления наилучшие виды практики.

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

вот пример для хранения позиции и размера формы.

конфигурация dataobject строго типизирована и проста в использовании:

класс менеджера для сохранения и загрузки:

теперь вы можете создать экземпляр и использовать его в загрузке и закрытии формы события:

и полученный XML-файл также читается:

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

На хабре уже была посвящена этому тема, поэтому… перейти

Информация о Properties.Settings

Организация Properties.Settings — это обычный xml файл, который можно найти в папке пользователя:

С:\ Users \ [user name] \ AppData \ Local \ [ (Project Name) or (AssemblyCompany) ] \ [name project_cashBuild] \ [AssemblyVersion] \ user.config

Для начала нам нужно создать такие переменные для Properties.Settings. Перейдем в Properties -> Settings.settings:



Я создал 3-и переменные и выбрал область их использования: 2- область пользователь и 1- приложение.

Различие между областями просты. Область приложения можно только читать, а пользователь — изменять и читать.

Вернемся к переменным:

  • Version — версия нашей программы. Определил ее строкой и областью приложение. Т.к. версия может содержать буквы (например, b — от beta). А область выбрал, чтоб не менялась наша версия приложения (т.к. AssemblyVersion редко кто использует).
  • Save_text — это переменная, куда мы будем сохранять наш текст.
  • open_sum — сколько раз мы открыли программу.

Результаты работы программы

Первый запуск, мы видим, что кол-во запусков равно 1. И теста в richTextBox1 нет.


Теперь напишем и сохраним текст.


При втором запуске мы видим, что текст сохранен, и кол-во запусков уже 2-ва.


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

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

Теперь перейдем к нашей теме. Для работы с таким типом файлов, нам нужно создать класс по работе с ним. Создаем класс, например «IniFile», подключаем пространство имен, которых нет:


А теперь разбираем по-порядку:

Теперь переходим в основную программу.

Результаты работы программы

При первом запуска, у нас нет файла config.ini. Поэтому при проверке возвращаются fasle и мы приравниваем окно к минимальным параметрам.


Меняем параметры окна и жмем «Применить»


Редактируем файл config.ini руками и жмем загрузить.


На этом все, в следующий раз опишу работу с xml файлами и с бинарными файлами.

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

Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1 под Windows.

Структура проекта

Проект создается как Приложение Qt Widgets, в котором по умолчанию создаются файлы:

  • Settings.pro - профайл;
  • mainwindow.h - заголовочный файл основного окна приложения;
  • mainwindow.cpp - исходный код окна;
  • main.cpp - основной исходный файл, с которого стартует приложение;
  • mainwindow.ui - формочка основного окна приложения.

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

mainwindow.ui

Создаем формочку для теста, в которой будут использоваться два следующих объекта:

  • trayCheckBox - чекбокс для настройки поведения приложения;
  • saveButton - кнопка для выполнения сохранения настроек Приложения;

Settings.pro

По-прежнему в уроках не вносится изменений профайл проекта.

main.cpp

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

mainwindow.h

Помимо методов и объектов, использованных в уроке по QSystemTrayIcon в данный файл необходимо внести Слот для обработки нажатия кнопки, в котором будет производиться сохранение настроек.

Также необходимо подключить в проект заголовочные файлы следующих классов:

И прописать директивы define, которые будут использоваться при работе с QSettings.

mainwindow.cpp

В данном классе производится выполнение восстановления настроек приложения при инициализации внешнего вида главного окна, а также сохранение настроек по нажатию по кнопке saveButton.

Итог по уроку QSettings

При успешном написании кода из урока, при нажатии кнопки сохранения настроек, настройки сохранятся в реестр операционной системы.

А после перезапуска приложения настройки будут восстановлены. Если при сохранении настроек чекбокс был отмечен, то при запуске приложения он также будет отмечен. И приложение будет вести себя в соответствии с настройками.

Появилась необходимость хранения настроек программы.
раньше хранил в ини файлах, но щас это
не подходит.

Настройки такого типа например:

Как лучше организовать хранение таких настроек чтобы
удобно было добавлять, изменять или удалять нужный элемент,
в данном случае элемент "Тариф"

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

Всем заранее спасибо за помощь.

14.03.06 18:03: Перенесено модератором из 'C/C++' — Павел Кузнецов

Здравствуйте, Kreol, Вы писали:

K>Появилась необходимость хранения настроек программы.
K>раньше хранил в ини файлах, но щас это
K>не подходит.

K>Настройки такого типа например:

K>Как лучше организовать хранение таких настроек чтобы
K>удобно было добавлять, изменять или удалять нужный элемент,
K>в данном случае элемент "Тариф"

K>Т.е. вопрос получается в том: как организовать простейший файл базы данных
K>для программы.

XML не подойдет?

. << RSDN@Home 1.1.4 stable SR1 rev. 568 with Алиса — Сумерки>>

Здравствуйте, Kreol, Вы писали:

K>

K>Как лучше организовать хранение таких настроек чтобы
K>удобно было добавлять, изменять или удалять нужный элемент,
K>в данном случае элемент "Тариф"

K>Т.е. вопрос получается в том: как организовать простейший файл базы данных
K>для программы.

В таких случаях удобно использовать XML-формат файлов.

Здравствуйте, Kreol, Вы писали:

It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde

R>В таких случаях удобно использовать XML-формат файлов.

А где про работу с ними почитать.
Как программировать и пр.
Я тут вообще как в танке ничего о работе с xml не знаю.

Здравствуйте, Kreol, Вы писали:

K>Всем заранее спасибо за помощь.

хотел написать про xml, но об этом уже сказали.. вообще это больще к архитектуре относится. Здесь удобно применить паттерн "bridge" для отеления логики работы с настройками (добавление, изменение, удаление и т.п.) и логики работы с конкретным хранилищем этих настроек. Т.е. как то так:

в результате можно безболезненно менять логику работы с конкретным хранилищем тарифов, изменив только инициализацю члена impl_ класса TariffManager

https://lh3.googleusercontent.com/-jIXLxlvycbk/TtKm5Xxz7JI/AAAAAAAABEA/CITKwRG1hFg/w500-h200-k/mvp_horizontal.jpg

"Что не завершено, не сделано вовсе" Гаусс

Здравствуйте, Kreol, Вы писали:

K>Т.е. вопрос получается в том: как организовать простейший файл базы данных
K>для программы.

Ну вот все сразу кинулись в XML . Однако, тут надо понимать, что использование XML повлечет за собой прилинковку мало мальски рабочей версии библиотеки по его парсингу, или, как вариант, потребует время на простейший рабор его (XML) вручную. Против использования XML я конечное кичего не имею, вещь действительно мощная, но, ИМХО, в данном случае не по-потребностям. Ведь спрашивали про простейший способ .
Может луТЧе обойтись просто типизированным файлом? Ведь судя по описанию весь этот "тариф" с потрохами укладывается в структуру.

Если какой-нибудь какркас используется (MFC, VCL, Qt. ), то почти наверняка в ней есть какой-нибудь способ сериализации объектов. Можно это использовать.

Здравствуйте, Kreol, Вы писали:
K>Как лучше организовать хранение таких настроек чтобы
K>удобно было добавлять, изменять или удалять нужный элемент,
K>в данном случае элемент "Тариф"

K>Т.е. вопрос получается в том: как организовать простейший файл базы данных
K>для программы.

Как вариант, можно прицепить полноценный SQL в виде встраиваемой базы данных SQLite, она компактная, быстрая и достаточно мощное. Хранит все в одном файле, но в отличии от .mdb+access это портируемо, быстро и не требует внешних зависимостей.

"To protect people you must slay people. To let people live you must let people die. This is the true teaching of the sword."
-Seijuro Hiko, "Rurouni Kensin"
От: algol about:blank
Дата: 15.03.06 10:38
Оценка: +1

Здравствуйте, Kreol, Вы писали:

K>Т.е. вопрос получается в том: как организовать простейший файл базы данных
K>для программы.

CSV (Comma Separated Values). Редактировать настройки можно как в текстовом редакторе, так и в любой программе, поддерживающей формат (Excel например).
Сам формат примитивный, читать/писать нет проблем. Готовый велосипед можно взять например здесь:
CDataFile &mdash; An easy class for reading numeric data in CSV or Text-Delimited format.

algol wrote:
> CSV (Comma Separated Values). Редактировать настройки можно как в
> текстовом редакторе, так и в любой программе, поддерживающей формат
> (Excel например).
> Сам формат примитивный, читать/писать нет проблем. Готовый велосипед
Не слишком он уж и примитивный. Особенно, если потребуются переводы строк в значениях, кавычки, разные кодировки, етс. Здравствуйте, kan_izh, Вы писали:

_>algol wrote:
>> CSV (Comma Separated Values). Редактировать настройки можно как в
>> текстовом редакторе, так и в любой программе, поддерживающей формат
>> (Excel например).
>> Сам формат примитивный, читать/писать нет проблем. Готовый велосипед
_>Не слишком он уж и примитивный. Особенно, если потребуются переводы строк в значениях, кавычки, разные кодировки, етс.
Ну не такой уж он и примитивный. Поддерживает большую часть SQL. Понятно, что на замену "серьёзных" многопользовательских баз он не претендует, а так — в чём проблемма. Я юзал для БД в несколько мега записий, с юникодом, и т.д. Просто и сердито. "To protect people you must slay people. To let people live you must let people die. This is the true teaching of the sword."
-Seijuro Hiko, "Rurouni Kensin"

Здравствуйте, SirJo, Вы писали:

SJ>Если нужно пришлю свой врапер для MSXML.
SJ>Под С++

Здравствуйте, Kreol, Вы писали:

K>Привет всем.

K>Появилась необходимость хранения настроек программы.
K>раньше хранил в ини файлах, но щас это
K>не подходит.

K>Настройки такого типа например:


K>

K>Как лучше организовать хранение таких настроек чтобы
K>удобно было добавлять, изменять или удалять нужный элемент,
K>в данном случае элемент "Тариф"

K>Т.е. вопрос получается в том: как организовать простейший файл базы данных
K>для программы.

K>Всем заранее спасибо за помощь.


Если windows, то можно Access

Здравствуйте, Zigmar, Вы писали:

Мои 5копеек:
В Win есть готовый ODBC драйвер для CSV

От: algol about:blank
Дата: 15.03.06 14:14
Оценка:

Здравствуйте, srggal, Вы писали:

S>Мои 5копеек:
S> В Win есть готовый ODBC драйвер для CSV

Добавлю еще 15 копеек. CSV можно читать/писать через ADO/OLEDB и Jet/ISAM провайдер:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\txtFilesFolder\;Extended Properties=""text;HDR=Yes;FMT=Delimited"""

В MDAK SDK есть OLEDB sample provider для CSV.
В OLE DB Simple Provider (OSP) Toolkit также был пример simple провайдера для CSV.

Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Kreol, Вы писали:

K>>Т.е. вопрос получается в том: как организовать простейший файл базы данных
K>>для программы.

А>Ну вот все сразу кинулись в XML . Однако, тут надо понимать, что использование XML повлечет за собой прилинковку мало мальски рабочей версии библиотеки по его парсингу, или, как вариант, потребует время на простейший рабор его (XML) вручную. Против использования XML я конечное кичего не имею, вещь действительно мощная, но, ИМХО, в данном случае не по-потребностям. Ведь спрашивали про простейший способ .
А>Может луТЧе обойтись просто типизированным файлом? Ведь судя по описанию весь этот "тариф" с потрохами укладывается в структуру.


Вот спасибо за подсказку

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

Имхо для моих целей это как раз подходит,
а всякие там sql и xml оставим для более крупных проектов,
а не для программы с 10-тью настройками

Правда мне стало интересно что за зверь этот xml,
никогда его не использовал.

Но если уж придется хранить большое количество разных данных,
то имхо лучше использовать например mysql.

Здравствуйте, sadomovalex, Вы писали:

S>хотел написать про xml, но об этом уже сказали.. вообще это больще к архитектуре относится. Здесь удобно применить паттерн "bridge" для отеления логики работы с настройками (добавление, изменение, удаление и т.п.) и логики работы с конкретным хранилищем этих настроек. Т.е. как то так:

S>

S>в результате можно безболезненно менять логику работы с конкретным хранилищем тарифов, изменив только инициализацю члена impl_ класса TariffManager

А в данном случае нельзя просто обойтись абстрактным базовым классом TariffManager и набором производных от него, реализующих конкретные хранилища, например, XmlTariffManager и др.?

Читайте также: