Verileri ne zaman - ve neden - Windows Kayıt Defterinde depolamalısınız?


126

Bir geliştirici olarak, kayıt defterinde yapılandırma / seçenekleri depolayan araçlar hayatımın sıkıntısıdır. Bu seçeneklerdeki değişiklikleri kolayca izleyemiyorum, bunları makineden makineye kolayca taşıyamıyorum ve hepsi .INI dosyalarının eski güzel günleri için canımı sıkıyor ...

Kendi uygulamalarımı yazarken, eski moda yapılandırma dosyaları yerine kayıt defterine ne koymalıyım ve neden?


Şu anda kayıt defterinde (.NET uygulaması) bilgi depolayan eski bir uygulamayla çalışıyorum ve bu beni deli ediyor.
George Stocker

Yanıtlar:


75
  • Başlangıçta (WIN3) yapılandırması Windows dizinindeki WIN.INI dosyasında saklanıyordu.
  • Sorun: WIN.INI çok büyüdü.
  • Çözüm (Win31): programla aynı dizinde bulunan bağımsız INI dosyaları.
  • Sorun: Bu program bir ağa yüklenebilir ve birçok kişi tarafından paylaşılabilir.
  • Çözüm (Win311): Kullanıcının Window dizinindeki bağımsız INI dosyaları.
  • Sorun: Birçok kişi bir Windows klasörünü paylaşabilir ve yine de salt okunur olmalıdır.
  • Çözüm (Win95): Her kullanıcı için ayrı bölümlere sahip kayıt defteri.
  • Sorun: Kayıt çok büyüdü.
  • Çözüm (WinXP): Kullanıcının kendi Uygulama Verileri klasörüne taşınan büyük bireysel veri blokları.
  • Sorun: Büyük miktarda veri için iyi, ancak küçük miktarlar için oldukça karmaşık.
  • Çözüm (.NET): .config (Xml) dosyalarında, uygulama ile aynı klasörde saklanan ve onu okumak için API ile saklanan küçük miktarlarda sabit, salt okunur veri. (Okuma / yazma veya kullanıcıya özel veriler kayıt defterinde kalır)

16
Unix: $ HOME / .your-app'da depolanan yapılandırma Orada, tek yinelemede çözüldü.
Leonel

33
Unix çözümü de ideal olmaktan uzaktır: $ HOME nokta dosyalarıyla şişirilmiştir ve çoğunun ne yaptığı hakkında hiçbir fikriniz yoktur.
grep

2
@Leonel XDG aslında yapılandırma dosyalarınızı içine koymanızı zorunlu kılar, $HOME/.config/your-app/@grep nesnelerindeki sorunla başa çıkmak için oluşturulmuş bir çözüm. Ve şaşırtıcı, modern Linux (ve * BSD'deki herhangi birinin GNOME'u kullanacak kadar çılgın olması) dagconf paketinde bir kayıt defteri var . FOSS seçimleri besliyor, bu kesin;)
new123456

1
@grep, " çoğunun ne yaptığına dair hiçbir fikrim yok ", Neden olmasın? Ayrıca, şişkinlik Windows'unkiyle pek karşılaştırılamaz.
Pacerier

16

Buna hem kullanıcı perspektifinden hem de programcı perspektifinden gelince, dosya ilişkilendirmeleri veya makineye özel ayarlar gibi bir şey olmadığı sürece kayıt defterine bir şey koymak için gerçekten iyi bir mazeret olmadığını söylemeliyim.

Bir programın kurulu olduğu yerden çalıştırılabilir olması gerektiğini, kurulumun bir makine içinde hatta başka bir makineye tamamen taşınabilir olması gerektiğini ve çalışmasını etkilemeyeceğini söyleyen düşünce okulundan geliyorum.

Yapılandırılabilir seçenekler veya gerekli dll'ler, paylaşılmıyorlarsa, kurulum dizininin bir alt dizininde yer almalıdır, böylece tüm kurulum kolayca taşınabilir.

Programlar gibi çok sayıda küçük yardımcı program kullanıyorum, bu yüzden bir usb belleğe yüklenemiyor ve başka bir makineye takılıp sadece çalıştırılamıyorsa, o zaman benim için değil.


