Registry vs. .ini?

tortilla
Уже с Приветом
Posts: 1204
Joined: 28 May 2002 05:23
Location: California

Registry vs. .ini?

Post by tortilla »

Опытные программисты- посоветуите, что лучше испол’зоват’ для
xранения и использования информатсии. Мне надо сохранять и читать ,
последние n-records которые мои m-user accessed recently.
User avatar
SuperMax
Уже с Приветом
Posts: 1309
Joined: 03 Nov 1999 10:01
Location: West End, Surrey, England

Post by SuperMax »

[quote:89d36e095c]Мне надо сохранять и читать ,
последние n-records которые мои m-user accessed recently[/quote:89d36e095c]

В данном случае лучше всего подходит реестр. У каждого юзера будут в его HKEY_CURRENT_USER находиться именно его установки. Причем недоступные другим юзерам, что всегда правильно. :) Причем Вам для этого не придется прилагать усилий по идентификации юзера. Ключи могут иметь вид, скажем, Record1, Record2, ... (REG_SZ), и один RecCount (REG_DWORD). Надеюсь, что каждый Record разумно ограничивается по длине?

Вообще реестр имеет свои преимущества. И является рекомендованным способом хранения program-specific information - чисел и строк, длину (и количество) которых можно легко ограничить сверху по смыслу разумным не слишком большим числом.

Тем не менее в него не все стоит писать. Не надо хранить объемные данные, для этого лучше подходит файл. Скажем, если бы надо было хранить именно тексты последних N файлов, то надо было бы в реестр только писать имена последних файлов, а сами тексты держать в файлах, скажем, в программной директории. Хранить то, длина чего заранее непредсказуема и может быть очень большой, тоже не дело. Скажем, базу данных :) как в MS RADIUS.
tortilla
Уже с Приветом
Posts: 1204
Joined: 28 May 2002 05:23
Location: California

Post by tortilla »

Spasibo.
Мне надо отразить при входе в combobox последние номера (скажем,
record ID) которые етот конкретнии user accessed . Чтобы ему, етому useru
не прошлось думать и вспоминать ети самие номера. Причем, надо хранить только полседние 5 номеров, а если 6-ои, то пиcать поверх первого.
Niky
Уже с Приветом
Posts: 550
Joined: 31 Mar 2000 10:01
Location: Moscow --> Baltimore, MD

Post by Niky »

А юзеры-то какие? Виндоусные?
tortilla
Уже с Приветом
Posts: 1204
Joined: 28 May 2002 05:23
Location: California

Post by tortilla »

[quote:10d613b0c7="Niky"]А юзеры-то какие? Виндоусные?[/quote:10d613b0c7]
Виндоусные и очень тупые
Niky
Уже с Приветом
Posts: 550
Joined: 31 Mar 2000 10:01
Location: Moscow --> Baltimore, MD

Post by Niky »

Тогда точно в registry, SuperMax вам все уже рассказал.
StarCounter
Уже с Приветом
Posts: 340
Joined: 09 Nov 2000 10:01
Location: Seattle (From Omsk)

Post by StarCounter »

[quote:f5fb153344="tortilla"][quote:f5fb153344="Niky"]А юзеры-то какие? Виндоусные?[/quote:f5fb153344]
Виндоусные и очень тупые[/quote:f5fb153344]

Come on!!!!!
Don't forget where is the money coming into your pocket from. :nono#:
It looks like you're too young......
Почему я уехал в Америку?... - Because of the life style!!!
tortilla
Уже с Приветом
Posts: 1204
Joined: 28 May 2002 05:23
Location: California

Post by tortilla »

