powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сохранение пользовательской конфигурации.
127 сообщений из 127, показаны все 6 страниц
Сохранение пользовательской конфигурации.
    #39212531
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В приложении есть разный функционал, как то например поиск, открытие фаила, и т.п.
и хочется сохранять последнии запросы (например из списка автодополнения) в файловой системе.
Вопрос: как это лутше (компактно, эфективно, портабельно) реализовать.
Рассматривал варианты:
1. стандартный ConfigarationManager/Settings со сохранением в пользовательском каталоге.
2. Самому накидать чтение / запись из XML-а. Один XML для всех MRU (most recently used) - значений
3. Более простое чем XML: ini - file. На каждый список свой файл.

Какие будут предпочтения у аудитории?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212532
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron, а непочему не рассматривается вариант хранить в базе?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212542
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron,

Пока за отсутсвием таковой.
Настройки локальны (дла машины + пользователя), для них цеплять отделную базу даже embedded как то слишком.
Но в принципе конечно можно обсудить и такой вариант.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212544
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronдля них цеплять отделную базу как то слишком.XML-файл или форох ini-файлов цеплять не слишком, а файл БД (более компактный, быстрый и удобный) - слишком?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212550
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronВ приложении есть разный функционал, как то например поиск, открытие фаила, и т.п.
и хочется сохранять последнии запросы (например из списка автодополнения) в файловой системе.
Вообще неплохо было бы узнать с какой целью это необходимо? Подгружать юзера потом типа истории или для внутреннего использования?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212564
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для этой фигни в принципе и сделан вариант 1.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212577
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Promikronдля них цеплять отделную базу как то слишком.XML-файл или форох ini-файлов цеплять не слишком, а файл БД ( более компактный, быстрый и удобный[/b] ) - слишком?
:) Пока смешно. Честно.
-> Компактный - действително?
Одна страница для таблицы уже 4-8 КБ (в стандарте) + служебные каталоги. Вобщем мин размер файла базы будет 4-8 страниц Пусть 6 х 4Кб = 32 Кб. + 300 Кб (Размер ембеддед дб движка)
-> Быстрый? перегонит запись/чтени ини файла? Со всеми заморочками: разбор языка, управление страницами, управление транзакциями и журналом? "Не верю". Но согласен на спор: я пишу запись ини файла вы зыпись в базу.
-> Удобный? дело вкуса. Но писать больше чем при записи файла:
Открыть базу -> Открыть файл
Подготовить команду -> (не надо)
В цикле для всех значений: Выполнить команду для знахения -> Записать значение
Закрыть транзакцию -> (не надо)
Закрыть базу -> Закрыть файл.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212596
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объемы хранящейся информации не указаны, без них бессмысленно обсуждать. Для трех строчек достаточно стандартного конфигурационного файла.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212606
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно в реестре виндовса хранить.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212612
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortibransaДля этой фигни в принципе и сделан вариант 1.
Можно, но часто перезаписывать файл конфигурации вызывает непонятное чувство беспокойста.
Такое впечатление что он концептуално для подобных целей не совсем предназначен.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212631
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProОбъемы хранящейся информации не указаны, без них бессмысленно обсуждать. Для трех строчек достаточно стандартного конфигурационного файла.
Согласен. Собираюсь хранить пока:
10 последних открытых файлов.
30 последних поисковых запросов.
30 последних запросов замены.
X закладок для быстрого доступа (сколько нужно человеку: 10 .. 50?)
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212638
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronfortibransaДля этой фигни в принципе и сделан вариант 1.
Можно, но часто перезаписывать файл конфигурации вызывает непонятное чувство беспокойста.
Такое впечатление что он концептуално для подобных целей не совсем предназначен.Юзерские значения пишутся в другое место и они для этого собственно и предназначены.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212642
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronX закладок для быстрого доступа (сколько нужно человеку: 10 .. 50?)
человеку может и достаточно, а для протокола - всё писать нужно
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212666
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилmikronX закладок для быстрого доступа (сколько нужно человеку: 10 .. 50?)
человеку может и достаточно, а для протокола - всё писать нужно
Потому я и спросил топикстартера для чего. Потому любые рассуждения без ТЗ все мимо...
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212700
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМожно в реестре виндовса хранить.
Тоже вариант
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212707
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronDima TМожно в реестре виндовса хранить.
Тоже вариант
Крайне неудачный вариант загаживать реестр такими вещами.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212708
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronИзопропилпропущено...

человеку может и достаточно, а для протокола - всё писать нужно
Потому я и спросил топикстартера для чего. Потому любые рассуждения без ТЗ все мимо...

Я готов уточнить непонятные моменты. Пока назвал вроде все МРУ значения.
Как работает автодополнение при поиске вроде очевидно.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212722
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronAxeleronпропущено...

Потому я и спросил топикстартера для чего. Потому любые рассуждения без ТЗ все мимо...

Я готов уточнить непонятные моменты. Пока назвал вроде все МРУ значения.
Как работает автодополнение при поиске вроде очевидно.В МСДН и примеры по этому поводу, мол именно пользовательские настройки..
Еще раз, они не будут хранится в кофиге екзешника, они в другом месте "лежат".
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212723
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronМожно, но часто перезаписывать файл конфигурации вызывает непонятное чувство беспокойста.Если перезаписывать при закрытии программы, тогда не часто.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212725
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КmikronМожно, но часто перезаписывать файл конфигурации вызывает непонятное чувство беспокойста.Если перезаписывать при закрытии программы, тогда не часто.Ты на "глазок" винчестера посмотри, как он сейчас "молотит" в современных-то виндах..
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212728
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronКрайне неудачный вариант загаживать реестр такими вещами.
Почему? Все поделки МС (например офис) в реестре хранят подобную инфу.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212729
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleronmikronпропущено...

Тоже вариант
Крайне неудачный вариант загаживать реестр такими вещами.

Мне тоже не нравится именно этим моментом, но как вариант имеет право на существование.
Чем то похоже на вариант с базой данных но имеет плюсы: везде установлена, транзакционна, АПИ без СКЛя.
К тому же если у приложния есть де/инсталятор то можно и регистр чистить.
Хм плюс, приложение может быть запущено с носителя, на который запись запрещенна а регист иделаная мусорка :)
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212732
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronХм плюс, приложение может быть запущено с носителя, на который запись запрещенна а регист иделаная мусорка :)
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212733
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronAxeleronпропущено...

Крайне неудачный вариант загаживать реестр такими вещами.

Мне тоже не нравится именно этим моментом, но как вариант имеет право на существование.
Чем то похоже на вариант с базой данных но имеет плюсы: везде установлена, транзакционна, АПИ без СКЛя.
К тому же если у приложния есть де/инсталятор то можно и регистр чистить.
Хм плюс, приложение может быть запущено с носителя, на который запись запрещенна а регист иделаная мусорка :)Каталог юзера, то же такая же помойка, там можно писать всякую дрянь.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212742
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortibransamikronпропущено...


Я готов уточнить непонятные моменты. Пока назвал вроде все МРУ значения.
Как работает автодополнение при поиске вроде очевидно.В МСДН и примеры по этому поводу, мол именно пользовательские настройки..
Еще раз, они не будут хранится в кофиге екзешника, они в другом месте "лежат".
Я в курсе. Деле в том что МРУ это вроде как бы не настройки а робачая информация.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212743
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

в реестр можно писать только то что изменилось и читать то что нужно и относительно быстро что то поискать (это и есть БД)
дело другое, что при роуминге все это усложняется
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212750
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КmikronМожно, но часто перезаписывать файл конфигурации вызывает непонятное чувство беспокойста.Если перезаписывать при закрытии программы, тогда не часто.
Но второй инстанс программы значения не увидит и не красиво если последний закрытый инстанс убивает историю.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212762
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronАлексей Кпропущено...
Если перезаписывать при закрытии программы, тогда не часто.
Но второй инстанс программы значения не увидит и не красиво если последний закрытый инстанс убивает историю.Файлов может быть много - по одному на "форму".
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212763
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosдело другое, что при роуминге все это усложняется
Мне как-раз роуминг и не нужен. Только локалное хранение.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212764
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кmikronпропущено...

Но второй инстанс программы значения не увидит и не красиво если последний закрытый инстанс убивает историю.Файлов может быть много - по одному на "форму".
Идею не понял. А если форма одна?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212767
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronViPRosдело другое, что при роуминге все это усложняется
Мне как-раз роуминг и не нужен. Только локалное хранение.
тогда реестр норм, тем более что можно экспортировать в случае чего
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212770
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronАлексей Кпропущено...
Файлов может быть много - по одному на "форму".
Идею не понял.Перезаписывается не вся конфигурация. Разделить можно не по формам, а по предметным областям, как удобнее.
mikronесли форма одна?Тогда вообще пофиг.

зы: Большой плюс XML - есть готовый сериализатор.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212783
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

Это вариант 1 или 2 из первого сообщения вы предлогаете?
Если разбить по областям то это уже почти 3-й вариант. Для него можно готовый JSON / CSV или INI
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212786
zz118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У DevExpress реализовен такой механизм на xml файлах в профиле. Их код по интернетам гуляет, при желании можно посмотреть как там сделано.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212788
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zz118,