4
Ancak kurulum genellikle yönetici kontrolü altında yapılırken, güncelleme ayarları kullanıcı kontrolü altında yapılmalıdır. Yalnızca yönetici erişimiyle sınırlı bir dizine yazmak isteyen, kullanıcının kimliği altında çalışan bir uygulama olan ayarları güncellemeye çalıştığınızı düşünün. Bu, kayıt defterinin ele almak istediği şeylerden biridir.
Cheeso

@Cheeso, Çözüm, her kullanıcının çalıştırılabilir dosyanın bir kopyasına sahip olmasıdır. Yerden tasarruf etmek için, gerçek bir kopya değil, sadece sahte bir kopya (işaretçi).
Pacerier

12

Microsoft politikası:

  • Windows 95'ten önce, uygulama verileri için ini dosyalarını kullandık.
  • Windows 95 - XP döneminde kayıt defterini kullandık.
  • Windows Vista'dan, artık xml tabanlı olmalarına rağmen ini dosyalarını kullanıyoruz.

Kayıt, makineye bağlıdır. Onu hiç sevmedim çünkü yavaşlıyor ve ihtiyacınız olan şeyi bulmak neredeyse imkansız. Bu yüzden basit ini veya diğer ayar dosyalarını seviyorum. Nerede olduklarını (uygulama klasörü veya kullanıcı klasörü) biliyorsunuz, böylece kolay taşınabilir ve insan tarafından okunabilir.


1
Microsoft'un bu politikasını belirten belgeye orijinal bir bağlantı sağlayabilir misiniz? Ve politika dediğinizde, Microsoft'un yaptığı bu mu, yoksa Microsoft'un Windows için uygulama geliştiren geliştiricilere önerdiği şeyin bu olduğunu mu söylüyorsunuz?
Cheeso

1
ps: raymond Chen, Microsoft, INI dosyalarının Kayıt Defteri lehine kullanımdan kaldırıldığını belirtti ve nedenini açıkladı. blogs.msdn.com/oldnewthing/archive/2007/11/26/6523907.aspx Ayrıca, XML dosyalarının ini dosyalarıyla aynı dezavantajlara sahip olduğunu belirtiyor.
Cheeso

8
XML ayarları dosyaları = ayrıştırılması daha zor olan INI dosyaları
Robert Fraser

3
@Fraser XML'in ayrıştırılmasının zor olduğunu düşünüyorsanız, yanlış iştesiniz demektir.
SnakeDoc

@SnakeDoc, Harder, daha zor demek değildir. Basitçe daha yavaş ayrıştırma ve gecikme anlamına gelir.
Pacerier

12

Ne zaman - Eski entegrasyon nedeniyle veya müşterinizin sistem yöneticisi "öyle olacak" dediği için veya XML kullanmayı zorlaştıran daha eski bir dilde geliştirme yaptığınız için mecbur kalırsınız.

Neden - Öncelikle, kayıt defteri uygulamanın yanında bulunan (ve hemen hemen aynı adı verilen) bir yapılandırma dosyasını kopyalamak kadar taşınabilir olmadığı için.

.Net2 + kullanıyorsanız, App.Config ve User.Config dosyalarınız varsa ve DLL'leri kayıt defterine kaydetmeniz gerekmiyor, bu yüzden ondan uzak durun.

