Apa yang ingin saya capai sangat sederhana: Saya memiliki aplikasi Windows Forms (.NET 3.5) yang menggunakan jalur untuk membaca informasi. Jalur ini dapat dimodifikasi oleh pengguna, dengan menggunakan formulir opsi yang saya berikan.
Sekarang, saya ingin menyimpan nilai jalur ke file untuk digunakan nanti. Ini akan menjadi salah satu dari banyak pengaturan yang disimpan ke file ini. File ini akan duduk langsung di folder aplikasi.
Saya mengerti ada tiga opsi yang tersedia:
- File ConfigurationSettings (appname.exe.config)
- Daftar
- File XML khusus
Saya membaca bahwa file konfigurasi .NET tidak diramalkan untuk menyimpan nilai kembali ke sana. Adapun registri, saya ingin mendapatkan sejauh mungkin darinya.
Apakah ini berarti saya harus menggunakan file XML khusus untuk menyimpan pengaturan konfigurasi?
Jika demikian, saya ingin melihat contoh kode dari itu (C #).
Saya telah melihat diskusi lain tentang hal ini, tetapi masih belum jelas bagi saya.
sumber
Jawaban:
Jika Anda bekerja dengan Visual Studio maka cukup mudah untuk mendapatkan pengaturan yang tetap. Klik kanan pada proyek di Solution Explorer dan pilih Properties. Pilih tab Pengaturan dan klik hyperlink jika pengaturan tidak ada.
Gunakan tab Pengaturan untuk membuat pengaturan aplikasi. Visual Studio membuat file
Settings.settings
danSettings.Designer.settings
yang berisi kelas tunggal yangSettings
diwarisi dari ApplicationSettingsBase . Anda dapat mengakses kelas ini dari kode Anda untuk membaca / menulis pengaturan aplikasi:Teknik ini berlaku untuk konsol, Formulir Windows, dan jenis proyek lainnya.
Perhatikan bahwa Anda perlu mengatur properti lingkup pengaturan Anda. Jika Anda memilih Ruang lingkup aplikasi maka Pengaturan. Kesalahan. <Properti Anda> akan menjadi hanya-baca.
Referensi: Cara: Menulis Pengaturan Pengguna saat Jalankan dengan C # - Microsoft Documents
sumber
Settings.Default.SomeProperty = 'value'; Settings.Default.Save();
bekerja seperti pesona. Atau apakah itu karena saya punya pengaturan Pengguna?Settings.Default.Save()
tidak ada yang salah. Seperti yang dinyatakan oleh @aku dalam jawaban, pengaturan ruang lingkup aplikasi hanya-baca: save tidak efektif untuk mereka. Gunakan PortableSettingsProvider tersuai untuk menyimpan pengaturan lingkup pengguna ke app.config yang berlokasi di mana exe bukan yang ada di folder AppData pengguna. Tidak, umumnya tidak baik, tapi saya menggunakannya selama pengembangan untuk menggunakan pengaturan yang sama dari kompilasi ke kompilasi (tanpa itu, mereka pergi folder pengguna unik baru dengan setiap kompilasi).Jika Anda berencana menyimpan ke file dalam direktori yang sama dengan yang dapat dieksekusi, berikut ini adalah solusi bagus yang menggunakan format JSON :
sumber
DEFAULT_FILENAME
, panggil sajasettings.Save(theFileToSaveTo)
; Menjadi semua topi,DEFAULT_FILENAME
seharusnya konstan . Jika Anda ingin properti baca-tulis, buat satu dan minta konstruktor untuk mengaturnyaDEFAULT_FILENAME
. Kemudian miliki nilai argumen defaultnull
, uji untuk ini dan gunakan properti Anda sebagai nilai default. Ini sedikit lebih mengetik, tetapi memberi Anda antarmuka yang lebih standar.System.Web.Extensions.dll
jika Anda belum melakukannya.Registri tidak dapat digunakan. Anda tidak yakin apakah pengguna yang menggunakan aplikasi Anda, memiliki hak yang cukup untuk menulis ke registri.
Anda dapat menggunakan
app.config
file untuk menyimpan pengaturan level aplikasi (yang sama untuk setiap pengguna yang menggunakan aplikasi Anda).Saya akan menyimpan pengaturan khusus pengguna dalam file XML, yang akan disimpan di Penyimpanan Terpencil atau di direktori SpecialFolder.ApplicationData .
Di samping itu, mulai dari. NET 2.0, dimungkinkan untuk menyimpan nilai kembali ke
app.config
file.sumber
The
ApplicationSettings
kelas tidak mendukung menyimpan pengaturan ke app.config berkas. Itu sangat banyak dengan desain; aplikasi yang berjalan dengan akun pengguna yang diamankan dengan benar (pikirkan Vista UAC) tidak memiliki akses tulis ke folder instalasi program.Anda dapat melawan sistem dengan
ConfigurationManager
kelas. Tetapi solusi sepele adalah pergi ke desainer Pengaturan dan mengubah ruang lingkup pengaturan untuk Pengguna. Jika itu menyebabkan kesulitan (katakanlah, pengaturan itu relevan untuk setiap pengguna), Anda harus meletakkan fitur Opsi Anda dalam program terpisah sehingga Anda dapat meminta prompt elevasi privilege. Atau lepaskan menggunakan pengaturan.sumber
Argumen registry / configurationSettings / XML masih tampak sangat aktif. Saya telah menggunakan semuanya, karena teknologinya telah berkembang, tetapi favorit saya didasarkan pada sistem Threed yang dikombinasikan dengan Isolated Storage .
Sampel berikut memungkinkan penyimpanan objek bernama properti ke file dalam penyimpanan terisolasi. Seperti:
Properti dapat dipulihkan menggunakan:
Ini hanya sampel, tidak menyarankan praktik terbaik.
sumber
Saya ingin berbagi perpustakaan yang saya bangun untuk ini. Ini adalah perpustakaan kecil, tetapi peningkatan besar (IMHO) lebih dari file pengaturan.
Perpustakaan disebut Jot (GitHub) . Ini adalah artikel Proyek Kode lama yang saya tulis tentangnya.
Begini cara Anda menggunakannya untuk melacak ukuran dan lokasi jendela:
Keuntungan dibandingkan dengan file .settings: Ada kode yang jauh lebih sedikit, dan itu jauh lebih sedikit kesalahan karena Anda hanya perlu menyebutkan setiap properti sekali .
Dengan file pengaturan Anda perlu menyebutkan setiap properti lima kali: sekali ketika Anda secara eksplisit membuat properti dan tambahan empat kali dalam kode yang menyalin nilai bolak-balik.
Penyimpanan, serialisasi, dll. Sepenuhnya dapat dikonfigurasi. Ketika objek target dibuat oleh wadah IoC , Anda dapat [menghubungkannya] [] sehingga berlaku pelacakan secara otomatis ke semua objek yang diputuskannya, sehingga semua yang perlu Anda lakukan untuk membuat properti persisten adalah menampar [dilacak] atribut di atasnya.
Ini sangat dapat dikonfigurasi, dan Anda dapat mengkonfigurasi: - ketika data tetap ada dan diterapkan secara global atau untuk setiap objek yang dilacak - bagaimana serialisasi - di mana itu disimpan (misalnya file, database, online, penyimpanan terisolasi, registri) - aturan yang dapat membatalkan penerapan / data yang ada untuk properti
Percayalah, perpustakaan adalah kedudukan tertinggi!
sumber
Cara sederhana adalah dengan menggunakan objek data konfigurasi, simpan sebagai file XML dengan nama aplikasi di Folder lokal dan saat startup membacanya kembali.
Berikut adalah contoh untuk menyimpan posisi dan ukuran formulir.
Objek data konfigurasi sangat diketik dan mudah digunakan:
Kelas manajer untuk menyimpan dan memuat:
Sekarang Anda bisa membuat sebuah instance dan menggunakan di form memuat dan menutup acara:
Dan file XML yang dihasilkan juga dapat dibaca:
sumber
c:\program files\my application
folder, sehingga penghematan pengaturan membuat kesalahan. Saya ingin menyimpan file xml di AppData, tetapi saya hanya ingin tahu apakah ada cara yang jelas untuk mengatasi masalah ini, karena pendekatan ini tampaknya berhasil untuk Anda.Saya tidak suka solusi yang diusulkan untuk menggunakan
web.config
atauapp.config
. Coba baca XML Anda sendiri. Lihatlah File Pengaturan XML - Tidak ada lagi web.config .sumber
Opsi lain, alih-alih menggunakan file XML khusus, kita dapat menggunakan format file yang lebih ramah pengguna: file JSON atau YAML.
Anda dapat menyimpan file pengaturan Anda di beberapa folder khusus (untuk semua pengguna dan per pengguna) seperti yang tercantum di sini Environment.SpecialFolder Enumeration dan beberapa file (hanya baca default, per peran, per pengguna, dll.)
Jika Anda memilih untuk menggunakan beberapa pengaturan, Anda dapat menggabungkan pengaturan itu: Misalnya, menggabungkan pengaturan untuk default + BasicUser + AdminUser. Anda dapat menggunakan aturan Anda sendiri: yang terakhir menimpa nilainya, dll.
sumber
"Apakah ini berarti saya harus menggunakan file XML khusus untuk menyimpan pengaturan konfigurasi?" Tidak, belum tentu. Kami menggunakan SharpConfig untuk operasi semacam itu.
Misalnya, jika file konfigurasi seperti itu
Kami dapat mengambil nilai seperti ini
Ini kompatibel dengan .NET 2.0 dan lebih tinggi. Kami dapat membuat file konfigurasi dengan cepat dan kami dapat menyimpannya nanti.
Sumber: http://sharpconfig.net/
GitHub: https://github.com/cemdervis/SharpConfig
sumber
Sejauh yang saya tahu, .NET mendukung pengaturan tetap menggunakan fasilitas pengaturan aplikasi bawaan:
sumber
Kadang-kadang Anda ingin menyingkirkan pengaturan yang disimpan dalam file web.config atau app.config tradisional. Anda ingin kontrol berbutir halus atas penyebaran entri pengaturan Anda dan desain data yang terpisah. Atau persyaratannya adalah mengaktifkan penambahan entri baru saat runtime.
Saya bisa membayangkan dua pilihan bagus:
Keuntungan dari versi yang diketik sangat adalah nama pengaturan dan nilai yang diketik sangat. Tidak ada risiko mencampur nama atau tipe data. Kerugiannya adalah bahwa lebih banyak pengaturan harus dikodekan, tidak dapat ditambahkan saat runtime.
Dengan versi berorientasi objek keuntungannya adalah bahwa pengaturan baru dapat ditambahkan saat runtime. Tetapi Anda tidak memiliki nama dan nilai yang sangat diketik. Harus berhati-hati dengan pengidentifikasi string. Harus tahu tipe data yang disimpan sebelumnya ketika mendapatkan nilai.
Anda dapat menemukan kode dari kedua implementasi yang berfungsi penuh di SINI .
sumber
Ya, adalah mungkin untuk menyimpan konfigurasi - tetapi itu sangat tergantung pada cara Anda memilih untuk melakukannya. Biarkan saya menjelaskan perbedaan teknis sehingga Anda dapat memahami opsi yang Anda miliki:
Pertama, Anda perlu membedakan, apakah Anda ingin menggunakan applicationSettings atau AppSettings dalam file Anda
*.exe.config
(aliasApp.config
dalam Visual Studio) - ada perbedaan mendasar, dijelaskan di sini .Keduanya menyediakan berbagai cara untuk menyimpan perubahan:
config.Save(ConfigurationSaveMode.Modified);
, di mana konfigurasi didefinisikan sebagaiconfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
).Properties.Settings.Default.Save();
) itu akan ditulis pada basis per-pengguna, disimpan di tempat khusus (misalnyaC:\Documents and Settings\USERID\Local Settings\Application Data\FIRMNAME\WindowsFormsTestApplicati_Url_tdq2oylz33rzq00sxhvxucu5edw2oghw\1.0.0.0
). Seperti yang disebutkan Hans Passant dalam jawabannya, ini karena pengguna biasanya memiliki hak terbatas untuk File Program dan tidak dapat menulis ke sana tanpa memohon prompt UAC. Kerugiannya adalah jika Anda menambahkan kunci konfigurasi di masa depan, Anda perlu menyinkronkannya dengan setiap profil pengguna.Catatan: Seperti yang disebutkan dalam pertanyaan, ada opsi ke - 3: Jika Anda memperlakukan file konfigurasi sebagai dokumen XML, Anda dapat memuat, memodifikasi, dan menyimpannya dengan menggunakan
System.Xml.Linq.XDocument
kelas. Tidak perlu menggunakan file XML khusus, Anda dapat membaca file konfigurasi yang ada; untuk elemen kueri, Anda bahkan dapat menggunakan kueri Linq. Saya telah memberikan contoh di sini , periksa fungsiGetApplicationSetting
di sana dalam jawabannya.Jika Anda memerlukan enkripsi untuk melindungi nilai-nilai Anda, periksa jawaban ini .
sumber
sumber