[

It looks like you're too young......[/quote]

I wish :roll:
User avatar
SuperMax
Уже с Приветом
Posts: 1309
Joined: 03 Nov 1999 10:01
Location: West End, Surrey, England

Post by SuperMax »

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

Ключ вашей программы в реестре имеет вид:
HKEY_LOCAL_MACHINE\Software\Your Company\Your Product и
HKEY_CURRENT_USER\Software\Your Company\Your Product

Если планируется несколько версий и вы рассчитываете на совместимость, то будут еще подключи, например ...\1.0 и ...\2.0 - куда вы будете писать version-dependent data. А в корне вашего ключа можно писать вещи, от версии не зависящие.

Если ключей много, организуйте их по "фолдерам" - подключам. Скажем, ...\Layout, ...\TCP...
Их можно вкладывать друг в друга. Потом будет удобно смотреть и Вам и пользователям.

Советы из личного опыта:
1) Напишите процедуру работы с реестром, чтобы было потом удобно сохранять.
2) Используйте строковые константы для обозначения имен ключей реестра, и употребляйте их как при чтении, так и при записи в реестр. (Вам потом может захотеться сменить имя ключа, так чтобы это делалось лишь в одном месте - строковой константе). В ресурсы лучше не писать, имена ключей не должны быть локализуемы.
3) Таким же образом опишите значения для ключей по умолчанию, и по возможности по выходу из программы, штатному или аварийному, и если есть такое, по выходу из конфигурационного диалога, записывайте новые значения. Хуже нет, когда есть default на случай отсутствия ключа, но его в реестре не найти и приходится гадать. Лучше иметь явно.
4) Под 2) и 3) лучше сделать отдельный файл .c и .h, если вы пользуете Си, или их аналоги - это уже для модульности.

В Вашем конкретном случае, допустим, в HKEY_CURRENT_USER\Software\Your Company\Your Product\LastUsed можно делать ключи RecordNum1 - RecordNum5 типа REG_DWORD и туда и писать. А если нужно переменное число номеров записей в истории, то добавьте RecordCount тоже REG_DWORD. Все в Ваших руках. :)
tortilla
Уже с Приветом
Posts: 1204
Joined: 28 May 2002 05:23
Location: California

Post by tortilla »

я знау как ето делать в регистрe, но мои старшии товарищ c4итает что .ini фаил будет легче написать и использовать. Я хочу понять его motivation. То ли он лучше знает .ини, то ли прежняя работа с ассемблер закалила его?
User avatar
awaken
Уже с Приветом
Posts: 3211
Joined: 20 Mar 2002 10:01
Location: Chelyabinsk->Rain City,WA->Moscow

Post by awaken »

[quote:70ada67d2a="tortilla"]я знау как ето делать в регистрe, но мои старшии товарищ c4итает что .ini фаил будет легче написать и использовать. Я хочу понять его motivation. То ли он лучше знает .ини, то ли прежняя работа с ассемблер закалила его?[/quote:70ada67d2a]

сейчас модно использовать везде XML. в том числе для сохранения конфигурационных файлов.
зы. в Delphi (щас меня побьют :-) есть замечательный класс TRegIniFile,
который записывает в реестр так что с точки зрения пользователя выглядит как работа с .INI
можно в и С++ подобный класс-обертку написать который скрывает в себе всю гадость работы с реестром. или еще лучше базовый класс ConfigFile от которого производим IniFile, RegFile и XMLFile
StarCounter
Уже с Приветом
Posts: 340
Joined: 09 Nov 2000 10:01
Location: Seattle (From Omsk)

Post by StarCounter »

[quote:7ece520913="tortilla"]... мои старшии товарищ c4итает что .ini фаил будет легче написать и использовать....[/quote:7ece520913]
И то и другое по сложности примерно одинаково, нового ничего писать не придется, знай себе используй классы/функции, поэтому здесь сложность - это не повод.
Почему я уехал в Америку?... - Because of the life style!!!
MaxSt
Уже с Приветом
Posts: 21835
Joined: 11 Apr 1999 09:01
Location: RU

Post by MaxSt »

Уже есть очень простой и удобный класс: [b:b2d7b8fd44]СRegKey[/b:b2d7b8fd44].
[code:1:b2d7b8fd44]
#include <atlbase.h>

CRegKey key;
key.Open( HKEY_CURRENT_USER, YOUR_KEY_NAME );
key.QueryValue( ... );
key.Close();
[/code:1:b2d7b8fd44]

MaxSt.
War does not determine who is right - only who is left.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

