Kapan - dan mengapa - Anda harus menyimpan data di Windows Registry?

126

Sebagai pengembang, alat yang menyimpan konfigurasi / opsi dalam registri adalah kutukan dalam hidup saya. Saya tidak dapat dengan mudah melacak perubahan pada opsi-opsi itu, tidak dapat dengan mudah memindahkannya dari mesin ke mesin, dan itu semua membuat saya benar-benar merindukan masa lalu yang baik dari file .INI ...

Saat menulis aplikasi saya sendiri, apa - jika ada - yang harus saya pilih untuk dimasukkan ke dalam registri daripada di file konfigurasi kuno, dan mengapa?

Roddy
sumber
Saya bekerja dengan aplikasi lawas sekarang yang menyimpan informasi dalam registri (.NET app), dan itu membuat saya gila.
George Stocker

Jawaban:

75
  • Awalnya (WIN3) konfigurasi disimpan dalam file WIN.INI di direktori windows.
  • Masalah: WIN.INI tumbuh terlalu besar.
  • Solusi (Win31): file INI individu dalam direktori yang sama dengan program.
  • Masalah: Program itu dapat diinstal pada jaringan dan dibagikan oleh banyak orang.
  • Solusi (Win311): file INI individu dalam direktori Window pengguna.
  • Masalah: Banyak orang mungkin berbagi folder windows, dan itu seharusnya hanya-baca saja.
  • Solusi (Win95): Registri dengan bagian terpisah untuk setiap pengguna.
  • Masalah: Registri tumbuh terlalu besar.
  • Solusi (WinXP): Blok besar data individual dipindahkan ke folder Data Aplikasi milik pengguna sendiri.
  • Masalah: Baik untuk sejumlah besar data, tetapi agak rumit untuk jumlah kecil.
  • Solusi (.NET): sejumlah kecil data tetap, hanya-baca yang disimpan dalam file .config (Xml) dalam folder yang sama dengan aplikasi, dengan API untuk membacanya. (Baca / tulis atau data khusus pengguna tetap di registri)
James Curran
sumber
16
Unix: config disimpan dalam $ HOME / .your-app Di sana, diselesaikan dalam satu iterasi.
Leonel
33
Solusi Unix juga jauh dari ideal: $ HOME penuh dengan file-file dot, dan Anda tidak tahu apa yang dilakukan kebanyakan dari mereka.
Grep
2
@Leonel XDG sebenarnya mengamanatkan bahwa Anda harus meletakkan file konfigurasi Anda di dalam $HOME/.config/your-app/, solusi yang dibuat untuk mengatasi masalah objek @grep. Dan, mengejutkan, Linux modern (dan siapa pun di * BSD cukup gila untuk menggunakan GNOME) juga memiliki registri di gconfsuite. FOSS melahirkan pilihan, itu pasti;)
new123456
1
@ grep, Re " tidak tahu apa yang kebanyakan dari mereka lakukan ", Kenapa tidak? Selain itu, mengasapi hampir tidak sebanding dengan Windows.
Pacerier
16

Datang pada ini baik dari perspektif pengguna dan perspektif programmer saya harus mengatakan sebenarnya tidak ada alasan yang baik untuk memasukkan sesuatu ke dalam registri kecuali itu seperti asosiasi file, atau pengaturan mesin spesifik.

Saya berasal dari aliran pemikiran yang mengatakan bahwa suatu program harus dapat dijalankan dari mana pun ia diinstal, bahwa instalasi harus sepenuhnya dapat dipindahkan di dalam mesin, atau bahkan ke mesin lain dan tidak mempengaruhi jalannya.

Setiap opsi yang dapat dikonfigurasi, atau dll yang diperlukan dll, jika tidak dibagikan harus berada di subdirektori direktori instalasi, sehingga seluruh instalasi mudah dipindahkan.

Saya menggunakan banyak utilitas yang lebih kecil seperti program, jadi jika tidak dapat diinstal pada usb stick dan dicolokkan ke komputer lain dan jalankan, maka itu bukan untuk saya.