хреново там сделано
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212790
zz118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRoszz118,

хреново там сделано

окей. я пользовался, мне нравилось. хреново так хреново=(
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212795
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronАлексей К,

Это вариант 1 или 2 из первого сообщения вы предлогаете?
Если разбить по областям то это уже почти 3-й вариант. Для него можно готовый JSON / CSV или INI
Я бы сделал выбор в пользу БД, так как придется при достижении лимита по каждой позиции каждый раз 'убивать' последнюю запись, а это легче всего поддерживать с помощью SQL. К тому же гарантировно, что изменения будут либо закомичены, либо отролбечены при сбое. А конфигурационный локальный файл может быть открыт кем-то, попорчен и т.д.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212814
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronЭто вариант 1 или 2 из первого сообщения вы предлогаете?Вариант 2, как самый простой.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212844
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronЯ бы сделал выбор в пользу БД, так как придется при достижении лимита по каждой позиции каждый раз 'убивать' последнюю запись, а это легче всего поддерживать с помощью SQL. К тому же гарантировно, что изменения будут либо закомичены, либо отролбечены при сбое. А конфигурационный локальный файл может быть открыт кем-то, попорчен и т.д.
Я думал просто переписывать файл. для всех моих МРУ каждый список < 4 КБ. не стоит сильно заморачиватся с обновлениями.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212848
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока получается так:
1. Конфиг файл: не совсем овечает условиям задачи (рабочие данные а не конфигурация) -> На костёр.
2. ХМЛ файл: Тяжол, выделять куски для перезаписи не годится. Если портится то всё разом -> На костёр.
3. Отделный файл для каждого списка: файл переписывается полностью, лёгкий формат -> Рабочий вариант.
4. Регистр: Немного хитрый/нелинейный способ обновления а так те-же плюсы и минусы что и у файлов. -> Рабочий вариант.

Осталось определить победителя. Для пользователя 3 и 4 одинаковы. Они не лазают не в регистр не в служебные каталоги программ. Ккаие ещё есть плюсы / минусы у 3 и 4?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212858
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronОни не лазают не в регистр не в служебные каталоги программ. Ккаие ещё есть плюсы / минусы у 3 и 4?
С 4м вариантом если что пойдет не так и он попортится/грохнется, придется идти к юзеру переустаналивать ОС и выслушивать комплименты о своей программе
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212859
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronmikronОни не лазают не в регистр не в служебные каталоги программ. Ккаие ещё есть плюсы / минусы у 3 и 4?
С 4м вариантом если что пойдет не так и он попортится/грохнется, придется идти к юзеру переустаналивать ОС и выслушивать комплименты о своей программе
Хотя если саппорт этим заниматься будет, то комплименты пойдут прямо из саппорта
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212869
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronПока получается так:
1. Конфиг файл: не совсем овечает условиям задачи (рабочие данные а не конфигурация) -> На костёр.
2. ХМЛ файл: Тяжол, выделять куски для перезаписи не годится. Если портится то всё разом -> На костёр.
3. Отделный файл для каждого списка: файл переписывается полностью, лёгкий формат -> Рабочий вариант.
4. Регистр: Немного хитрый/нелинейный способ обновления а так те-же плюсы и минусы что и у файлов. -> Рабочий вариант.

Осталось определить победителя. Для пользователя 3 и 4 одинаковы. Они не лазают не в регистр не в служебные каталоги программ. Ккаие ещё есть плюсы / минусы у 3 и 4?1. Почему файлы должны портится? 2. Если испорчен, не читаем ф топку.
Я про конфиг юзерский, и имеется ввиду что временные конфиг, размеры форм, столбцов, автозаполнений и пр. лабуда.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212870
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, а поскольку запросов к регистру будет количество достаточно большое (а по ТЗ я вижу достаточно большое), то риск увеличивается, так как опять же Регистр ОС предназначен для хранения метаданных конфигурации программ и железа, а не для временных данных.
Ну и наконец мнение его создателя.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212873
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronmikronОни не лазают не в регистр не в служебные каталоги программ. Ккаие ещё есть плюсы / минусы у 3 и 4?
С 4м вариантом если что пойдет не так и он попортится/грохнется, придется идти к юзеру переустаналивать ОС и выслушивать комплименты о своей программе
С чего это?
Регистр показал себя надёжным в плане защиты информации и от сбоев питания. А если намёк на возможную ошибку в программе, то с таким же успехом можно затереть все файлы/каталоги. риски одинаковые.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212892
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronНу, а поскольку запросов к регистру будет количество достаточно большое (а по ТЗ я вижу достаточно большое), то риск увеличивается, так как опять же Регистр ОС предназначен для хранения метаданных конфигурации программ и железа, а не для временных данных.


Позволте опротестоват:
Много это 0.002 в минуту?
Данные совсем не времменные. Их можно потерять - они не критичные, но не временные.

AxeleronНу и наконец мнение его создателя.
Статейка для пользователей, типа не лезь, можеш напороть. Так и написано, что туда пишут и читают программы.
Но для разработчииков програм пойдёт вот это или see "How Registry Data is Used"
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212902
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronРегистр показал себя надёжным в плане защиты информации и от сбоев питания.
И каким образом он защищает данные? Шифрует или пароль требует? И каким образом он защищен от сбоев питания? Не более чем обычный файл, но только обычный файл помрет в одиночестве, а вот регистр грохнуться может легко во время сбоя питания при записи туда ваших динамических данных: пруф
А чем чаще и больше Вы обращаетесь и делаете изменения в регистре, тем скорее и вероятнее, что произойдет то самое неприятное событие. Только не говорите, что у Вас никогда не бывает перебоев электричества. Варианты с UPS для каждой рабочей станции не рассматриваем.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212905
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron, Вы и те кто Вам подкинул идею использовать регистр просто не понимаете зачем он и его производительность в купе с непониманием стартегии работы с регистрами. Без обид, но Вы просто игнорируете приводимые доводы. Сами просили ведь. Если чисто поспорить беспредметно, мне это неинтересно.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212909
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronВ приложении есть разный функционал, как то например поиск, открытие фаила, и т.п.
и хочется сохранять последнии запросы (например из списка автодополнения) в файловой системе.

mikronДанные совсем не времменные. Их можно потерять - они не критичные, но не временные.

Эти данные Вы назваете персистентными? :)
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212910
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron, стратегия работы с регистром - кэширование и пререиспользование данных после уже из кэша. Работа с регистром довольно время- и ресурсо-затратное занятие. Не понимаю почему Вы так ухватились за этот вариант, если Вам кто-то по своему незнанию или глупости его подкинул, но ни одного пункта выгоды его использования не привел...
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212916
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosmikronпропущено...

Мне как-раз роуминг и не нужен. Только локалное хранение.
тогда реестр норм, тем более что можно экспортировать в случае чего
Очень было бы любопытно за этим понаблюдать. Это очень оригинальая идея. Попкорн уже приготовил.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212927
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronViPRosпропущено...

тогда реестр норм, тем более что можно экспортировать в случае чего
Очень было бы любопытно за этим понаблюдать. Это очень оригинальая идея. Попкорн уже приготовил.
отдыхай, малыш :)
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212929
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron,

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

Вы и те кто Вам подкинул идею использовать регистр просто не понимаете зачем он и его производительность в купе с непониманием стартегии работы с регистрами.
Мы не понимаем, а вы точно знаете что понимате? И кто вам это сказал?
Давайте работать с фактами. Я вам привёл ссылку. там англицким по белому написано:
"A file location stored in a registry entry might tell the program where to find a file..."
Это факт. Вам есть что возразить или микрософт тоже не понимает для чего регистр нужен?

AxeleronmikronДанные совсем не времменные. Их можно потерять - они не критичные, но не временные.
Эти данные Вы назваете персистентными? :)
По определению подходит.
А что вы называете персистентным? Вы не путаете с важностью?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212936
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron Было давно и уже стало былью.
Хорошо, этот пункт отпадает как минус.

mikron По определению подходит.
Не сказал бы. Где именно читать про Ваш абстрактный случай? Не убедило.

mikronА что вы называете персистентным? Вы не путаете с важностью?
Не путаю, а исхожу из этого определения
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212939
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и еще один ссыль , где вряд ли пометят неверный ответ как правильный.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212942
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И да, насколько знаю, программа должна обращаться к регистру с правами админа. Так что еще больше головной боли.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212944
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosAxeleronпропущено...

Очень было бы любопытно за этим понаблюдать. Это очень оригинальая идея. Попкорн уже приготовил.
отдыхай, малыш :)
Тебе самому смешно стало от предложенного?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212952
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleronmikron, стратегия работы с регистром - кэширование и пререиспользование данных после уже из кэша. Работа с регистром довольно время- и ресурсо-затратное занятие. Не понимаю почему Вы так ухватились за этот вариант, если Вам кто-то по своему незнанию или глупости его подкинул, но ни одного пункта выгоды его использования не привел...
Я подкинул. Кстати на мой вопрос ответа не получил 19043325