ini файл однозначно лучше если надо будет переноситься по Linux
Кроме того, если запоминаются данные глобальные для Enterprise (с одного сетевого диска многие бользователи запускают некий продукт, который сохраняет свой State, независимо от пользователей)
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
lx_uk
Уже с Приветом
Posts: 376
Joined: 04 Feb 2002 10:01

Re: Registry vs. .ini?

Post by lx_uk »

[quote:983676e060="tortilla"]Опытные программисты- посоветуите, что лучше испол’зоват’ для
xранения и использования информатсии. Мне надо сохранять и читать ,
последние n-records которые мои m-user accessed recently.[/quote:983676e060]

Единственное преимущество ini перед реестром - удобство [u:983676e060]ручного[/u:983676e060] редактирования. Иногода это решающий фактор. В остальном - они полный эквивалент реестра. В том числе и для случая, когда каждый user имеет свои настройки недоступные другим пользователям. В этом случае в профайл каждого user'а просто ложиться дополнительный ini файл, настройки из которого могут перекрывают настройки из главного ini.
User avatar
Bravomail
Уже с Приветом
Posts: 886
Joined: 22 Feb 2001 10:01
Location: Russia, Ufa->Detroit, MI, USA

Re: Registry vs. .ini?

Post by Bravomail »

можно я скажу? ини-файл лучше!!!! потому что если виндоус упадет и вам его придется переустанавливать, ини-файл сохранится. потому что ветку реестра переносить с одного компа на другой можно, но не все "тупые виндоусные" юзеры это умеют. потому что можно все ини-файлы периодически сбрасывать на сидюк в архив, а для реестра это выльется в ручной экспорт веток реестра.
и вообще - посмотрите на МакОС - там ини-файлы (Preferences) хранятся в виде маленьких файликов в отдельной папке, так что при апгрейде, смене версии ОС и прочем ваши настройки не теряются.
реестр - мастдай. ини - рулез форевер.
User avatar
mkrainov
Уже с Приветом
Posts: 1356
Joined: 25 Apr 2001 09:01
Location: Forest Hills (Столица мира)

Post by mkrainov »

Гм...
Насчёт тупых виндовых юзеров.
Я в пятницу поставил домой дополнительный винт. Домашняя Windows XP Home схарчила его, я переписал нужные данные ([i:7f169835dc]дискета это у меня такая на 2Г[/i:7f169835dc]) и вытащил винт...
Включаю компьютер - explorer.exe совершает ошибку. И так кучу раз. Смотрю репорт - dll-ка какая-то сглюкнула. Открываю far, и в момент очередного вылетания explorer.exe удаляю из windows\system32 эту dll-ку. Винда тут же заменяет её на сохранённую и - о чудо! - всё начинает работать.

Но мне стало интересно: а другие пользователи также мучаются? А я тоже тупой виндовый юзер? И где та грань?
Never forgive, never forget
User avatar
SuperMax
Уже с Приветом
Posts: 1309
Joined: 03 Nov 1999 10:01
Location: West End, Surrey, England

Post by SuperMax »

По пунктам.

Dmitry67, но ведь про Линукс речь не шла вовсе!
Кстати, может просветите, а не собрались ли уже под Линукс делать эквивалент реестра? Я что-то на эту тему слышал.

lx_uk, я могу согласиться, что .ini файл легче поправить руками (хотя набрать Start > Run > Regedit.exe и исправить ненамного сложнее). Но я просто УБЕЖДЕН, что редактировать настройки (.ini или реестр, неважно), должна [b:3f391b2dbe]сама программа[/b:3f391b2dbe]! Пользователь вообще не должен копаться в файлах настройки и даже знать их формат, вот в чем my point. Потому что, нормально сделанный GUI еще и ставит ограничения на допустимые значения параметров. А правя настройки, где бы они не были, в INI или в реестре, [b:3f391b2dbe]вручную[/b:3f391b2dbe], юзер может ввести туда чушь (или просто значение out of range), и программе придется разбираться еще и с этим случаем. Потому Майкрософт и сделал реестр, чтобы сделать ручное редактирование настроек outside of unexperienced user scope и побудить писать программы, где GUI просто [b:3f391b2dbe]не дает[/b:3f391b2dbe] установить неправильное значение настройки.