Jimoc
sumber
4
Tetapi instalasi sering dilakukan di bawah kontrol admin, sedangkan pengaturan pembaruan harus dilakukan di bawah kontrol pengguna. Bayangkan mencoba memperbarui pengaturan - aplikasi yang berjalan di bawah identitas pengguna yang ingin menulis ke direktori yang dibatasi hanya untuk akses admin. Ini adalah salah satu hal yang ingin ditangani oleh registri.
Cheeso
@Cheeso, Solusinya adalah agar setiap pengguna memiliki salinan yang dapat dieksekusi. Untuk menghemat ruang, bukan salinan asli tetapi hanya salinan palsu (pointer).
Pacerier
12

Kebijakan Microsoft:

  • Sebelum windows 95, kami menggunakan file ini untuk data aplikasi.
  • Di era windows 95 - XP, kami menggunakan registri.
  • Dari windows Vista, kami menggunakan file ini meskipun sekarang berbasis xml.

Registri tergantung pada mesin. Saya tidak pernah menyukainya karena semakin lambat dan hampir tidak mungkin menemukan hal yang Anda butuhkan. Itu sebabnya saya suka ini sederhana atau file pengaturan lainnya. Anda tahu di mana mereka berada (folder aplikasi atau folder pengguna) sehingga mudah dibawa-bawa, dan dapat dibaca manusia.

Toon Krijthe
sumber
1
Bisakah Anda memberikan tautan asli ke dokumen yang menyatakan kebijakan microsoft ini? Dan ketika Anda mengatakan kebijakan, maksud Anda, inilah yang dilakukan Microsoft, atau apakah maksud Anda inilah yang direkomendasikan Microsoft kepada pengembang yang membuat aplikasi untuk Windows?
Cheeso
1
ps: raymond Chen dari Microsoft telah menyatakan bahwa file INI tidak digunakan lagi untuk Registry, dan menjelaskan alasannya. blogs.msdn.com/oldnewthing/archive/2007/11/26/6523907.aspx Ia juga menyatakan bahwa file XML memiliki banyak kelemahan yang sama dengan file ini.
Cheeso
8
File pengaturan XML = file INI yang lebih sulit diurai
Robert Fraser
3
@Fraser jika Anda merasa parsing XML sulit, Anda berada dalam bisnis yang salah.
SnakeDoc
@SnakeDoc, Lebih keras bukan berarti lebih sulit. Ini berarti parsing dan lag lebih lambat.
Pacerier
12

Kapan - Anda dipaksa karena integrasi warisan atau karena sysadmin pelanggan Anda mengatakan "harus begitu" atau karena Anda berkembang dalam bahasa yang lebih lama yang membuatnya lebih sulit untuk menggunakan XML.

Mengapa - Terutama karena registri tidak portabel seperti menyalin file konfigurasi yang duduk di sebelah aplikasi (dan disebut hampir sama).

Jika Anda menggunakan .Net2 + Anda punya file App.Config dan User.Config dan Anda tidak perlu mendaftarkan DLL di registri jadi menjauhlah dari itu.