В данном случае вижу именно "кэширование и переиспользование", если кэш 30 записей то 1 добавили 29 перечитали. По большому счету тут вообще без разницы какая производительность, 30 строк можно даже с диска прочитать, никто тормоз не заметит.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212953
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronДавайте работать с фактами. Я вам привёл ссылку. там англицким по белому написано:
"A file location stored in a registry entry might tell the program where to find a file..."
Это факт. Вам есть что возразить или микрософт тоже не понимает для чего регистр нужен?
Регистр для Windows ОС - это нативная БД, к тому же локация файлов меняется не так уж часто.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212956
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ подкинул. Кстати на мой вопрос ответа не получил 19043325
Я не знаю что Office Именно хранит в регистре. Ссылку по предмету можно?


Dima TВ данном случае вижу именно "кэширование и переиспользование", если кэш 30 записей то 1 добавили 29 перечитали. По большому счету тут вообще без разницы какая производительность, 30 строк можно даже с диска прочитать, никто тормоз не заметит.
И зачем тогда огород городить, если 30 строк можно даже с диска прочитать ?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212959
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronDima TЯ подкинул. Кстати на мой вопрос ответа не получил 19043325
Я не знаю что Office Именно хранит в регистре. Ссылку по предмету можно?
Открываем список последних использованных файлов, затем запускаем regedit и ищем. Я тут нашел
HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\File MRU
HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Word\File MRU
...
AxeleronDima TВ данном случае вижу именно "кэширование и переиспользование", если кэш 30 записей то 1 добавили 29 перечитали. По большому счету тут вообще без разницы какая производительность, 30 строк можно даже с диска прочитать, никто тормоз не заметит.
И зачем тогда огород городить, если 30 строк можно даже с диска прочитать ?
Вот и о том же, зачем городить огород если можно из реестра прочитать?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212961
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВот и о том же, зачем городить огород если можно из реестра прочитать?
Бенефиты?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212962
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronDima TВот и о том же, зачем городить огород если можно из реестра прочитать?
Бенефиты?

AxeleronРегистр для Windows ОС - это нативная БД, к тому же локация файлов меняется не так уж часто.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212967
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronБенефиты?
Надежнее. Самодельный файлик может попортиться при перезаписи. Реестр в этом плане более надежное хранилище, ОС следит за ним, откатит к предыдущему состоянию в крайнем случае, а с файликом надо самому это прописывать.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212968
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosAxeleronпропущено...

Бенефиты?

AxeleronРегистр для Windows ОС - это нативная БД, к тому же локация файлов меняется не так уж часто.

Ну ты-то можешь в своих программах обходиться и без СУБД - все в регистр запихывать.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212970
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TAxeleronБенефиты?
Надежнее. Самодельный файлик может попортиться при перезаписи. Реестр в этом плане более надежное хранилище, ОС следит за ним, откатит к предыдущему состоянию в крайнем случае, а с файликом надо самому это прописывать.
Я не вижу в этом бенефита, учитывая что нарушена стратегия работы с регистром. Тем более ты сам говорил, что важности эти данные особой не имеют. Ну и что, если запорется файлик? Создать с нуля и накопить статистику как два пальца об асфальт.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212973
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не против записывать персистентные данные в регистр для не нативной программы для Windows, но использование регистра для данной конкретной задачи я бы поставил в самом конце списка рассмотренных выше возможных решений.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212976
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronИ да, насколько знаю, программа должна обращаться к регистру с правами админа. Так что еще больше головной боли.
плохо знаешь, у веток ACL есть
AxeleronЯ не против записывать персистентные данные в регистр для не нативной программы для Windows, но использование регистра для данной конкретной задачи я бы поставил в самом конце списка рассмотренных выше возможных решений.
странное разделение - на "свои" и нативные" - WinAPI - он один для всех
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212981
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилAxeleronИ да, насколько знаю, программа должна обращаться к регистру с правами админа. Так что еще больше головной боли.
плохо знаешь, у веток ACL есть
Если читал выше, мой основной поинт не в этом.

Изопропилстранное разделение - на "свои" и нативные" - WinAPI - он один для всех
Так каков твой довод преимущества использования регистра для задачи ТСа?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212986
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для HKEY_CURRENT_USER админских прав не надо
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212987
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДля HKEY_CURRENT_USER админских прав не надо
Единственный профит наконец найден? :)
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212989
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronЕсли читал выше, мой основной поинт не в этом.
это оправдание постинга полной фигни?

AxeleronТак каков твой довод преимущества использования регистра для задачи ТСа?

готовое надёжное хранилище без велосипеда

только преимущество - ни при чём, все варианты пригодны при условии владения инструментом
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212996
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилэто оправдание постинга полной фигни?
Почему твое мнение должно быть авторитетнее Microsoft для меня? Фактов и прувов от тебя не вижу. Лишь словоблудие.

Изопропилготовое надёжное хранилище без велосипеда
Еще один поклонник использования Registry вместо СУБД?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39212997
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronDima TДля HKEY_CURRENT_USER админских прав не надо
Единственный профит наконец найден? :)
Это не профит, это просто факт. Ветка HKEY_CURRENT_USER для того и задумана чтобы юзер-инфу хранить.
Для справки. Ветка реестра HKEY_CURRENT_USER своя для каждого виндового пользователя. Физически хранится в папке профиля пользователя в файле ntuser.dat (полный путь %userprofile%\NTUSER.DAT).
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213001
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЭто не профит, это просто факт. Ветка HKEY_CURRENT_USER для того и задумана чтобы юзер-инфу хранить.
Для справки. Ветка реестра HKEY_CURRENT_USER своя для каждого виндового пользователя. Физически хранится в папке профиля пользователя в файле ntuser.dat (полный путь %userprofile%\NTUSER.DAT).
Ок, я не спорю, что так оно и есть, но мы уходим от главного вопроса ТСа. В общем с правами разобрались.

Меня, например, интересуют профиты использования Registry от тех кто настаивает на нем. Факты вроде того, что это не велоиспед и является хранилищем данных - это детский лепет. Меня интересуют доводы с точки зрения профессионального разработчика или архитектора системы, соотвественно, чтобы в качестве аргументов был не детский лепет, а какие-то качественные и количественные критерии. Опять же довод 'потому что я использовал' считают несостоятельным. Тема задана: плюсы и минусы каждого решения. До священных войн топик доводить не нужно.

Лично я не вижу профита использования для данной задачи в использовании регистра.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213002
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мои доводы против использования реестра:
1) Доступ к реестру гораздо затратен по времени и ресурсам по сравнению с тем же ini или xml. Можете сами протестить и замерять по общим параметрам, если интересно.
2) Динамические и некритичные данные не должны пихаться в реестр.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213009
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron1) Доступ к реестру гораздо затратен по времени и ресурсам по сравнению с тем же ini или xml. Можете сами протестить и замерять по общим параметрам, если интересно.
Давай от обратного, т.е. xml: открыть, прочитать в память своего процесса, распарсить - это не затратно?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213036
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronНу и еще один ссыль , где вряд ли пометят неверный ответ как правильный.
Заметьте, следующий ответ получил больше ляйков.
Но я сам не рассматриваю аргумент "так думает большинство" всерьёз и никому не рекомендую. Иначе земля до сих пор осталась бы плоской и центром вселенной.

AxeleronМои доводы против использования реестра:
1) Доступ к реестру гораздо затратен по времени и ресурсам по сравнению с тем же ini или xml. Можете сами протестить и замерять по общим параметрам, если интересно.
2) Динамические и некритичные данные не должны пихаться в реестр.
1.А. Самое забавное что сами люди майкросовта сделала эмуляцию API для INI файлов и перенаправила их в регистр.
1.Б. Скорость. Смею предположить время записи INI < Registry < XML
1.В. Аргумент против файлов: их сложно и накладно менять. Запись одного значения приводит к тому что надо переписать весь файл.
А синхронизация доступа приводит к тому что процессы нещадно тормозят. (По крайней мере это был аргумент Microsoft против ini файлов для системных нужд Windows). Подобные проблемы возникли и у линуксовых приложений и помнится были попытки в KDE сделать аналог регистру на XML. Попытка провалилась на сколько я помню. Следующий этап был создать похожую базу как и у виндовс:
Компактную, эффективную in-memory DB для конфигураций. Я давно уже не занимался Линуксом, про текущее состояние дел не знаю.
В моём случае синхронизировать сильно не требуется и файл можно переписать целиком но это все не аргументы против регистра.
2. Почему нет?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213042
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В одном я думаю у нас консес:
- Исползование .Net ConfigurationManager не подходит по причине неконфигурационных данных.
- Использование одного файла XML мерзко для обновлений.
Относительно других вариантов:
Оба имеет право на жизнь, оба в меру эффективны и засоряют диск. оба для пользователя не очевидны.
Не плохо если бы микрософт ввела стандарт для программ и их веток в регистре и при долгом отсутствии чтений чистила бы регистр автоматом.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213120
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TAxeleron1) Доступ к реестру гораздо затратен по времени и ресурсам по сравнению с тем же ini или xml. Можете сами протестить и замерять по общим параметрам, если интересно.
Давай от обратного, т.е. xml: открыть, прочитать в память своего процесса, распарсить - это не затратно?
Менее затратно, чем открывать сердцевину БД операционки. Да и с регистром работают через кэш, а в данном случае кэширование исключено.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213122
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronМенее затратно, чем открывать сердцевину БД операционки
сердцевина операционки - это ядро(kernel)
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213123
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronAxeleronНу и еще один ссыль , где вряд ли пометят неверный ответ как правильный.
Заметьте, следующий ответ получил больше ляйков.
Но я сам не рассматриваю аргумент "так думает большинство" всерьёз и никому не рекомендую. Иначе земля до сих пор осталась бы плоской и центром вселенной.
Проблема в том, что если многие так делают, это еще не означает, что правильно...