Yapılandırma dosyalarının kendi sorunları vardır (aşağıya bakın), ancak bunlar etrafına kodlanabilir ve mimarinizi değiştirebilirsiniz.

  • Sorun: Uygulamaların yapılandırılabilir ayarlara ihtiyacı vardı.
  • Çözüm: Ayarları Windows klasöründeki bir dosyada (WIN.INI) depolayın - verileri gruplamak için bölüm başlıklarını kullanın (Win3.0).
  • Sorun: WIN.INI dosyası çok büyüdü (ve dağınık hale geldi).
  • Çözüm: Ayarları, uygulama (Win3.1) ile aynı klasördeki INI dosyalarında saklayın.
  • Sorun: Kullanıcıya özel ayarlara ihtiyaç var.
  • Çözüm: Kullanıcı ayarlarını, kullanıcının Pencere dizinindeki (Win3.11) kullanıcıya özgü INI dosyalarında veya uygulama INI dosyasındaki kullanıcıya özgü bölümlerde depolayın.
  • Sorun: Güvenlik - bazı uygulama ayarlarının salt okunur olması gerekir.
  • Çözüm: Kullanıcıya özel ve makine genelindeki bölümlerin yanı sıra güvenliğe sahip kayıt defteri (Win95).
  • Sorun: Kayıt çok büyüdü.
  • Çözüm: Kullanıcıya özgü kayıt defteri, kullanıcının kendi "Uygulama Verileri" klasöründeki user.dat'a taşındı ve yalnızca oturum açma sırasında yüklendi (WinNT).
  • Sorun: Büyük kurumsal ortamlarda, birden çok makinede oturum açarsınız ve HER BİRİNİ kurmanız gerekir.
  • Çözüm: Yerel (Yerel Ayarlar) ve dolaşım (Uygulama Verileri) profilleri (WinXP) arasında ayrım yapın.
  • Sorun: .Net'in geri kalanı gibi uygulamaları xcopy dağıtamaz veya taşıyamaz.
  • Çözüm: APP.CONFIG XML dosyası uygulama ile aynı klasörde -, okunması kolay, kullanımı kolay, taşınması kolay, değiştirilirse izlenebilir (.Net1).
  • Sorun: Yine de kullanıcıya özgü verileri benzer bir şekilde (yani xcopy dağıtımı) depolamak gerekiyor.
  • Çözüm: Kullanıcının yerel veya dolaşım klasöründeki ve kesin olarak yazılmış (.Net2) USER.CONFIG XML dosyası.
  • Sorun: CONFIG dosyaları büyük / küçük harfe duyarlıdır (insanlar için sezgisel değildir), çok özel açma / kapama "etiketleri" gerektirir, çalışma zamanında bağlantı dizeleri ayarlanamaz, kurulum projeleri ayarları yazamaz (kayıt defteri kadar kolay), kolayca belirlenemez user.config dosyası ve kullanıcı ayarları, yüklenen her yeni revizyonla birlikte üflenir.
  • Çözüm: Çalışma zamanında bağlantı dizelerini ayarlamak için ITEM üyesini kullanın, yükleme sırasında App.Config'i değiştirmek için bir Installer sınıfına kod yazın ve bir kullanıcı ayarı bulunamazsa uygulama ayarlarını varsayılan olarak kullanın.

Bu, onaylanandan çok daha eksiksiz bir cevaptır. Teşekkürler @AndrewD.
Rotman

8

Windows kayıt defterinde birkaç pencere konumunu ve en son kullanılan öğelerin bir listesini saklarsanız, dünyanın sonu gelecek mi? Şimdiye kadar benim için iyi çalıştı.

HKEY-CURRENT-USER önemsiz kullanıcı verilerini küçük miktarlarda depolamak için harika bir yerdir. Bunun için. Başkaları onu istismar ettiği için amacına uygun kullanmamak aptalca görünüyor.


ve kendini yozlaştırmada harika ... bu bir artı. Kullanıcının yapması gereken daha az iş ...
SnakeDoc

4

Bir kullanıcının gezici profilinde olmasını istediğiniz ayarlar, gerçekten kullanıcının Uygulama Verileri klasörünü elle arama çabasına gitmek istemediğiniz sürece, muhtemelen kayıt defterine girmelidir. :-)


4

Kayıt defteri okuma ve yazma işlemleri iş parçacığı açısından güvenlidir ancak dosyalar değildir. Bu nedenle, programınızın tek iş parçacıklı olup olmamasına bağlıdır.


2

Yeni bir uygulama geliştiriyorsanız ve taşınabilirliği önemsiyorsanız , diğer işletim sistemlerinde bir (windows) kayıt defteri olmadığından verileri ASLA Windows kayıt defterinde saklamamalısınız (duh notu - bu açık olabilir, ancak genellikle gözden kaçar).