File konfigurasi memiliki masalah mereka sendiri (lihat di bawah), tetapi ini dapat dikodekan sekitar dan Anda dapat mengubah arsitektur Anda.

  • Masalah: Aplikasi membutuhkan pengaturan yang dapat dikonfigurasi.
  • Solusi: Simpan pengaturan dalam file (WIN.INI) di folder Windows - gunakan judul bagian untuk mengelompokkan data (Win3.0).
  • Masalah: File WIN.INI tumbuh terlalu besar (dan menjadi berantakan).
  • Solusi: Simpan pengaturan dalam file INI dalam folder yang sama dengan aplikasi (Win3.1).
  • Masalah: Perlu pengaturan khusus pengguna.
  • Solusi: Menyimpan pengaturan pengguna dalam file INI khusus pengguna di direktori Window pengguna (Win3.11) atau bagian khusus pengguna dalam file INI aplikasi.
  • Masalah: Keamanan - beberapa pengaturan aplikasi harus hanya-baca.
  • Solusi: Registri dengan keamanan serta bagian khusus pengguna dan bagian mesin (Win95).
  • Masalah: Registri tumbuh terlalu besar.
  • Solusi: Registri khusus pengguna dipindahkan ke user.dat di folder "Data Aplikasi" milik pengguna dan hanya dimuat saat masuk (WinNT).
  • Masalah: Di lingkungan perusahaan besar Anda masuk ke beberapa mesin dan harus menyiapkan SETIAP SATU.
  • Solusi: Bedakan antara profil lokal (Pengaturan Lokal) dan roaming (Data Aplikasi) (WinXP).
  • Masalah: Tidak dapat xcopy menyebarkan atau memindahkan aplikasi seperti sisa .Net.
  • Solusi: APP.CONFIG file XML dalam folder yang sama dengan aplikasi -, mudah dibaca, mudah dimanipulasi, mudah dipindahkan, dapat dilacak jika diubah (.Net1).
  • Masalah: Masih perlu menyimpan data khusus pengguna dengan cara yang serupa (mis. Xcopy deploy).
  • Solusi: USER.CONFIG file XML di folder lokal atau roaming pengguna dan sangat diketik (.Net2).
  • Masalah: File CONFIG peka huruf besar-kecil (tidak intuitif bagi manusia), memerlukan "tag" buka / tutup yang sangat spesifik, string koneksi tidak dapat ditetapkan pada saat run-time, proyek setup tidak dapat menulis pengaturan (semudah registri), tidak dapat dengan mudah menentukan file pengguna.config dan pengaturan pengguna ditiup dengan setiap revisi baru diinstal.
  • Solusi: Gunakan anggota ITEM untuk mengatur string koneksi saat runtime, tulis kode dalam kelas Installer untuk mengubah App.Config selama instalasi dan gunakan pengaturan aplikasi sebagai default jika pengaturan pengguna tidak ditemukan.
AndrewD
sumber
Ini jauh lebih lengkap daripada jawaban yang disetujui. Terima kasih @AndrewD.
rotman
8

Apakah dunia akan berakhir jika Anda menyimpan beberapa posisi jendela dan daftar item yang paling baru digunakan dalam registri Windows? Sejauh ini itu berhasil bagi saya.

HKEY-CURRENT-USER adalah tempat yang bagus untuk menyimpan data pengguna sepele dalam jumlah kecil. Itu untuk apa. Tampaknya konyol untuk tidak menggunakan untuk tujuan yang dimaksudkan hanya karena orang lain telah menyalahgunakannya.

Angus Glashier
sumber
dan hebat dalam merusak dirinya sendiri ... itu nilai tambah. Lebih sedikit pekerjaan yang harus dilakukan pengguna ...
SnakeDoc
4

Pengaturan yang ingin Anda miliki di profil roaming pengguna mungkin harus masuk dalam registri, kecuali Anda benar-benar ingin pergi ke upaya mencari folder Data Aplikasi pengguna dengan tangan. :-)

Chris Jester-Young
sumber
4

Registri membaca dan menulis adalah threadsafe tetapi file tidak. Jadi itu tergantung pada apakah program Anda satu threaded atau tidak.

Martin
sumber
2

Jika Anda sedang mengembangkan aplikasi baru dan Anda peduli tentang portabilitas Anda harus TIDAK PERNAH menyimpan data di windows registry karena OS lain tidak memiliki (windows) registry (duh note - ini mungkin jelas tetapi sering diabaikan).

Jika Anda hanya mengembangkan untuk platform Win ... cobalah untuk menghindarinya sebanyak mungkin. File konfigurasi (mungkin dienkripsi) adalah solusi yang jauh lebih baik. Tidak ada keuntungan dalam menyimpan data ke dalam registri - (penyimpanan terisolasi adalah solusi yang jauh lebih baik misalnya jika Anda menggunakan .NET).