mikron1.А. Самое забавное что сами люди майкросовта сделала эмуляцию API для INI файлов и перенаправила их в регистр.
1.Б. Скорость. Смею предположить время записи INI < Registry < XML
Это все легко проверяется тестом и прототипированием.

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

mikron2. Почему нет?
Да делайте, почему и в правду нет. Можно подумать много идеально написанного софта написано? Тем более в России...
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213124
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилAxeleronМенее затратно, чем открывать сердцевину БД операционки
сердцевина операционки - это ядро(kernel)
Ничего не вижу, ничего не понимаю? Написано же, что БД. Ну да ладно, ты как всегда за хвост уцепился.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213126
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я считаю, что достаточно привел ссылей на MSDN, чтобы показать почему плохо использовать Registry для динамических данных. Ну а далее только опытным путем проверить скорость и затраты на работу с ним. Кто проверял, тот знает... Кто не проверял, тот настаивает, что это круто и правильно. Увы...
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213127
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя Х3, знаю, что большинство старших девов забивает на перформанс, а потом с круглыми глазами удивляются почему медленно работает и ресурсов докуа жрет. Классика.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213128
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronНу да ладно, ты как всегда за хвост уцепился.
я уцепился не за хвост, а за очередную порцию трэша
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213131
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилAxeleronНу да ладно, ты как всегда за хвост уцепился.
я уцепился не за хвост, а за очередную порцию трэша
Трэш тебя ждет на ПТ
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213132
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил, не моя вина, что ТСу ты пытаешь втемяшить говнорешение, причем необоснованное.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213133
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил, если считаешь иначе, докажи обоснованно, а не путем склочничества. Жду доказательств в виде ссылок на достоверные источники. Иначе, это просто горлопанство.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213183
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronМои доводы против использования реестра:
1) Доступ к реестру гораздо затратен по времени и ресурсам по сравнению с тем же ini или xml. Можете сами протестить и замерять по общим параметрам, если интересно.


Из ответа можно сделать вывод, что вы проверяли. Давайте замерим вместе? Вы пишете тест для вами предпочитаемого решения, а я для регистра. Результаты тут сравним.
Это справедливо делит работу и каждый заинтересован в лучшем и корректном результате.
Идёт?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213187
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю два теста:

1. Чтение МРУ. результат список из строк упорядоченный по времени доступа.
В списке 40 значений, каждое значение путь к файлу содержащий русские буквы.
Тест выполняется 1000 раз.

2. Обновление МРУ. в списке меняется одно из значений.
с вероятностью 40 процентов в МРУ добавляется существующее значение (поднимается на вершину списка)
с вероятностью 60 процентов в МРУ добавляется новое значение.
Запись МРУ списка происходит после каждого обновления.
Тест выполняется 1000 раз.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213194
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И кстати приглашаю всех отметившився принять участие в "conteste".
Я берусь написать тест для регистра.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213227
zz118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Экипаж интересуется, если использовать реестр, то как быть с таким сценарием:
1. Выкатываем вверсию А.
2. Реестр заполняется ключами.
3. Выкатываем версию Б, в которой набор ключей уже поменялся.

Очевидно, нужно делать миграцию. Мне одному кажется, что "интеллектуально" смигрировать ключи в реестре сложнее чем записи в БД или XML в файловой системе?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213232
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему нигде не прозвучало, рекомендации мрикрософта по работе реестром в контексте программирования( хранения данных)???
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213254
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Реестр - пережиток FAT! Когда шаловливые ручки пользователя или кривой винчестер запросто могли испортить любой файл. Вот тогда-то и смогли кое-как защитить несколько файлов реестра

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

==================
По сабжу - все настройки только в БД на сервере. При замене компа у пользователя все реестры и прочие локальные хранилища идут лесом
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213274
zz118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2По сабжу - все настройки только в БД на сервере. При замене компа у пользователя все реестры и прочие локальные хранилища идут лесом

Люто, неистово плюсую
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213276
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zz118Cat2По сабжу - все настройки только в БД на сервере. При замене компа у пользователя все реестры и прочие локальные хранилища идут лесом

Люто, неистово плюсую

А скажите мне где та БД, где Visual Studio хранит то, о чём пишет автор? На каком сервере?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213280
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всё равно вообще-то где хранить.
минимальные трудозатраты - реестр
максимальный результат - СУБД (локально или на сервере - это проблема достойна отдельного срача дискуссии)
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213295
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
skyANAzz118пропущено...


Люто, неистово плюсую

А скажите мне где та БД, где Visual Studio хранит то, о чём пишет автор? На каком сервере?
Я - молодой динамичный компаний и я иду впереди Микрософта! Он только-только начинает хранить настройки в облаке!
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213299
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,

а репликацию с локальным хранилищем - организовал?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213305
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ИзопропилCat2,

а репликацию с локальным хранилищем - организовал?
Локальные хранилища - зло
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213375
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2ИзопропилCat2,

а репликацию с локальным хранилищем - организовал?
Локальные хранилища - зло
а работа в оффлайне?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213379
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ИзопропилCat2пропущено...

Локальные хранилища - зло
а работа в оффлайне?
Тюрьма?Там что, тюремного сервера нет?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213384
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конкурс обьявляется открытым.

По тесту возражения/предложения будут?


Код: 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.
[TestClass]
    public class TestMRUStore
    {
        const int REPEAT_TEST = 1000;

        [TestMethod]
        public void TestFillMRUStore()
        {
            var store = new MRUStore("TestMru", 40);
            var stopwatch = new Stopwatch();
            var random = new Random();
            var basePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\хранилища\\";

            store.Reload();
            stopwatch.Start();
            for (int i = REPEAT_TEST; --i >= 0;)
            {
                string pickItem;
                if (random.NextDouble() <= 0.4 && store.Count > 0)
                {
                    pickItem = store[random.Next(store.Count)];
                }
                else
                {
                    pickItem = string.Concat(basePath, random.Next(), ".txt");
                }
                store.Add(pickItem);
                store.Save();
            }
            stopwatch.Stop();
            Debug.Write("Test completed in " + stopwatch.Elapsed.ToString());
        }

        [TestMethod]
        public void TestLoadMRUStore()
        {
            var store = new MRUStore("TestMru");
            var stopwatch = new Stopwatch();
            stopwatch.Start();
            for (int i = REPEAT_TEST; --i >= 0;)
            {
                store.Reload();
            }
            stopwatch.Stop();
            Debug.Write("Test completed in " + stopwatch.Elapsed.ToString());
        }
    }


...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213387
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2skyANAпропущено...


А скажите мне где та БД, где Visual Studio хранит то, о чём пишет автор? На каком сервере?
Я - молодой динамичный компаний и я иду впереди Микрософта! Он только-только начинает хранить настройки в облаке!
Пользовательские настройки в базе хранили ещё 15 лет назад :) Но у ТСа не тот случай.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213389
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А насчёт "молодой динамичный компаний"... Ну хорошо, не Microsoft... Покажи на каком сервере продукты от JetBrains хранят то, о чём пишет ТС? :)
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213412
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2При замене компа у пользователя все реестры и прочие локальные хранилища идут лесомИ пофиг. Не настолько там ценная информация.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213416
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron,
давай уже сделан что нибудь полезное для повышения энтропии.

Вот мой результат.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213419
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronКонкурс обьявляется открытым.Сделай стандартно: модель + репозитарий, сохраняющий модель в реестре, БД, XML (нужное подчеркнуть). Не понравится - перепишешь репозитарий под хранение в другом месте за 5 минут.

Конкурс объявляется закрытым.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213431
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КСделай стандартно: модель + репозитарий, сохраняющий модель в реестре, БД, XML (нужное подчеркнуть). Не понравится - перепишешь репозитарий под хранение в другом месте за 5 минут.

"Сделать стандартно" это гениальная мысль. Потрать 5 минут и покажи как сделать стандартно на XML?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213444
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronАлексей КСделай стандартно: модель + репозитарий, сохраняющий модель в реестре, БД, XML (нужное подчеркнуть). Не понравится - перепишешь репозитарий под хранение в другом месте за 5 минут.

"Сделать стандартно" это гениальная мысль. Потрать 5 минут и покажи как сделать стандартно на XML? Практическое руководство. Запись данных объекта в XML-файл

Ссылка на практическое руководство по чтению XML-файлов нужна? :-)
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213452
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Изопропилпропущено...