Bravo, должен с вами не согласиться. Бэкап еще никто не отменял. Современные винды (да, можете не соглашаться, но все-таки) вещь достаточно стабильная и не падают просто так, если хардвер в норме! При бэкапе гораздо удобнее просто отметить System State одной галкой и спасать [b:3f391b2dbe]все настройки одним махом[/b:3f391b2dbe], чем спасать десятки, а то и сотни мелких INI файлов, (которые имхо только засоряют диск и делают работу uninstaller-а сложнее). Think Windows, not Linux.

Далее, в реестр можно легко импортнуть .REG файл простым double-click, даже особенно не разбираясь, что там внутри, если вы верите источнику, конечно. Если же у вас INI и большой, вам однозначно придется искать нужные значения, проверять не совпадает ли кусок INI, что вы хотите импортировать, с тем, что у вас уже там написано, + повышенные шансы сделать ошибку при редактировании и опять же испортить INI.

Нет уж, реестр так реестр. Конечно, его не надо абьюзать, как делал это во времена оны, скажем, IRC-клиент VIRC, который скрипты писал в реестр 8O... Вот в данном случае использование текстовых файлов со скриптами было более чем оправдано.

Общих рекомендаций НЕ существует. Все решается исходя из типа и количества данных. Think Windows and year 2002, not DOS/Linux and year 1991.
User avatar
Bravomail
Уже с Приветом
Posts: 886
Joined: 22 Feb 2001 10:01
Location: Russia, Ufa->Detroit, MI, USA

Post by Bravomail »

ну тут вы же сами себе противоречите. :-)

[quote:cd14dbf944="SuperMax"]
Нет уж, реестр так реестр. Конечно, его не надо абьюзать, как делал это во времена оны, скажем, IRC-клиент VIRC, который скрипты писал в реестр 8O... Вот в данном случае использование текстовых файлов со скриптами было более чем оправдано.
[/quote:cd14dbf944]
User avatar
lx_uk
Уже с Приветом
Posts: 376
Joined: 04 Feb 2002 10:01

Post by lx_uk »

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

[quote:df03f89e0f="SuperMax"]
lx_uk, я могу согласиться, что .ini файл легче поправить руками (хотя набрать Start > Run > Regedit.exe и исправить ненамного сложнее).
[/quote:df03f89e0f]

Не [u:df03f89e0f]поправить[/u:df03f89e0f], а [u:df03f89e0f]редактировать[/u:df03f89e0f]! Редактировать, т.е. активно работать со многоми ключами одновмененно, пользуясь стандартным regedit - себя не жалеть. Уж проще сделать экспорт, поправить что нужно в привычном редакторе и импортировать изменения назад.

[quote:df03f89e0f="SuperMax"]

Но я просто УБЕЖДЕН, что редактировать настройки (.ini или реестр, неважно), должна [b:df03f89e0f]сама программа[/b:df03f89e0f]! Пользователь вообще не должен копаться в файлах настройки и даже знать их формат, вот в чем my point. Потому что, нормально сделанный GUI еще и ставит ограничения на допустимые значения параметров. А правя настройки, где бы они не были, в INI или в реестре, [b:df03f89e0f]вручную[/b:df03f89e0f], юзер может ввести туда чушь (или просто значение out of range), и программе придется разбираться еще и с этим случаем.
[/quote:df03f89e0f]

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

[quote:df03f89e0f="SuperMax"]
Потому Майкрософт и сделал реестр, чтобы сделать ручное редактирование настроек outside of unexperienced user scope и побудить писать программы, где GUI просто [b:df03f89e0f]не дает[/b:df03f89e0f] установить неправильное значение настройки.
[/quote:df03f89e0f]

По поводу GUI как средства настройки. Есть один случай, когда такой подход плохо работает. Когда настроек очень много (сотни), они взаимосвязанны между собой, могут перекрывать друг друга и т.п. К тому же GUI сложнее (в разы!) менять для добавления новых параметров.

