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?

Author: Kurt W. Leucht, 2008-08-09

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.
  1. przenośny. Jeśli przenosisz aplikację na inny system operacyjny, nie musisz zmieniać formatu ustawień.
  2. użytkownik-edytowalny. Użytkownik może edytować plik konfiguracyjny poza wykonywanym programem.

Zalety rejestru:

  1. 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.
  2. 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.

 41
Author: Lipis,
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.
 26
Author: Lipis,
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!

 4
Author: Chris Jester-Young,
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.

 4
Author: Greg,
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.

 4
Author: EvilTeach,
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.

 3
Author: On Freund,
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#.

 3
Author: deadtime,
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.

 2
Author: ,
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-24 09:01:31

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ń.

 2
Author: Class Skeleton,
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.

 1
Author: Mark Ransom,
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.

 0
Author: David,
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ć)

 0
Author: Zac,
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.

 -2
Author: Michael Stum,
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