а работа в оффлайне?
Тюрьма?Там что, тюремного сервера нет?
localhost есть
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213456
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кmikronпропущено...

"Сделать стандартно" это гениальная мысль. Потрать 5 минут и покажи как сделать стандартно на XML? Практическое руководство. Запись данных объекта в XML-файл

Ссылка на практическое руководство по чтению XML-файлов нужна? :-)
И это всё что может? бездарность, геть от седа, шелкать семки и в носу ковырять. Так и просрёш всё жизнь на пустословие.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213458
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас отсеется семена от плевел.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213462
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если кто нибудь напишет для XML выставлю свой код для всех.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213465
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronЕсли кто нибудь напишет для XML выставлю свой код для всех.Попробуй денег предложить. :-)
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213477
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronЕсли кто нибудь напишет для XML выставлю свой код для всех.Впрочем, почему бы и нет. :-)

Идеальный код
Код: 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.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
using System;
using System.Collections.Generic;
 
namespace SspMain
{
    public class SettingsModel
    {
        public SettingsSection RootSection { get; set; }
 
        public SettingsModel()
        {
            RootSection = new SettingsSection();
        }
    }
 
    public class SettingsSection
    {
        public SettingsValueDictionary Values { get; set; }
        public SettingsSectionDictionary Sections { get; set; }
 
        public SettingsSection()
        {
            Values = new SettingsValueDictionary();
            Sections = new SettingsSectionDictionary();
        }
    }
 
    public partial class SettingsSectionDictionary : Dictionary<string, SettingsSection>
    {
        public SettingsSectionDictionary()
            : base(StringComparer.InvariantCultureIgnoreCase)
        { }
    }
 
    public partial class SettingsValueDictionary : Dictionary<string, object>
    {
        public SettingsValueDictionary()
            : base(StringComparer.InvariantCultureIgnoreCase)
        { }
    }
}

//----------------------------------------------

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
 
namespace SspMain
{
    public class SettingsStorage
    {
        #region Default Storage
 
        public static SettingsStorage I
        {
            get
            {
                return Singleton<SettingsStorage>.GetInstance(
                    () => new SettingsStorage
                    {
                        FilePath = Path.Combine(ApplicationInfo.ApplicationDataFolder, "settings.xml")
                    }
                );
            }
        }
 
        #endregion
 
        #region Model Management
 
        public string FilePath { get; set; }
 
        object LockObj = new object();
 
        SettingsXmlSerializer Serializer = new SettingsXmlSerializer();        
 
        bool IsModelChanged;
 
        SettingsModel Model
        {
            get
            {
                if (_model == null)
                    Load();
 
                return _model;
            }
        }
 
        SettingsModel _model;
 
        public void Load()
        {
            lock (LockObj)
            {
                if (File.Exists(FilePath))
                    Log.ExecuteWithLog(() => _model = Serializer.Deserialize(FilePath));
 
                if (_model == null)
                    _model = new SettingsModel();
 
                IsModelChanged = false;
            }
        }
 
        public void Save()
        {
            lock (LockObj)
                if (IsModelChanged)
                {
                    Serializer.Serialize(FilePath, Model);
                    IsModelChanged = false;
                }
        }
 
        #endregion
 
        #region Section Management
 
        SettingsSection GetOrCreateSectionByPath(string[] sectionPath)
        {
            var result = Model.RootSection;
            foreach (var sectionName in sectionPath)
                result = GetOrCreateChildSection(result, sectionName);
            return result;
        }
 
        SettingsSection GetOrCreateChildSection(SettingsSection parentSection, string sectionName)
        {
            SettingsSection result;
            if (parentSection.Sections.TryGetValue(sectionName, out result) == false)
            {
                result = new SettingsSection();
                parentSection.Sections.Add(sectionName, result);
            }
            return result;
        }
 
        SettingsSection GetSectionByPath(string[] sectionPath)
        {
            var result = Model.RootSection;
            foreach (var sectionName in sectionPath)
            {
                result = result.Sections.GetValueOrDefault(sectionName);
                if (result == null)
                    return null;
            }
            return result;
        }
 
        #endregion
 
        #region Value Management
 
        public bool RemoveValue(SettingsStorageKey key)
        {
            lock (LockObj)
            {
                var section = GetSectionByPath(key.SectionPath);
                if (section == null)
                    return false;
 
                bool result = section.Values.Remove(key.ValueName);
                if (result)
                    IsModelChanged = true;
 
                return result;
            }
        }
 
        public void SetValue(SettingsStorageKey key, object value)
        {
            lock (LockObj)
            {
                var storageValue = CloneHelper.XmlCloneIfRefType(value);
                GetOrCreateSectionByPath(key.SectionPath).Values[key.ValueName] = storageValue;
                IsModelChanged = true;
            }
        }
 
        public bool TryGetValue(SettingsStorageKey key, Type valueType, out object result)
        {
            lock (LockObj)
            {
                result = null;
 
                var section = GetSectionByPath(key.SectionPath);
 
                if (section == null)
                    return false;
 
                object value;
                if (section.Values.TryGetValue(key.ValueName, out value) == false)
                    return false;
 
                if (CheckValueType(valueType, value))
                {
                    result = CloneHelper.XmlCloneIfRefType(value);
                    return true;
                }
 
                return false;
            }
        }
 
        bool CheckValueType(Type valueType, object value)
        {
            if (value != null)
                return valueType.IsAssignableFrom(value.GetType());
 
            return valueType.CanBeNull();
        }
 
        #endregion
 
        #region Value Management Extension
 
        public bool TryGetValue<T>(SettingsStorageKey key, out T result)
        {
            object value;
 
            if (TryGetValue(key, typeof(T), out value))
            {
                result = (T)value;
                return true;
            }
 
            result = default(T);
            return false;
        }
 
        public T GetValueOrDefault<T>(SettingsStorageKey key, T defaultValue = default(T))
        {
            object result;
 
            if (TryGetValue(key, typeof(T), out result))
                return (T)result;
 
            return defaultValue;
        }
 
        #endregion
    }
}

//----------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace SspMain
{
    public class SettingsStorageKey
    {
        public string[] SectionPath { get; private set; }
 
        public string ValueName { get; private set; }
 
        public SettingsStorageKey(string[] sectionPath, string valueName)
        {
            if (sectionPath == null)
                throw new ArgumentNullException("sectionPath");
 
            if (sectionPath.Length == 0)
                throw new ArgumentException("sectionPath.Length == 0");
 
            if (sectionPath.Any(v => string.IsNullOrWhiteSpace(v)))
                throw new ArgumentException("sectionPath.Any(v => string.IsNullOrWhiteSpace(v))");
 
            if (string.IsNullOrWhiteSpace(valueName))
                throw new ArgumentException("string.IsNullOrWhiteSpace(valueName)");
 
            SectionPath = sectionPath;
            ValueName = valueName;
        }
    }
}

//----------------------------------------------

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
 
namespace SspMain
{
    class SettingsXmlSerializer
    {
        XmlSerializer Serializer = new XmlSerializer(typeof(SettingsModel));
 
        public void Serialize(string filePath, SettingsModel model)
        {
            var dir = Path.GetDirectoryName(filePath);
 
            if (string.IsNullOrEmpty(dir) == false && Directory.Exists(dir) == false)
                Directory.CreateDirectory(dir);
 
            var tempFilePath = filePath + ".temp.xml";
 
            if (File.Exists(tempFilePath))
                File.Delete(tempFilePath);
 
            using (var xw = new XmlTextWriter(tempFilePath, Encoding.GetEncoding(1251)))
            {
                xw.Formatting = Formatting.Indented;
                Serializer.Serialize(xw, model);
            }
 
            if (File.Exists(filePath))
                File.Delete(filePath);
 
            File.Move(tempFilePath, filePath);
        }
 
        public SettingsModel Deserialize(string filePath)
        {
            try
            {
                using (var xr = new XmlTextReader(filePath))
                    return (SettingsModel)Serializer.Deserialize(xr);
            }
            catch (Exception e)
            {
                throw new InfoException("Ошибка при чтении файла хранилища настроек.", e);
            }
        }
    }
 
    public partial class SettingsSectionDictionary : IXmlSerializable
    {
        #region IXmlSerializable Members
 
        const string E_Item = "Item";
        const string A_Key = "Key";
 
        void IXmlSerializable.ReadXml(XmlReader reader)
        {
            if (reader.IsEmptyElement)
            {
                reader.Read();
                return;
            }
 
            var vs = GetValueSerializer();
 
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.EndElement)
                {
                    reader.ReadEndElement();
                    break;
                }
 