JohnIdol
sumber
Ini sebagian benar. Mono telah mengimplementasikan namespace Microsoft.win32 untuk pendaftar - kecuali ia menyimpannya dalam file di ~ / .mono / Registry dalam file xml, dan ditangani secara transparan. Sekarang jika Anda bisa mengaktifkan penanganan xml untuk aplikasi apa pun, apa pun platformnya ...
Robert P
Catatan: hanya tersedia bagi Anda jika Anda sedang menulis aplikasi .NET / Mono.
Robert P
Registri memang mendapatkan keuntungan: data lebih mudah diakses di aplikasi multi-utas. Lebih penting lagi, ini memungkinkan Anda untuk memisahkan data konfigurasi yang spesifik mesin vs spesifik pengguna. Aplikasi Anda tidak harus mengetahui siapa yang masuk ketika mengakses HKEY_CURRENT_USER. Anda benar tentang portabilitas.
James
2

Agak di luar topik, tetapi karena saya melihat orang-orang khawatir tentang portabilitas, pendekatan terbaik yang pernah saya gunakan adalah kelas QSettings Qt. Ini abstrak penyimpanan pengaturan (registri pada Windows, file preferensi XML pada Mac OS dan file Ini di Unix). Sebagai klien kelas, saya tidak perlu menghabiskan siklus otak bertanya-tanya tentang registri atau apa pun, itu Hanya Bekerja (tm).

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

rlerallut
sumber
Tampaknya url tidak berfungsi lagi. Referensi pembaruan harus qt-project.org/doc/qt-5/QSettings.html#details
Eineki
0

Biasanya, jika Anda tidak meletakkan pengaturan dalam registri, Anda menggunakannya sebagian besar untuk mendapatkan pengaturan Windows saat ini, mengubah asosiasi file, dll.
Sekarang, jika Anda perlu mendeteksi apakah perangkat lunak Anda sudah diinstal, Anda dapat membuat entri minimal dalam registri , itulah lokasi yang dapat Anda temukan kembali dalam konfigurasi apa pun. Atau cari folder dengan nama yang diberikan di Data Aplikasi.

Jika saya melihat folder Dokumen dan Pengaturan saya, saya melihat banyak perangkat lunak menggunakan notasi Unix dot untuk folder pengaturan:. .jindent .jogl_ext (dll.)

dan dalam Data Aplikasi, berbagai folder dengan nama editor atau nama perangkat lunak. Sepertinya menjadi tren saat ini, setidaknya di antara aplikasi portabel ...
WinMerge menggunakan pendekatan yang sedikit berbeda, menyimpan data dalam registri, tetapi menawarkan Impor dan Ekspor opsi dalam dialog konfigurasi.

PhiLho
sumber
Notasi Unix dot yang Anda lihat mungkin karena semua contoh tersebut adalah porting proyek open-source, bukan karena itu adalah praktik terbaik untuk pengembangan Windows.
James
Memang, saya tidak mengatakan itu "praktik terbaik", tetapi praktik umum ... :) Folder dalam data aplikasi / adalah / praktik terbaik, terutama untuk data besar, tetapi juga karena mereka lebih mudah untuk dicadangkan.
PhiLho
0

Secara pribadi saya telah menggunakan registri untuk menyimpan jalur instalasi untuk digunakan oleh skrip instalasi (tidak). Saya tidak yakin apakah ini satu-satunya pilihan yang mungkin, tetapi sepertinya solusi yang masuk akal. Ini untuk aplikasi yang hanya digunakan pada Windows saja.

chillysapien
sumber
0

Dalam. NET benar-benar TIDAK pernah ada kebutuhan.

Berikut adalah 2 contoh yang menunjukkan cara menggunakan projek Proyek untuk melakukan ini.

