Коли і чому потрібно зберігати дані в реєстрі Windows?


126

Як розробник, інструменти, які зберігають конфігурацію / параметри в реєстрі, є основою мого життя. Я не можу легко відстежувати зміни в цих параметрах, не можу легко перенести їх з машини на машину, і все це змушує мене дуже прагнути старих старих файлів .INI.

Коли я пишу власні додатки, що - якщо що - я повинен вибрати в реєстр, а не в старомодні конфігураційні файли, і чому?


Зараз я працюю зі застарілим додатком, який зберігає інформацію в реєстрі (додаток .NET), і це ганяє мене.
Джордж Стокер

Відповіді:


75
  • Спочатку конфігурація (WIN3) зберігалася у файлі WIN.INI у каталозі Windows.
  • Проблема: WIN.INI виріс дуже великий.
  • Рішення (Win31): окремі файли INI в тій же директорії, що і програма.
  • Проблема. Ця програма може бути встановлена ​​в мережі та поділитися багатьма людьми.
  • Рішення (Win311): окремі файли INI у каталозі вікна користувача.
  • Проблема: Багато людей можуть мати спільну папку Windows, і вона має бути доступною лише для читання.
  • Рішення (Win95): реєстр з окремими розділами для кожного користувача.
  • Проблема: реєстр став занадто великим.
  • Рішення (WinXP): великі блоки окремих даних переміщені у власну папку Дані програми.
  • Проблема: добре для великих обсягів даних, але досить складний для невеликих обсягів.
  • Рішення (.NET): невелика кількість фіксованих даних, доступних лише для читання, що зберігаються у файлах .config (Xml) у тій же папці, що і додаток, з API для її читання. (Читання / запис або певні користувацькі дані залишаються в реєстрі)

16
Unix: конфігурація, що зберігається в $ HOME / .your-app там, вирішена за одну ітерацію.
Леонель

33
Рішення Unix теж далеко не ідеальне: $ HOME роздувається точковими файлами, і ви поняття не маєте, чим займається більшість з них.
греп

2
@Leonel XDG насправді вимагає розмістити свої конфігураційні файли всередині $HOME/.config/your-app/, рішення, створене для вирішення проблеми @grep об’єктів. І дивно, що сучасний Linux (і хтось із * BSD досить божевільний для використання GNOME) також має реєстр у gconfнаборі. FOSS породжує вибір, це точно;)
new123456

1
@grep, Re " не маю уявлення, що робить більшість з них ", чому б і ні? Крім того, набряк навряд чи можна порівняти з Windows.
Pacerier

16

Якщо говорити про це як з точки зору користувача, так і з точки зору програмістів, я б сказав, що насправді не надто корисне, щоб щось помістити в реєстр, якщо це не щось на зразок асоціацій файлів чи певних налаштувань машини.

Я походить із школи думок, яка говорить про те, що програма повинна бути запущена з того місця, де вона встановлена, що інсталяція повинна бути повністю рухомою в межах машини або навіть на іншій машині і не впливати на її роботу.

Будь-які налаштовані параметри, або потрібні dll тощо, якщо вони не поділяються, повинні міститись у підкаталозі каталогу інсталяції, щоб вся установка легко переміщувалася.

Я використовую багато менших утиліт, таких як програми, тому якщо його не можна встановити на USB-накопичувач і підключити до іншої машини та просто запустити, то це не для мене.


4
Але інсталяція часто проводиться під управлінням адміністратора, тоді як оновлення параметрів повинно здійснюватися під контролем користувача. Уявіть, що намагаєтесь оновити налаштування - додаток, що працює під ідентифікацією користувача, який хоче записатись у каталог, обмежений лише для доступу адміністратора. Це одна з речей, з якими реєстр покликаний вирішувати.
Чесо

@Cheeso, Рішення полягає в тому, щоб кожен користувач мав копію виконуваного файлу. Щоб заощадити місце, не справжня копія, а просто підроблена копія (покажчик).
Pacerier

12

Політика Microsoft:

  • Перед Windows 95 ми використовували файли ini для даних програми.
  • У епоху Windows 95 - XP ми використовували реєстр.
  • У Windows Vista ми використовуємо файли ini, хоча зараз вони засновані на XML.