                if (reader.NodeType == XmlNodeType.Element && reader.Name == E_Item)
                {
                    string key = reader[A_Key];
 
                    reader.Read();
                    var value = (SettingsSection)vs.Deserialize(reader);
                    reader.ReadEndElement();
 
                    Add(key, value);
                }
            }
        }
 
        void IXmlSerializable.WriteXml(XmlWriter writer)
        {
            var vs = GetValueSerializer();
 
            foreach (var item in this)
            {
                writer.WriteStartElement(E_Item);
                writer.WriteAttributeString(A_Key, item.Key);
                vs.Serialize(writer, item.Value);
                writer.WriteEndElement();
            }
        }
 
        XmlSerializer GetValueSerializer()
        {
            return new XmlSerializer(typeof(SettingsSection));
        }
 
        XmlSchema IXmlSerializable.GetSchema()
        {
            return null;
        }
 
        #endregion
    }
 
    public partial class SettingsValueDictionary : IXmlSerializable
    {
        #region IXmlSerializable Members
 
        const string E_Item = "Item";
        const string A_Key = "Key";
        const string A_ValueType = "ValueType";
 
        void IXmlSerializable.ReadXml(XmlReader reader)
        {
            if (reader.IsEmptyElement)
            {
                reader.Read();
                return;
            }
 
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.EndElement)
                {
                    reader.ReadEndElement();
                    break;
                }
 
                if (reader.NodeType == XmlNodeType.Element && reader.Name == E_Item)
                {
                    string key = reader[A_Key];
                    string valueType = reader[A_ValueType];
 
                    object value = null;
                    bool hasValue = true;
 
                    if (valueType != null)
                        hasValue = TryDeserializeValue(valueType, reader.ReadInnerXml(), out value);
 
                    if (hasValue)
                        Add(key, value);
                }
            }
        }
 
        bool TryDeserializeValue(string type, string data, out object value)
        {
            try
            {
                var vs = new XmlSerializer(Type.GetType(type));
 
                var doc = new XmlDocument();
                doc.LoadXml(data);
                doc.DocumentElement.SetAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
 
                using (var xr = new XmlNodeReader(doc))
                    value = vs.Deserialize(xr);
 
                return true;
            }
            catch
            {
                value = null;
                return false;
            }
        }
 
        void IXmlSerializable.WriteXml(XmlWriter writer)
        {
            foreach (var item in this)
            {
                writer.WriteStartElement(E_Item);
                writer.WriteAttributeString(A_Key, item.Key);
 
                if (item.Value != null)
                {
                    var valueType = item.Value.GetType();
                    writer.WriteAttributeString(A_ValueType, GetTypeName(valueType));
                    var vs = new XmlSerializer(valueType);
                    vs.Serialize(writer, item.Value);
                }
 
                writer.WriteEndElement();
            }
        }
 
        XmlSchema IXmlSerializable.GetSchema()
        {
            return null;
        }
 
        string GetTypeName(Type type)
        {
            var fullName = type.AssemblyQualifiedName;
            var simpleName = type.FullName + ", " + type.Assembly.GetName().Name;
 
            try
            {
                if (Type.GetType(simpleName) == null)
                    return fullName;
            }
            catch
            {
                return fullName;
            }
 
            return simpleName;
        }
 
        #endregion
    }
}

...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213497
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron
И это всё что может? бездарность, геть от седа, шелкать семки и в носу ковырять. Так и просрёш всё жизнь на пустословие.

Беру свои слова обратно. Как этим пользоваться? Поправь пожалуйста тест для этих классов.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213520
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
skyANAА насчёт "молодой динамичный компаний"... Ну хорошо, не Microsoft... Покажи на каком сервере продукты от JetBrains хранят то, о чём пишет ТС? :)
Они - старый не динамичный. У них унаследованного кода миллион строк!
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213525
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

Пока не компилируется:

Error CS0103 The name 'CloneHelper' does not exist in the current context BssEditor.Test SST.cs 175 Active
Error CS0103 The name 'CloneHelper' does not exist in the current context BssEditor.Test SST.cs 198 Active
Error CS1061 'Type' does not contain a definition for 'CanBeNull' and no extension method 'CanBeNull' accepting a first argument of type 'Type' could be found (are you missing a using directive or an assembly reference?) BssEditor.Test SST.cs 211 Active

Внесённые изменения
Код: 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.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;

namespace SspMain
{
    public class SettingsModel
    {
        public SettingsSection RootSection { get; set; }

        public SettingsModel()
        {
            RootSection = new SettingsSection();
        }
    }

    public class SettingsSection
    {
        public SettingsValueDictionary Values { get; set; }
        public SettingsSectionDictionary Sections { get; set; }

        public SettingsSection()
        {
            Values = new SettingsValueDictionary();
            Sections = new SettingsSectionDictionary();
        }
    }

    public partial class SettingsSectionDictionary : Dictionary<string, SettingsSection>
    {
        public SettingsSectionDictionary()
            : base(StringComparer.InvariantCultureIgnoreCase)
        { }

        // CHANGED:
        internal SettingsSection GetValueOrDefault(string sectionName)
        {
            SettingsSection result;
            return TryGetValue(sectionName ,out result) ? result : null;
        }
    }

    public partial class SettingsValueDictionary : Dictionary<string, object>
    {
        public SettingsValueDictionary()
            : base(StringComparer.InvariantCultureIgnoreCase)
        { }
    }

    public class SettingsStorage
    {
        #region Default Storage

        //CHANGED:
        public static Lazy<SettingsStorage> I = new Lazy<SettingsStorage>(() => new SettingsStorage
        {
            FilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "settings.xml")
        });

        #endregion

        #region Model Management

        public string FilePath { get; set; }

        object LockObj = new object();

        SettingsXmlSerializer Serializer = new SettingsXmlSerializer();

        bool IsModelChanged;

        SettingsModel Model
        {
            get
            {
                if (_model == null)
                    Load();

                return _model;
            }
        }

        SettingsModel _model;

        public void Load()
        {
            lock (LockObj)
            {
                if (File.Exists(FilePath))
                    //CHANGED: Log.ExecuteWithLog(() => _model = Serializer.Deserialize(FilePath));
                    _model = Serializer.Deserialize(FilePath);

                if (_model == null)
                    _model = new SettingsModel();

                IsModelChanged = false;
            }
        }

        public void Save()
        {
            lock (LockObj)
                if (IsModelChanged)
                {
                    Serializer.Serialize(FilePath, Model);
                    IsModelChanged = false;
                }
        }

        #endregion

        #region Section Management

        SettingsSection GetOrCreateSectionByPath(string[] sectionPath)
        {
            var result = Model.RootSection;
            foreach (var sectionName in sectionPath)
                result = GetOrCreateChildSection(result, sectionName);
            return result;
        }

        SettingsSection GetOrCreateChildSection(SettingsSection parentSection, string sectionName)
        {
            SettingsSection result;
            if (parentSection.Sections.TryGetValue(sectionName, out result) == false)
            {
                result = new SettingsSection();
                parentSection.Sections.Add(sectionName, result);
            }
            return result;
        }

        SettingsSection GetSectionByPath(string[] sectionPath)
        {
            var result = Model.RootSection;
            foreach (var sectionName in sectionPath)
            {
                result = result.Sections.GetValueOrDefault(sectionName);
                if (result == null)
                    return null;
            }
            return result;
        }

        #endregion

        #region Value Management

        public bool RemoveValue(SettingsStorageKey key)
        {
            lock (LockObj)
            {
                var section = GetSectionByPath(key.SectionPath);
                if (section == null)
                    return false;

                bool result = section.Values.Remove(key.ValueName);
                if (result)
                    IsModelChanged = true;

                return result;
            }
        }

        public void SetValue(SettingsStorageKey key, object value)
        {
            lock (LockObj)
            {
                var storageValue = CloneHelper.XmlCloneIfRefType(value);
                GetOrCreateSectionByPath(key.SectionPath).Values[key.ValueName] = storageValue;
                IsModelChanged = true;
            }
        }

        public bool TryGetValue(SettingsStorageKey key, Type valueType, out object result)
        {
            lock (LockObj)
            {
                result = null;

                var section = GetSectionByPath(key.SectionPath);

                if (section == null)
                    return false;

                object value;
                if (section.Values.TryGetValue(key.ValueName, out value) == false)
                    return false;

                if (CheckValueType(valueType, value))
                {
                    result = CloneHelper.XmlCloneIfRefType(value);
                    return true;
                }

                return false;
            }
        }

        bool CheckValueType(Type valueType, object value)
        {
            if (value != null)
                return valueType.IsAssignableFrom(value.GetType());

            return valueType.CanBeNull();
        }

        #endregion

        #region Value Management Extension

        public bool TryGetValue<T>(SettingsStorageKey key, out T result)
        {
            object value;

            if (TryGetValue(key, typeof(T), out value))
            {
                result = (T) value;
                return true;
            }

            result = default(T);
            return false;
        }

        public T GetValueOrDefault<T>(SettingsStorageKey key, T defaultValue = default(T))
        {
            object result;

            if (TryGetValue(key, typeof(T), out result))
                return (T) result;

            return defaultValue;
        }