Contoh-contoh ini melakukan ini oleh Properti Proyek Pengguna Windows, tetapi hal yang sama dapat / dapat dilakukan oleh Aplikasi juga.

Lebih banyak di sini:

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

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

TheUberOverLord
sumber
0

(terlambat ke diskusi tetapi) Jawaban Singkat: Kebijakan Grup.

Jika departemen TI pelanggan Anda ingin menegakkan pengaturan terkait dengan Windows atau komponen yang Anda tulis atau bundling, seperti kecepatan tautan, atau pesan kesalahan khusus, atau server database untuk terhubung, ini biasanya masih dilakukan melalui Kebijakan Grup, yang menjadikan manifestasinya sebagai pengaturan yang disimpan dalam registri. Kebijakan tersebut diberlakukan sejak Windows mulai atau pengguna masuk.

Ada alat untuk membuat templat ADMX khusus yang dapat memetakan pengaturan komponen Anda ke lokasi registri, dan memberi administrator antarmuka umum untuk menegakkan kebijakan yang perlu ditegakkan sambil menunjukkan hanya pengaturan yang bermakna untuk menerapkan cara ini.

Spencer
sumber
-1

Saya percaya bahwa Windows Registry adalah ide yang bagus, tetapi karena penyalahgunaan hebat dari pengembang aplikasi dan kebijakan standar yang tidak didorong / diamanatkan oleh Microsoft tumbuh menjadi binatang yang tidak terkendali. Saya benci menggunakannya karena alasan yang Anda sebutkan, namun ada beberapa kesempatan yang masuk akal untuk menggunakannya:

  • Meninggalkan jejak aplikasi Anda setelah aplikasi Anda dihapus instalasinya (mis. Ingat preferensi pengguna jika aplikasi diinstal lagi)
  • Bagikan pengaturan konfigurasi antara berbagai aplikasi - komponen
kgiannakakis
sumber
5
Saya tidak setuju dengan Anda mengenai poin pertama Anda, "[l] menyimpan jejak aplikasi Anda setelah aplikasi Anda dihapus instalasinya". Saya lebih suka jika saya mengatakan "hapus diri Anda dari sistem saya" bahwa aplikasi Anda sepenuhnya mematuhi. Saya kira itu akan berbeda jika Anda bertanya kepada pengguna apakah boleh meninggalkan sesuatu, tetapi bahkan mungkin saya ingin itu menjadi file konfigurasi yang disimpan. Meskipun demikian, perizinan, dll., Jika Anda menjual komputer Anda dan membeli yang baru, tidakkah Anda lebih suka memiliki file pengaturan yang dapat Anda muat pada instalasi baru daripada sesuatu yang terikat pada komputer yang Anda jual?
AgentConundrum
2
Banyak aplikasi melakukan ini dan Anda benar untuk mengatakan bahwa itu bukan hal yang sangat baik, terutama jika mereka melakukannya tanpa izin pengguna. Namun seringkali fungsi yang diharapkan pengguna dari suatu aplikasi (mayoritas pengguna tidak tahu apa itu registri). Pengguna hanya berharap menemukan pengaturan mereka kembali secara otomatis secara ajaib, ketika mereka mencopot dan memasang kembali.
kgiannakakis
2
Saya pikir kami menemukan kami pembuat malware di sini. Jangan pernah meninggalkan omong kosong dari program Anda di sistem seseorang jika mereka meminta Anda untuk menghapus instalan. Setidaknya tanyakan pada mereka apakah mereka ingin mengingat pengaturan, dll. Jangan hanya melakukannya. Bagaimana jika Anda menyimpan kunci lisensi dan saya menjual komputer saya? Bagaimana jika program Anda menyebabkan masalah pada komputer saya, dan saya mencoba mencopot pemasangan untuk memperbaikinya? Nah, sisa registri Anda bisa menyebabkan saya banyak masalah. Tapi jangan lakukan itu. Hanya saja, jangan.
SnakeDoc