Реєстр залежить від машини. Мені це ніколи не подобалося, тому що його стає повільним і майже неможливо знайти потрібну річ. Ось чому мені подобаються прості ini чи інші налаштування файлів. Ви знаєте, де вони знаходяться (папка додатків чи папка користувача), тому вони легко переносяться та читаються людиною.


1
Чи можете ви надати оригінальне посилання на документ, який заявляє про цю політику Microsoft? Коли ви говорите про політику, ви маєте на увазі, що це робить Microsoft, чи ви маєте на увазі це те, що Microsoft рекомендує розробникам, які створюють програми для Windows?
Cheeso

1
ps: raymond Chen з Microsoft заявив, що файли INI застаріли на користь Реєстру, і пояснює, чому. blogs.msdn.com/oldnewthing/archive/2007/11/26/6523907.aspx Він також заявляє, що файли XML мають багато тих же недоліків, що і файли ini.
Чесо

8
Файли налаштувань XML = файли INI, які важче проаналізувати
Роберт Фрейзер,

3
@Fraser, якщо ви думаєте, що аналізувати XML складно, ви не в тому бізнесі.
SnakeDoc

@SnakeDoc, важче не означає складніше. Це просто означає повільніше розбору та відставання.
Pacerier

12

Коли - ви змушені через застарілу інтеграцію або через те, що системний адміністратор вашого клієнта каже, що "так буде", або тому, що ви розробляєте стару мову, що ускладнює використання XML.

Чому - Перш за все тому, що реєстр не такий портативний, як копіювання файлу конфігурації, який сидить поруч із додатком (і називається майже таким же).

Якщо ви використовуєте .Net2 +, у вас є файли App.Config та User.Config, і вам не потрібно реєструвати DLL-файли в реєстрі, тому тримайтеся подалі від нього.

У файлах Config є свої проблеми (див. Нижче), але їх можна закодувати навколо, і ви можете змінити свою архітектуру.

  • Проблема: Програми потребували налаштованих налаштувань.
  • Рішення: Зберігайте налаштування у файлі (WIN.INI) у папці Windows - використовуйте заголовки розділів для групування даних (Win3.0).
  • Проблема: файл WIN.INI виріс (і заплутався).
  • Рішення: Зберігайте налаштування у файлах INI у тій самій папці, що і додаток (Win3.1).
  • Проблема: потрібні налаштування для користувача.
  • Рішення: Збережіть налаштування користувача у специфічних для користувача файлах INI у вікні каталогу користувача (Win3.11) або у розділах, визначених для користувача, у файлі INI програми.
  • Проблема: Безпека - деякі параметри програми потрібно мати лише для читання.
  • Рішення: Реєстр із захистом, а також специфічні для користувача та розділи на комп'ютері (Win95).
  • Проблема: реєстр став занадто великим.
  • Рішення: Реєстр, призначений для користувача, переміщено до user.dat у власній папці "Дані програми" та завантажується лише під час входу (WinNT).
  • Проблема: У великих корпоративних середовищах ви входите на декілька машин і повинні налаштувати кожного.
  • Рішення: розрізняйте локальні (локальні налаштування) та роумінгові (дані програми) (WinXP).
  • Проблема. Неможливо xcopy розгортати або переміщувати додатки, як і решта .Net.
  • Рішення: XP-файл APP.CONFIG у тій самій папці, що і додаток, - простий для читання, простий в маніпуляції, простий в переміщенні, може відслідковуватися при зміні (.Net1).
  • Проблема: все-таки потрібно зберігати дані, характерні для користувача, аналогічним чином (тобто розгортання xcopy).
  • Рішення: XER-файл USER.CONFIG у локальній або роумінговій папці користувача та сильно набраний (.Net2).
  • Проблема: файли CONFIG чутливі до регістру (не інтуїтивно зрозумілі для людини), вимагають дуже специфічних відкритих / закритих "тегів", рядки підключення не можна встановлювати під час виконання, проекти налаштування не можуть записувати налаштування (так просто, як реєстр), не можуть легко визначити Файл user.config та налаштування користувача обдуваються при кожній встановленій новій версії.
  • Рішення: Використовуйте член ITEM для встановлення рядків з'єднань під час виконання, введіть код у класі інсталятора, щоб змінити App.Config під час встановлення та використовувати параметри програми за замовчуванням, якщо налаштування користувача не знайдено.