        #endregion
    }
    public class SettingsStorageKey
    {
        public string[] SectionPath { get; private set; }

        public string ValueName { get; private set; }

        public SettingsStorageKey(string[] sectionPath, string valueName)
        {
            if (sectionPath == null)
                throw new ArgumentNullException("sectionPath");

            if (sectionPath.Length == 0)
                throw new ArgumentException("sectionPath.Length == 0");

            if (sectionPath.Any(v => string.IsNullOrWhiteSpace(v)))
                throw new ArgumentException("sectionPath.Any(v => string.IsNullOrWhiteSpace(v))");

            if (string.IsNullOrWhiteSpace(valueName))
                throw new ArgumentException("string.IsNullOrWhiteSpace(valueName)");

            SectionPath = sectionPath;
            ValueName = valueName;
        }
    }
    class SettingsXmlSerializer
    {
        XmlSerializer Serializer = new XmlSerializer(typeof(SettingsModel));

        public void Serialize(string filePath, SettingsModel model)
        {
            var dir = Path.GetDirectoryName(filePath);

            if (string.IsNullOrEmpty(dir) == false && Directory.Exists(dir) == false)
                Directory.CreateDirectory(dir);

            var tempFilePath = filePath + ".temp.xml";

            if (File.Exists(tempFilePath))
                File.Delete(tempFilePath);

            using (var xw = new XmlTextWriter(tempFilePath, Encoding.GetEncoding(1251)))
            {
                xw.Formatting = Formatting.Indented;
                Serializer.Serialize(xw, model);
            }

            if (File.Exists(filePath))
                File.Delete(filePath);

            File.Move(tempFilePath, filePath);
        }

        public SettingsModel Deserialize(string filePath)
        {
            try
            {
                using (var xr = new XmlTextReader(filePath))
                    return (SettingsModel) Serializer.Deserialize(xr);
            }
            catch (Exception e)
            {
                throw new Exception("Ошибка при чтении файла хранилища настроек.", e);
            }
        }
    }

    public partial class SettingsSectionDictionary : IXmlSerializable
    {
        #region IXmlSerializable Members

        const string E_Item = "Item";
        const string A_Key = "Key";

        void IXmlSerializable.ReadXml(XmlReader reader)
        {
            if (reader.IsEmptyElement)
            {
                reader.Read();
                return;
            }

            var vs = GetValueSerializer();

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.EndElement)
                {
                    reader.ReadEndElement();
                    break;
                }

                if (reader.NodeType == XmlNodeType.Element && reader.Name == E_Item)
                {
                    string key = reader[A_Key];

                    reader.Read();
                    var value = (SettingsSection) vs.Deserialize(reader);
                    reader.ReadEndElement();

                    Add(key, value);
                }
            }
        }

        void IXmlSerializable.WriteXml(XmlWriter writer)
        {
            var vs = GetValueSerializer();

            foreach (var item in this)
            {
                writer.WriteStartElement(E_Item);
                writer.WriteAttributeString(A_Key, item.Key);
                vs.Serialize(writer, item.Value);
                writer.WriteEndElement();
            }
        }

        XmlSerializer GetValueSerializer()
        {
            return new XmlSerializer(typeof(SettingsSection));
        }

        XmlSchema IXmlSerializable.GetSchema()
        {
            return null;
        }

        #endregion
    }

    public partial class SettingsValueDictionary : IXmlSerializable
    {
        #region IXmlSerializable Members

        const string E_Item = "Item";
        const string A_Key = "Key";
        const string A_ValueType = "ValueType";

        void IXmlSerializable.ReadXml(XmlReader reader)
        {
            if (reader.IsEmptyElement)
            {
                reader.Read();
                return;
            }

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.EndElement)
                {
                    reader.ReadEndElement();
                    break;
                }

                if (reader.NodeType == XmlNodeType.Element && reader.Name == E_Item)
                {
                    string key = reader[A_Key];
                    string valueType = reader[A_ValueType];

                    object value = null;
                    bool hasValue = true;

                    if (valueType != null)
                        hasValue = TryDeserializeValue(valueType, reader.ReadInnerXml(), out value);

                    if (hasValue)
                        Add(key, value);
                }
            }
        }

        bool TryDeserializeValue(string type, string data, out object value)
        {
            try
            {
                var vs = new XmlSerializer(Type.GetType(type));

                var doc = new XmlDocument();
                doc.LoadXml(data);
                doc.DocumentElement.SetAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");

                using (var xr = new XmlNodeReader(doc))
                    value = vs.Deserialize(xr);

                return true;
            }
            catch
            {
                value = null;
                return false;
            }
        }

        void IXmlSerializable.WriteXml(XmlWriter writer)
        {
            foreach (var item in this)
            {
                writer.WriteStartElement(E_Item);
                writer.WriteAttributeString(A_Key, item.Key);

                if (item.Value != null)
                {
                    var valueType = item.Value.GetType();
                    writer.WriteAttributeString(A_ValueType, GetTypeName(valueType));
                    var vs = new XmlSerializer(valueType);
                    vs.Serialize(writer, item.Value);
                }

                writer.WriteEndElement();
            }
        }

        XmlSchema IXmlSerializable.GetSchema()
        {
            return null;
        }

        string GetTypeName(Type type)
        {
            var fullName = type.AssemblyQualifiedName;
            var simpleName = type.FullName + ", " + type.Assembly.GetName().Name;

            try
            {
                if (Type.GetType(simpleName) == null)
                    return fullName;
            }
            catch
            {
                return fullName;
            }

            return simpleName;
        }

        #endregion
    }
}

...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213542
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хранилище для Registry


Код: 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.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
using System.Security.AccessControl;
using BSS.Common;
using Microsoft.Win32;

namespace BSS.Editor
{
    public class MRUStore : IReadOnlyList<string>, ICollection<string>
    {
        private const string MRU_KEY_PREFIX = "MRU";

        private static string _regkeyBasePath;

        private string _name;

        private int _usedEntries;
        private int _maxEntries;
        private int _updateEntries;
        private int _lastUpdateNo;
        private STuple<int, int, string>[] _mru;              // Update number, key number, value

        public MRUStore(string name)
            : this(name, 0)
        { }

        public MRUStore(string name, int maxEntries)
        {
            if (_regkeyBasePath == null)
            {
                string companyName = null;
                string productName = null;
                var runAssembly = Assembly.GetEntryAssembly();
                if (runAssembly != null)
                {
                    var namespaceParts = runAssembly.EntryPoint.DeclaringType.Namespace.Split('.');
                    var companyAttr = runAssembly.GetCustomAttribute<AssemblyCompanyAttribute>();
                    if (companyAttr != null && !string.IsNullOrWhiteSpace(companyAttr.Company))
                    {
                        companyName = companyAttr.Company;

                    }
                    else if (namespaceParts.Length > 0)
                    {
                        companyName = namespaceParts[0];
                    }
                    var productAttr = runAssembly.GetCustomAttribute < AssemblyProductAttribute>();
                    if (productAttr != null && !string.IsNullOrWhiteSpace(productAttr.Product))
                    {
                        productName = productAttr.Product;
                    }
                    else if (namespaceParts.Length > 1)
                    {
                        productName = namespaceParts[1];
                    }
                }
                _regkeyBasePath = string.Concat("Software\\", 
                    companyName ?? "unknown", "\\", 
                    productName ?? AppDomain.CurrentDomain.FriendlyName, "\\");
                _regkeyBasePath = string.Concat("Software\\",
                    companyName ?? "BSS", "\\",
                    productName ?? "BssEdit", "\\");
            }
            _name = name;
            _maxEntries = maxEntries;
        }

        public void Reload()
        {
            var mruList = new List<STuple<int, int, string>>();
            using (var mruRootKey = Registry.CurrentUser.OpenSubKey(_regkeyBasePath + _name, RegistryKeyPermissionCheck.ReadSubTree, RegistryRights.ReadKey))
            {
                if (mruRootKey != null)
                {
                    int itemNo;
                    int updateNo;
                    foreach (var keyName in mruRootKey.GetValueNames())
                    {
                        if (!keyName.StartsWith(MRU_KEY_PREFIX)
                        || !int.TryParse(keyName.Substring(MRU_KEY_PREFIX.Length), NumberStyles.None, CultureInfo.InvariantCulture, out itemNo)
                        || mruRootKey.GetValueKind(keyName) != RegistryValueKind.String)
                            continue;

                        var keyValue = mruRootKey.GetValue(keyName) as string;
                        if (keyValue == null)
                            continue;
                        var d = keyValue.IndexOf(':');
                        if (d <= 0 || !int.TryParse(keyValue.Substring(0, d), NumberStyles.None, CultureInfo.InvariantCulture, out updateNo))
                            continue;
                        mruList.Add(STuple.New(updateNo, itemNo, keyValue.Substring(d + 1)));
                        _lastUpdateNo = Math.Max(_lastUpdateNo, updateNo);
                    }
                }
            }
            _usedEntries = mruList.Count;
            if(_maxEntries <= 0)
                _maxEntries = _usedEntries;
            _mru = new STuple<int, int, string>[Math.Max(_maxEntries, _usedEntries)];
            mruList.Sort();
            mruList.CopyTo(_mru);
            _updateEntries = 0;
        }

