Rejestr vs. plik INI do przechowywania ustawień aplikacji konfigurowalnych przez użytkownika
Jestem nowym programistą Windows i nie jestem pewien, gdzie powinienem przechowywać konfigurowalne ustawienia aplikacji użytkownika. Rozumiem potrzebę zapewnienia użytkownikowi przyjaznych środków do zmiany ustawień aplikacji, takich jak Formularz edycji | ustawień lub podobny. Ale gdzie powinienem przechowywać wartości po naciśnięciu przycisku Zastosuj w tym formularzu?
Jakie są zalety i wady przechowywania ustawień w rejestrze systemu Windows vs. przechowywanie ich w lokalnym pliku INI lub pliku konfiguracyjnym lub podobne?
13 answers
Zalety pliku konfiguracyjnego:
-
Łatwe do zrobienia. Nie musisz znać żadnych wywołań Windows API. Musisz tylko znać interfejs We/Wy pliku swojego języka programowania.
- przenośny. Jeśli przenosisz aplikację na inny system operacyjny, nie musisz zmieniać formatu ustawień.
- użytkownik-edytowalny. Użytkownik może edytować plik konfiguracyjny poza wykonywanym programem.
Zalety rejestru:
- zabezpieczony. Użytkownik nie może przypadkowo usuń plik konfiguracyjny lub uszkodzić dane, chyba że wie o regedit. A potem użytkownik prosi o kłopoty.
- nie jestem ekspertem w programowaniu Windows, ale jestem pewien, że korzystanie z rejestru ułatwia wykonywanie innych rzeczy specyficznych dla systemu Windows (ustawienia specyficzne dla użytkownika, administrowanie siecią, takie jak zasady grupy, czy cokolwiek innego).
Jeśli potrzebujesz tylko prostego sposobu przechowywania informacji o konfiguracji, polecam plik konfiguracyjny, używając INI lub XML jako formatu. I zaproponuj korzystanie z rejestru tylko wtedy, gdy jest coś konkretnego, co chcesz uzyskać z korzystania z rejestru.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-25 13:13:38
Jeff Atwood ma świetny Artykuł o rejestrze systemu Windows i dlaczego jest lepiej używać .Zamiast tego pliki INI.
Moje życie byłoby o wiele łatwiejsze, gdyby ustawienia poszczególnych aplikacji były przechowywane w miejscu, w którym mógłbym je łatwo zobaczyć, manipulować nimi i tworzyć kopie zapasowe. Powiedzmy... w plikach INI.
- rejestr jest pojedynczym punktem awarii . Dlatego każda wskazówka edycji rejestru, którą kiedykolwiek znajdziesz, zaczyna się od dużego grubego krzyczącego zastrzeżenia o tym, jak można złamać komputer z regedit.
- rejestr jest nieprzezroczysty i binarny . O ile nie lubię podatku od nawiasów kątowych, przynajmniej pliki konfiguracyjne XML są w miarę czytelne dla człowieka i pozwalają na tyle komentarzy, ile uznasz za stosowne.
- rejestr musi być zsynchronizowany z systemem plików . Usuń aplikację bez jej "odinstalowania" i pozostajesz z przestarzałym cruft rejestru. Lub jeśli aplikacja ma źle napisany deinstalator. System plików nie dłuższa dokumentacja-musi być w jakiś sposób zsynchronizowana z rejestrem. To całkowite pogwałcenie Zasady suchości.
- rejestr jest monolityczny . Załóżmy, że chcesz przenieść aplikację na inną ścieżkę na swoim komputerze, a nawet na zupełnie inną maszynę. Powodzenia w wydobywaniu odpowiednich ustawień dla tej jednej konkretnej aplikacji z gigantycznego rejestru tarball. Dana aplikacja ma zazwyczaj dziesiątki ustawień rozrzuconych po całym rejestr.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-14 09:19:28
Zgodnie z dokumentacją dla GetPrivateProfileString , należy użyć rejestru do przechowywania informacji o inicjalizacji.
Jednak, mówiąc Tak, jeśli nadal chcesz używać .pliki ini, a także korzystać ze standardowych interfejsów API profilu (GetPrivateProfileString
, WritePrivateProfileString
, i tym podobne) w celu uzyskania do nich dostępu, zapewniają wbudowane sposoby automatycznego udostępniania " Wirtualnegopliki ini " wspierane przez rejestr. Win-win!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-09 04:54:24
Jest podobne pytanie tutaj, które obejmuje niektóre z zalet i wad.
Sugerowałbym nie używać rejestru, chyba że aplikacja absolutnie tego potrzebuje. Z mojego zrozumienia, Microsoft stara się zniechęcić do korzystania z rejestru ze względu na elastyczność plików ustawień. Nie polecam też używania .pliki ini, ale zamiast tego używając niektórych wbudowanych funkcji do. NET do zapisywania ustawień użytkownika/aplikacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-09 13:03:06
Użycie pliku ini, w tym samym katalogu co aplikacja, umożliwia utworzenie kopii zapasowej w aplikacji. Więc po przeładowaniu systemu operacyjnego, po prostu przywrócić katalog aplikacji i masz swoją konfigurację tak, jak chcesz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-11 02:14:16
Jest jeszcze jedna zaleta używania pliku INI nad rejestrem, którego nie widziałem: Jeśli użytkownik używa pewnego rodzaju szyfrowania opartego na woluminach/plikach, może łatwo zaszyfrować plik INI. Z rejestru będzie to prawdopodobnie bardziej problematyczne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-10 17:32:25
Zgadzam się z Danielem. Jeśli jest to duża aplikacja, myślę, że zrobiłbym rzeczy w rejestrze. Jeśli jest to mała aplikacja i chcesz mieć jej aspekty konfigurowalne przez Użytkownika bez tworzenia formularza konfiguracji, przejdź do szybkiego pliku INI.
Zwykle robię parsowanie w ten sposób (Jeśli format w .plik ini to opcja = wartość, 1 w linii, komentarze zaczynające się od#):
static void Parse()
{
StreamReader tr = new StreamReader("config.ini");
string line;
Dictionary<string, string> config = new Dictionary<string, string>();
while ((line = tr.ReadLine()) != null)
{
// Allow for comments and empty lines.
if (line == "" || line.StartsWith("#"))
continue;
string[] kvPair = line.Split('=');
// Format must be option = value.
if (kvPair.Length != 2)
continue;
// If the option already exists, it's overwritten.
config[kvPair[0].Trim()] = kvPair[1].Trim();
}
}
Edit: Przepraszam, myślałem, że określiłeś język. Powyższa implementacja jest w C#.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-07 18:03:02
Jak wskazał Daniel, przechowywanie danych konfiguracyjnych w rejestrze daje możliwość korzystania z szablonów administratora. Oznacza to, że możesz zdefiniować szablon administratora, użyć go w zasadach grupy i zarządzać konfiguracją aplikacji w całej sieci. W zależności od charakteru aplikacji może to być duże dobrodziejstwo.
Istniejące odpowiedzi obejmują dużo ziemi, ale pomyślałem, że wspomnę jeszcze jedną kwestię.
Używam rejestru do przechowywania ustawień systemowych. Oznacza to, że 2 lub więcej programów wymaga dokładnie tego samego ustawienia. Innymi słowy, ustawienie współdzielone przez kilka programów.
We wszystkich innych przypadkach używam lokalnego pliku konfiguracyjnego, który znajduje się w tej samej ścieżce co plik wykonywalny lub o jeden poziom niżej (w katalogu konfiguracyjnym). Powody są już omówione w innych odpowiedziach (przenośne, można być edytowane za pomocą edytora tekstu itp.).
Po co umieszczać systemowe Ustawienia w rejestrze? Cóż, odkryłem, że jeśli ustawienie jest udostępniane, ale używasz lokalnych plików konfiguracyjnych, w końcu duplikujesz ustawienia. Może to oznaczać konieczność zmiany ustawień w wielu miejscach.
Na przykład Program a i Program B wskazują na tę samą bazę danych. Możesz mieć ustawienie rejestru "całego systemu" Dla ciągu połączenia. Jeśli chcesz wskazać inną bazę danych, możesz zmienić łańcuch połączenia w jednym miejscu, a oba programy będą teraz działać przeciwko drugiej bazie danych.
Uwaga-nie ma sensu używać rejestru w ten sposób, jeśli dwa lub więcej programów nie musi używać tych samych wartości. Np. Program A i Program B potrzebują łańcucha połączenia z bazą danych, który maj bądź taki sam, ale nie zawsze. Na przykład chcę, aby Program B używał teraz testowej bazy danych, ale Program A powinien kontynuować korzystanie z produkcyjnej bazy danych.
Z powyższy przykład, możesz mieć pewne ustawienia lokalne nadpisujące ustawienia całego systemu, ale może to być zbyt skomplikowane dla prostych zadań.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-21 10:25:44
Rejestr jest zoptymalizowany pod kątem szybkiego dostępu i łatwej aktualizacji i jest to jedyny sposób na wykonywanie pewnych specyficznych dla systemu Windows rzeczy, takich jak kojarzenie z rozszerzeniem. Możesz zignorować argument o usunięciu jednego katalogu, aby odinstalować program-Windows Vista nie pozwoli Ci modyfikować plików w katalogu Program Files, więc twój config i tak będzie musiał przejść do innego folderu.
Jest ogólne wytyczne dotyczące programowania w systemie Windows - rób rzeczy tak, jak oczekuje Cię Microsoft do, a twoje życie będzie o wiele łatwiejsze.
To powiedziawszy, widzę apelację pliku INI i nie winię nikogo za to, że to rozważa.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-11 01:40:20
Istnieje jedna wada plików ini lub config, która polega na ich zlokalizowaniu, jeśli użytkownik ma możliwość wyboru miejsca instalacji programu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-27 02:52:35
Inną wadą korzystania z rejestru jest to, że jest to ból, jeśli pracujesz w mieszanym środowisku aplikacji 32 i 64 bitowych, jak systemowe wywołanie dostępu do rejestru będzie losowo (*) Dodać \Wow6432Node\
do ścieżki rejestru, co szalony podczas debugowania.
(*Oczywiście nie losowo, ale bardzo łatwo się zgubić)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-26 12:39:33
Czy Twoja aplikacja jest zainstalowana z programem instalacyjnym, czy tylko "Rozpakuj i uruchom"? W pierwszym przypadku, spójrz na plusy i minusy przedstawione tutaj. Ale dla wyodrębnić i uruchomić, rejestr jest moim zdaniem "no-go", jak ludzie oczekują, aby być w stanie po prostu usunąć folder aplikacji, aby pozbyć się programu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-09 13:16:36