Це набагато повніша відповідь, ніж схвалена. Дякую @AndrewD.
ротман

8

Чи закінчиться світ, якщо ви збережете в реєстрі Windows кілька позицій вікна та список останніх використаних елементів? Для мене це все добре працює.

HKEY-CURRENT-USER - прекрасне місце для зберігання тривіальних даних користувачів у невеликих кількостях. Ось для чого це. Здається, нерозумно не використовувати за призначенням лише тому, що інші зловживали цим.


і це чудово, що розбещує себе ... це плюс. Менше роботи для користувача ...
SnakeDoc

4

Налаштування, які ви хочете мати в роумінговому профілі користувача, ймовірно, повинні бути внесені до реєстру, якщо ви дійсно не хочете намагатися вручну шукати папку даних програми користувача вручну. :-)


4

Реєстр читає і записує безпечні нитки, але файли - ні. Отже, це залежить від того, чи є ваша програма однопоточною.


2

Якщо ви розробляєте новий додаток, і ви турбуєтесь про переносимість, НІКОЛИ не зберігайте дані в реєстрі Windows, оскільки інші ОС не мають реєстру (windows) (це зауважте - це може бути очевидним, але його часто не помічають).

Якщо ви розробляєте лише для платформ Win ... намагайтеся уникати цього, наскільки це можливо. Налаштування файлів (можливо, зашифрованих) є набагато кращим рішенням. Немає вигоди від зберігання даних у реєстрі - (ізольоване сховище є набагато кращим рішенням, наприклад, якщо ви використовуєте .NET).


Це частково так. Mono реалізував простір імен Microsoft.win32 для реєстрів - за винятком того, що він зберігає його у файлі у ~ / .mono / Registry у файлі xml та обробляється прозоро. Тепер, якщо ви можете ввімкнути обробку xml для будь-якого додатка, незалежно від платформи ...
Роберт П

Примітка. Доступний лише для вас, якщо ви пишете додаток .NET / Mono.
Роберт П

Реєстр дозволяє отримати виграш: дані легше доступні у багатопотоковому додатку. Що ще важливіше, воно дозволяє розділяти дані конфігурації, які залежать від машини та конкретного користувача. У вашій програмі не повинно бути відомо про те, хто входить у систему, коли вона отримує доступ до HKEY_CURRENT_USER. Ти маєш рацію щодо портативності.
Джеймс

2

Трохи поза темою, але, оскільки я бачу людей, занепокоєних портативністю, найкращим підходом, який я коли-небудь застосовував, є клас QSettings Qt. Він резюмує зберігання налаштувань (реєстр в Windows, файл переваг XML на Mac OS та файли Ini в Unix). Як клієнт класу, мені не доводиться проводити мозковий цикл, цікавлячись реєстру чи іншого, це просто працює (тм).

http://doc.trolltech.com/4.4/qsettings.html#details


Здається, URL вже не працює. Посилання на оновлення має бути qt-project.org/doc/qt-5/QSettings.html#details
Ейнекі

0

Зазвичай, якщо ви не вводите налаштування в реєстр, ви використовуєте їх в основному для отримання поточних налаштувань Windows, зміни асоціацій файлів тощо.
Тепер, якщо вам потрібно виявити, чи програмне забезпечення вже встановлено, ви можете зробити мінімальний запис у реєстрі , це місце, яке ви можете знайти в будь-якому конфігурації. Або шукайте папку з вказаним іменем у Дані програми.

Якщо я дивлюся на папку «Документи та налаштування», я бачу багато програмного забезпечення, яке використовує позначення крапок Unix для встановлення папок: .p4qt .sqlworkbench .squirrel-sql .SunDownloadManager .xngr .antexplorer .assistant .CodeBlocks .dbvis .gimp-2.4 .jdictionary .jindent .jogl_ext (тощо)

і в Дані програми, різні папки з іменами редактора або іменами програмного забезпечення. Схоже, це тенденція, щонайменше, серед портативних програм ...
WinMerge використовує дещо інший підхід, зберігаючи дані в реєстрі, але пропонуючи імпорт та експорт параметрів у діалоговому вікні конфігурації.