        public void Save()
        {
            using (var mruRootKey = Registry.CurrentUser.CreateSubKey(_regkeyBasePath + _name, RegistryKeyPermissionCheck.ReadWriteSubTree))
            {
                // delete removed keys
                if (_usedEntries < _mru.Length)
                {
                    for (int i = _usedEntries; i < _mru.Length; ++i)
                    {
                        var t = _mru[i];
                        if (t.Item2 == 0)
                            break;
                        mruRootKey.DeleteValue(string.Concat(MRU_KEY_PREFIX, _mru[i].Item2.ToString(CultureInfo.InvariantCulture)));
                        _mru[i] = STuple.New(0, 0, (string) null);
                    }
                }
                // shrink used keys
                if (_maxEntries < _usedEntries)
                {
                    for (int i = _usedEntries - _maxEntries; --i >= 0;)
                    {
                        mruRootKey.DeleteValue(string.Concat(MRU_KEY_PREFIX, _mru[i].Item2.ToString(CultureInfo.InvariantCulture)));
                    }
                    Array.Copy(_mru, _usedEntries - _maxEntries, _mru, 0, _maxEntries);
                    _usedEntries = _maxEntries;
                    _updateEntries = Math.Min(_updateEntries, _maxEntries);
                }
                if (_maxEntries < _mru.Length)
                {
                    Array.Resize(ref _mru, _maxEntries);
                }
                // Update entries
                for (int i = _usedEntries - _updateEntries; i < _usedEntries; ++i)
                {
                    var t = _mru[i];
                    mruRootKey.SetValue(
                        string.Concat(MRU_KEY_PREFIX, t.Item2.ToString(CultureInfo.InvariantCulture)),
                        string.Concat(t.Item1.ToString(CultureInfo.InvariantCulture), ":", t.Item3),
                        RegistryValueKind.String);
                }
                _updateEntries = 0;
            }
        }

        public int Count
        {
            get
            {
                return _usedEntries;
            }
        }

        public string this[int index]
        {
            get
            {
                return _mru[_usedEntries - index - 1].Item3;
            }
        }

        public IEnumerator<string> GetEnumerator()
        {
            for (int i = _usedEntries; --i >= 0;)
                yield return _mru[i].Item3;
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return this.GetEnumerator();
        }

        public bool IsReadOnly
        {
            get
            {
                return false;
            }
        }

        private int IndexOf(string value)
        {
            for (int i = _usedEntries; --i >= 0;)
                if (value == _mru[i].Item3)
                    return i;
            return -1;
        }

        public bool Contains(string item)
        {
            return this.IndexOf(item) >= 0;
        }

        public void Add(string item)
        {
            int itemNo;
            if (_lastUpdateNo > 99999)
            {
                for (int i = _usedEntries; --i >= 0;)
                {
                    _mru[i].Item1 = i;
                }
                _lastUpdateNo = _usedEntries;
                _updateEntries = _usedEntries;
            }
            var pos = this.IndexOf(item);
            if (pos < 0 && _usedEntries < _maxEntries)
            {
                itemNo = _mru[_usedEntries].Item2;
                if(itemNo == 0)
                {
                    do { ++itemNo; } while (Array.FindIndex(_mru, 0, _usedEntries, t => t.Item2 == itemNo) >= 0);
                }
                _mru[_usedEntries++] = STuple.New(++_lastUpdateNo, itemNo, item);
                ++_updateEntries;
                return;
            }
            if(pos < 0)
            {
                pos = 0;
            }
            if (pos + _updateEntries < _usedEntries)
            {
                ++_updateEntries;
            }
            itemNo = _mru[pos].Item2;
            if (pos < _usedEntries - 1)
            {
                Array.Copy(_mru, pos + 1, _mru, pos, _usedEntries - 1 - pos);
            }
            _mru[_usedEntries - 1] = STuple.New(++_lastUpdateNo, itemNo, item);
        }

        public bool Remove(string item)
        {
            var pos = this.IndexOf(item);
            if (pos < 0)
                return false;
            if (pos + _updateEntries > --_usedEntries)
            {
                --_updateEntries;
            }
            if (pos == _usedEntries)
            {
                _mru[_usedEntries].Item3 = null;
            }
            else
            {
                var t = _mru[pos];
                Array.Copy(_mru, pos + 1, _mru, pos, _usedEntries - pos);
                _mru[_usedEntries] = STuple.New(t.Item1, t.Item2, (string) null);
            }
            return true;
        }

        public void Clear()
        {
            for (int i = _usedEntries; --i >= 0;)
                _mru[i].Item3 = null;
            _usedEntries = _updateEntries = 0;
        }

        public void CopyTo(string[] array, int arrayIndex)
        {
            for (int i = _usedEntries; --i >= 0;)
                array[arrayIndex++] = _mru[i].Item3;
        }
    }
}

...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213589
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronАлексей К,

Пока не компилируется:

Error CS0103 The name 'CloneHelper' does not exist in the current context BssEditor.Test SST.cs 175 Active
Error CS0103 The name 'CloneHelper' does not exist in the current context BssEditor.Test SST.cs 198 Active
Error CS1061 'Type' does not contain a definition for 'CanBeNull' and no extension method 'CanBeNull' accepting a first argument of type 'Type' could be found (are you missing a using directive or an assembly reference?) BssEditor.Test SST.cs 211 Active
Недостающее
Код: 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.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace SspMain
{
    public static class CloneHelper
    {
        public static T XmlClone<T>(T src)
            where T : class
        {
            if (src == null)
                return null;

            var serializer = new XmlSerializer(src.GetType());
            var doc = new XmlDocument();

            using (var xw = doc.CreateNavigator().AppendChild())
                serializer.Serialize(xw, src);

            using (var xr = new XmlNodeReader(doc))
                return (T)serializer.Deserialize(xr);
        }

        public static object XmlCloneIfRefType(object value)
        {
            if
            (
                value != null &&
                value.GetType().IsValueType == false &&
                (value is string) == false
            )
                return XmlClone(value);

            return value;
        }
    }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace SspMain
{
    public static class TypeHelper
    {
        public static Type GetGenericTypeDefinitionEx(this Type type)
        {
            return type.IsGenericType ? type.GetGenericTypeDefinition() : null;
        }

        public static bool CanBeNull(this Type type)
        {
            return
                type.IsValueType == false ||
                type.GetGenericTypeDefinitionEx() == typeof(Nullable<>);
        }
    }
}


...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213681
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КmikronАлексей К,

Пока не компилируется:

Error CS0103 The name 'CloneHelper' does not exist in the current context BssEditor.Test SST.cs 175 Active
Error CS0103 The name 'CloneHelper' does not exist in the current context BssEditor.Test SST.cs 198 Active
Error CS1061 'Type' does not contain a definition for 'CanBeNull' and no extension method 'CanBeNull' accepting a first argument of type 'Type' could be found (are you missing a using directive or an assembly reference?) BssEditor.Test SST.cs 211 Active


позитивные момент - Компиулируется.
Код не МРУ список вообще и не решает задачи. Потому результаты тоже не надёжны.

Изменённый тест:


Код: 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.
    [TestClass]
    public class TestXMLStore
    {
        const int REPEAT_TEST = 1000;
        static string[] PATH = new [] { "TestMru" };

        [TestMethod]
        public void TestFillMRUStore()
        {
            var store = SettingsStorage.I.Value;
            var stopwatch = new Stopwatch();
            var random = new Random();
            var basePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\хранилища\\";

            store.Load();
            stopwatch.Start();
            for (int i = REPEAT_TEST; --i >= 0;)
            {
                string pickItem = null;
                var key = new SettingsStorageKey(PATH, random.Next(40).ToString());
                if (random.NextDouble() <= 0.4)
                {
                    store.TryGetValue<string>(key, out pickItem);
                }
                if(pickItem == null)
                {
                    pickItem = string.Concat(basePath, random.Next(), ".txt");
                }
                store.SetValue(key, pickItem);
                store.Save();
            }
            stopwatch.Stop();
            Debug.Write("Test completed in " + stopwatch.Elapsed.ToString());
        }

        [TestMethod]
        public void TestLoadMRUStore()
        {
            var store = SettingsStorage.I.Value;
            var stopwatch = new Stopwatch();
            stopwatch.Start();
            for (int i = REPEAT_TEST; --i >= 0;)
            {
                store.Load();
            }
            stopwatch.Stop();
            Debug.Write("Test completed in " + stopwatch.Elapsed.ToString());
        }
    }



Результат:
TestFillMRUStore - 3 sec.
TestLoadMRUStore - 1 sec.
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213751
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

все что касается пользователя без роуминга в реестре, с роумингом в конфиг файле, общее для всех в БД
Структура в реестре
ВИПРОС
--Конфигурация
----БД
------Задача
----------Юзер
---------------Роль в конфиге
----------------------Задача
--------------------------Форма или еще что
-----------------------------Элементы <->
---------------------------------Настройки
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213754
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это все работает пулей, никаких проблем (проблемы при их применении, потому там много чего делается Lazy)
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213843
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Settings и app.config уже не True?
...
Рейтинг: 0 / 0
Сохранение пользовательской конфигурации.
    #39213864
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

в app - только то что касается приложения {ключи, коннекшны, провайдеры,...,рантаймы и т.д.}
в usersettings - {user + приложение}
в реестре - то что не жалко (в основном внешний вид форм, для разных БД, ролей и т.д.)
...
Рейтинг: 0 / 0
127 сообщений из 127, показаны все 6 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сохранение пользовательской конфигурации.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]