Yalnızca Win platformları için geliştirme yapıyorsanız ... mümkün olduğunca bundan kaçınmaya çalışın. Yapılandırma dosyaları (muhtemelen şifrelenmiş) çok daha iyi bir çözümdür. Kayıt defterine veri depolamada bir kazanç yoktur - (yalıtılmış depolama, örneğin .NET kullanıyorsanız çok daha iyi bir çözümdür).


Bu kısmen doğrudur. Mono, kayıtlar için Microsoft.win32 ad alanını uygulamıştır - tek farkı, onu ~ / .mono / Registry'deki bir dosyada bir xml dosyasında depolar ve şeffaf bir şekilde işlenir. Şimdi, xml işlemeyi platformdan bağımsız olarak herhangi bir uygulama için açabilirseniz ...
Robert P

Not: Yalnızca bir .NET / Mono uygulaması yazıyorsanız kullanılabilir.
Robert P

Kayıt defteri bir kazanç sağlar: çok iş parçacıklı bir uygulamada verilere daha kolay erişilebilir. Daha da önemlisi, makineye özel konfigürasyon verilerini kullanıcıya özel ayırmanıza olanak tanır. Uygulamanızın, HKEY_CURRENT_USER'a eriştiğinde kimin oturum açtığından haberdar olması gerekmez. Yine de taşınabilirlik konusunda haklısın.
James

2

Biraz konu dışı, ancak insanların taşınabilirlik konusunda endişelendiğini gördüğüm için, şimdiye kadar kullandığım en iyi yaklaşım Qt'nin QSettings sınıfı. Ayarların depolanmasını özetler (Windows'ta kayıt, Mac OS'de XML tercih dosyası ve Unix'te Ini dosyaları). Sınıfın bir müşterisi olarak, kayıt defterini veya başka bir şeyi merak ederek bir beyin döngüsü harcamak zorunda değilim, Just Works (tm).

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


Görünüşe göre url artık çalışmıyor. Bir güncelleme referansı qt-project.org/doc/qt-5/QSettings.html#details
Eineki

0

Genellikle, ayarları kayıt defterine koymazsanız, bunu çoğunlukla geçerli Windows ayarlarını almak, dosya ilişkilerini değiştirmek vb. İçin kullanırsınız.
Şimdi, yazılımınızın zaten yüklü olup olmadığını tespit etmeniz gerekirse, kayıt defterine minimum bir giriş yapabilirsiniz. , bu herhangi bir yapılandırmada bulabileceğiniz bir konumdur. Veya Uygulama Verileri'nde verilen adda bir klasör arayın.

Belge ve Ayarlar klasörüme bakarsam, klasörleri ayarlamak için Unix nokta gösterimini kullanan birçok yazılım görüyorum: .p4qt .sqlworkbench .squirrel-sql .SunDownloadManager .xngr .antexplorer .assistant .CodeBlocks .dbvis .gimp-2.4 .jdictionary .jindent .jogl_ext (vb.)

ve Uygulama Verileri'nde, düzenleyici adlarına veya yazılım adlarına sahip çeşitli klasörler. En azından taşınabilir uygulamalar arasında mevcut eğilim gibi görünüyor ...
WinMerge biraz farklı bir yaklaşım kullanıyor, verileri kayıt defterinde depoluyor, ancak yapılandırma iletişim kutusunda Alma ve Verme seçeneklerini sunuyor.


Gördüğünüz Unix nokta gösterimi, muhtemelen tüm bu örneklerin, Windows geliştirme için en iyi uygulama olduğu için değil, taşınabilir açık kaynaklı projelerden kaynaklanmaktadır.
James

Aslında, bunun "en iyi uygulama" olduğunu söylemedim, ama yaygın bir uygulama ... :) Uygulama verilerindeki klasörler / are / en iyi uygulama, özellikle büyük veri için, ama aynı zamanda yedeklemeleri daha kolay olduğu için.
PhiLho

0