Позначення крапок Unix, яке ви бачите, ймовірно, тому, що всі ці приклади є портативними проектами з відкритим кодом, а не тому, що це найкраща практика для розробки Windows.
Джеймс

Справді, я не казав, що це "найкраща практика", але звичайна практика ... :) Папки в програмах / є / найкраща практика, особливо для великих даних, але також тому, що резервні копії їх легше.
PhiLho

0

Особисто я використовував реєстр, щоб зберігати шляхи установки для використання сценаріями (не) встановлення. Я не впевнений, чи це єдино можливий варіант, але здавався розумним рішенням. Це було для програми, яка використовувалася виключно в Windows.


0

У .NET насправді НЕ ВІДПОВІСТЬ.

Ось два приклади, які показують, як використовувати proerties Project для цього.

Ці приклади роблять це за допомогою властивостей проекту користувача користувача Windows, але те саме можна зробити / застосувати і в програмі.

Більше тут:

http://code.msdn.microsoft.com/TheNotifyIconExample

http://code.msdn.microsoft.com/SEHE


0

(пізно до обговорення, але) Короткий відповідь: Групова політика.

Якщо відділ інформаційних технологій вашого клієнта хоче застосувати налаштування, пов’язані з Windows або компонентом, яким ви пишете чи вбудовуєте, наприклад швидкість посилання, або власне повідомлення про помилку або сервер бази даних, до якого потрібно підключитися, це як правило проводиться за допомогою групової політики, яка дає остаточний прояв як налаштування, що зберігаються в реєстрі. Такі правила застосовуються з часу запуску Windows або входу користувача.

Існують інструменти для створення користувальницьких шаблонів ADMX, які можуть зіставляти налаштування компонентів у місцях реєстрації та надавати адміністратору загальний інтерфейс для виконання політик, які він повинен застосовувати, показуючи їм лише ті параметри, які мають сенс для виконання цього способу.


-1

Я вважаю, що Реєстр Windows був гарною ідеєю, але через великі зловживання розробниками програм та стандартними політиками, не заохоченими / розпорядженими Microsoft, перетворився на некерованого звіра. Я ненавиджу його використовувати з причин, про які ви згадали, проте є деякі випадки, коли є сенс використовувати його:

  • Залишаючи слід від вашої програми після видалення вашої програми (наприклад, пам’ятайте про налаштування користувача у випадку, якщо програма буде встановлена ​​знову)
  • Налаштування параметрів конфігурації між різними програмами - компонентами

5
Я не погоджуюсь з вами щодо вашого першого пункту, "[l] залишаючи слід від вашої заявки після видалення вашої програми". Я вважаю за краще, якщо я скажу "видаліть себе з моєї системи", що ваша програма повністю відповідає. Я вважаю, що це було б інакше, якби ви запитували користувача, чи нормально залишити щось позаду, але навіть тоді я, мабуть, хотів би, щоб це був збережений конфігураційний файл. Ліцензування тощо, незважаючи на те, що якщо ви продаєте комп’ютер і купуєте новий, чи не будете у вас швидше файлом налаштувань, який ви можете завантажити в новому встановленні, а не на щось, прив’язане до комп'ютера, який ви продаєте?
AgentConundrum

2
Багато програм це роблять, і ви праві сказати, що це не дуже добре, особливо якщо вони роблять це без дозволу користувача. Однак це часто функціональність, яку користувачі очікують від програми (більшість користувачів не знає, що таке реєстр). Користувачі просто очікують, що знову, коли вони видаляються та інсталюються, знову знайдуть свої налаштування автоматично-магічно.
kgiannakakis

2
Я думаю, ми знайшли тут автора шкідливого програмного забезпечення. Ніколи не залишайте лайно зі своєї програми в чиїйсь системі, якщо вона попросила вас видалити. Принаймні запитайте їх, чи хочуть вони запам'ятати налаштування тощо. Ніколи не робіть цього. Що робити, якщо ви зберігаєте ліцензійний ключ, і я продаю свій комп’ютер? Що робити, якщо ваша програма спричиняла проблеми на моєму комп’ютері, і я спробував видалити її, щоб її виправити? Що ж, залишки вашого реєстру можуть викликати у мене чимало проблем. Просто не робіть цього. Просто ні.
SnakeDoc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.