Мое мнение таково - небольшое кол-во параметров (настраиваемых пользователем) - реестр. Что-то нетривиальное - легкость работы с ini перекрывает опастности порчи ini файлов неправильным редактированием.
MaxSt
Уже с Приветом
Posts: 21835
Joined: 11 Apr 1999 09:01
Location: RU

Post by MaxSt »

[quote:91871c4a61="lx_uk"]По поводу GUI как средства настройки. Есть один случай, когда такой подход плохо работает. Когда настроек очень много (сотни), они взаимосвязанны между собой, могут перекрывать друг друга и т.п.[/quote:91871c4a61]

Какой же подход [b:91871c4a61]хорошо[/b:91871c4a61] работает в этом случае?

MaxSt.
War does not determine who is right - only who is left.
Stick
Уже с Приветом
Posts: 774
Joined: 26 Dec 2000 10:01
Location: Minsk -> Милуоки, США

Post by Stick »

[quote:0326128b7e="MaxSt"][quote:0326128b7e="lx_uk"]По поводу GUI как средства настройки. Есть один случай, когда такой подход плохо работает. Когда настроек очень много (сотни), они взаимосвязанны между собой, могут перекрывать друг друга и т.п.[/quote:0326128b7e]

Какой же подход [b:0326128b7e]хорошо[/b:0326128b7e] работает в этом случае?

MaxSt.[/quote:0326128b7e]
Какой-какой? Это уже не настройки в чистом виде или там данные для заполнения камбабаксов значениями по умолчанию. Это уже база данных со множеством рилeйшеншипс. Oracle, MySQL, SQL Server, whatevere... :mrgreen:
Stick around!
Gorgona
Уже с Приветом
Posts: 865
Joined: 23 Oct 2000 09:01
Location: Ekaterinburg->USA

Post by Gorgona »

[quote:48a35e8a8e]
Какой же подход хорошо работает в этом случае?
[/quote:48a35e8a8e]
Мне больше нравится хранить настройки в бинарном файле и редактировать посредством самой программы, которая должна позаботится о правильности.
А эаставлять юзера бэкапить фрагменты реестра, а потом разбираться, что получилось - это уже мазохизм.
MaxSt
Уже с Приветом
Posts: 21835
Joined: 11 Apr 1999 09:01
Location: RU

Post by MaxSt »

[quote:f6315914da="Stick"]Какой-какой? Это уже не настройки в чистом виде или там данные для заполнения камбабаксов значениями по умолчанию. Это уже база данных со множеством рилeйшеншипс. Oracle, MySQL, SQL Server, whatevere... :mrgreen:[/quote:f6315914da]

Вот именно, то есть ни реестр ни ini тут не подходят.

Для многих же типичных случаев - как сохранение имен последних 4-6 документов или расположения окна программы на экране - реестр очень удобен.

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

MaxSt.
War does not determine who is right - only who is left.
User avatar
lx_uk
Уже с Приветом
Posts: 376
Joined: 04 Feb 2002 10:01

Post by lx_uk »

[quote:cf215ff5cb="MaxSt"][quote:cf215ff5cb="lx_uk"]По поводу GUI как средства настройки. Есть один случай, когда такой подход плохо работает. Когда настроек очень много (сотни), они взаимосвязанны между собой, могут перекрывать друг друга и т.п.[/quote:cf215ff5cb]

Какой же подход [b:cf215ff5cb]хорошо[/b:cf215ff5cb] работает в этом случае?

MaxSt.[/quote:cf215ff5cb]

Я неудачно сформулировал свою мысль. Скажем так:

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

- ini файлы и их варианты работают лучше, когда кол-во параметров вырастает от нескольких десятков до сотен, а также когда они обрастают простыми зависимостями (inheritance, overriding, etc.). Написать удобный GUI в этом случае - нетривиальная задача. Легче - выдумать (или взять готовый) язык для ini файлов. Взаимосвязи в этом случае контролируются (в той или иной степени) семантикой этого языка.

- самый запущенный случай - "параметров" очень много, они очень сильно связанны друг с другом. Единого оптимального решения вероятно не существует. По крайней мере мне о таком ничего не известно. Все зависит от характера "параметров" и связей между ними.

Return to “Работа и Карьера в IT”