Kişisel olarak, yükleme komut dosyaları (un) tarafından kullanılmak üzere yükleme yollarını depolamak için kayıt defterini kullandım. Bunun tek olası seçenek olduğundan emin değilim, ancak mantıklı bir çözüm gibi görünüyordu. Bu, elbette yalnızca Windows'ta kullanımda olan bir uygulama içindi.



0

(tartışmaya geç ama) Kısa Cevap: Grup Politikası.

Müşterinizin BT departmanı, Windows veya yazdığınız veya paketlediğiniz bileşen (ler) ile ilgili bir bağlantı hızı veya özel bir hata mesajı veya bağlanmak için bir veritabanı sunucusu gibi ayarları zorunlu kılmak istiyorsa, bu yine de tipik bir durumdur Kayıt defterinde depolanan ayarlar olarak nihai tezahürünü yapan Grup İlkesi aracılığıyla yapılır. Bu tür politikalar, Windows başladığında veya kullanıcı oturum açtığında uygulanır.

Bileşenlerinizin ayarlarını kayıt defteri konumlarıyla eşleyebilen ve yöneticiye, yalnızca bu şekilde uygulanması anlamlı olan ayarları gösterirken, uygulaması gereken ilkeleri uygulamak için ortak bir arabirim sağlayan özel ADMX şablonları oluşturmak için araçlar vardır.


-1

Windows Kayıt Defteri'nin iyi bir fikir olduğuna inanıyorum, ancak uygulama geliştiricilerinin büyük suistimali ve Microsoft tarafından teşvik edilmeyen / zorunlu kılınmayan standart politikalar nedeniyle yönetilemez bir canavara dönüştü. Bahsettiğiniz nedenlerden dolayı kullanmaktan nefret ediyorum, ancak kullanmanın mantıklı olduğu bazı durumlar vardır:

  • Uygulamanız kaldırıldıktan sonra uygulamanızın izini bırakmak (örneğin, uygulamanın yeniden yüklenmesi durumunda kullanıcının tercihlerini hatırlayın)
  • Yapılandırma ayarlarını farklı uygulamalar - bileşenler arasında paylaşın

5
"[L] uygulamanız kaldırıldıktan sonra uygulamanızın bir izini bırakma" şeklindeki ilk düşünceniz konusunda size katılmıyorum. Uygulamanızın tamamen uyumlu olmasını "sistemimden çıkarın" desem tercih ederim. Sanırım kullanıcıya bir şeyi geride bırakmasının uygun olup olmadığını sorsanız farklı olurdu, ama o zaman bile muhtemelen bunun kaydedilmiş bir yapılandırma dosyası olmasını isterdim. Lisanslama vb. Buna rağmen, bilgisayarınızı satıyor ve yenisini satın alıyorsanız, sattığınız bilgisayara bağlı bir şey yerine yeni kurulumda yükleyebileceğiniz bir ayar dosyasına sahip olmayı tercih etmez misiniz?
AgentConundrum

2
Birçok uygulama bunu yapar ve özellikle de kullanıcının izni olmadan yaparsa bunun çok iyi bir şey olmadığını söylemekte haklısınız. Bununla birlikte, çoğu zaman kullanıcıların bir uygulamadan beklediği işlevselliktir (kullanıcıların çoğu kayıt defterinin ne olduğunu bilmez). Kullanıcılar, ayarlarını kaldırıp tekrar yüklediklerinde ayarlarını otomatik olarak sihirli bir şekilde geri bulmayı umuyorlar.
kgiannakakis

2
Sanırım burada bize bir kötü amaçlı yazılım yazarı bulduk. Sizden kaldırmanızı isterlerse, programınızdan asla bir başkasının sisteminde saçmalık bırakmayın. En azından onlara ayarları hatırlamak isteyip istemediklerini sorun. Bunu asla yapmayın. Ya bir lisans anahtarı saklarsanız ve ben bilgisayarımı satarsam? Ya programınız bilgisayarımda sorunlara neden oluyorsa ve düzeltmek için kaldırmayı denediysem? Kayıt defterinden kalan artıklar bana birçok soruna neden olabilir. Sadece yapma. Sadece yapma.
SnakeDoc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.