एप्लिकेशन सेटिंग सहेजने का सबसे अच्छा तरीका है


17

विंडोज में डिफ़ॉल्ट तरीका रजिस्ट्री है। यह आपको सिस्टम-वाइड और प्रति-उपयोगकर्ता सेटिंग्स को अलग करने की अनुमति देता है।

यूनिक्स में आपको सिस्टम-वाइड सेटिंग्स (प्रति उपयोगकर्ता सेटिंग्स के लिए सम्मेलन क्या है) के लिए / etc फ़ोल्डर में पाठ फ़ाइलों का उपयोग करना चाहिए।

कई नए कार्यक्रम (और विशेष रूप से पोर्टेबल होने के लिए डिज़ाइन किए गए) XML फ़ाइलों का उपयोग करते हैं।

  • नॉन-बीएलओबी सेटिंग्स को स्टोर करने का सबसे अच्छा तरीका (और स्थान) क्या है?
  • क्या हमें प्रत्येक सिस्टम डिफ़ॉल्ट का पालन करना चाहिए या एक एकीकृत समाधान होना चाहिए?
  • और सबसे अच्छा पोर्टेबल तरीका क्या है?

कृपया इस बारे में बहुत विशिष्ट रहें कि आपको "सर्वश्रेष्ठ" से क्या मतलब है।

3
@ Thorbjørn: सबसे अच्छा adj \
superbest

3
आप StackExchange साइटों पर "सर्वश्रेष्ठ" के अर्थ की विविधता पर चकित होंगे।

जवाबों:


23

नॉन-बीएलओबी सेटिंग्स को स्टोर करने का सबसे अच्छा तरीका (और स्थान) क्या है?

विंडोज पर, रजिस्ट्री का उपयोग करना स्वीकार्य लगता है। मेरी राय में, रजिस्ट्री एक खराब-तैयार प्रणाली थी, और इसके बजाय एक सरल पाठ फ़ाइल थीUsers\Username\AppData निर्देशिका प्राथमिकता दी जानी चाहिए। यह बैकअप लेना आसान है, उपयोगकर्ताओं के लिए संशोधित करने के लिए कम खतरनाक है, और सफाई करना आसान है।

लिनक्स और अधिकांश यूनिक्स पर, पसंदीदा स्थान /home/user/.config/appnameउपयोगकर्ता-विशिष्ट सेटिंग्स और /etc/वैश्विक (सिस्टम-वाइड) सेटिंग्स के लिए है। उपयोगकर्ता सेटिंग्स के लिए कम पसंदीदा (लेकिन स्वीकार्य) स्थान है ~/.appname, लेकिन यह आमतौर पर एहसान से बाहर हो रहा है। इन फ़ाइलों को उपयोगकर्ता-संपादन योग्य होना चाहिए, इसलिए एक मानव-पठनीय प्रारूप हमेशा पसंद किया जाता है।

मैं ज्यादातर लोगों से असहमत हूं कि XML गैर-ब्लॉब डेटा संग्रहीत करने के लिए एक स्वीकार्य प्रारूप है। यह मेरी राय में, आमतौर पर संरचित डेटा के बहुत छोटे टुकड़े होने के लिए एक अत्यधिक और अत्यधिक जटिल प्रारूप है। मैं YAML, JSON, ASN.1, नाम = मान जोड़े, या इसी तरह के प्रारूप में फाइलें देखना पसंद करता हूं। बहुत अधिक सिंटैक्स होने से उपयोगकर्ता के लिए गड़बड़ करना और फ़ाइल को अमान्य प्रारूप में छोड़ना बहुत आसान हो जाता है।

क्या हमें प्रत्येक सिस्टम डिफ़ॉल्ट का पालन करना चाहिए या एक एकीकृत समाधान होना चाहिए?

यह पूरी तरह से आपके ऊपर है, लेकिन कुछ बातों को ध्यान में रखें:

  • प्लेटफ़ॉर्म जैसे * निक्स की सख्त सीमाएँ हैं, जिन पर स्थान उपयुक्त हैं। विंडोज से ज्यादा सख्त। इसलिए:
    • आपको कुछ भी लिखने के लिए एकमात्र स्थान उपयोगकर्ता की होम निर्देशिका में है।
    • जब तक आपका आवेदन एक सिस्टम सेवा नहीं है; किस स्थिति में, सभी परिवर्तनशील डेटा फ़ाइलों को लिखा जाना चाहिए /var/। नॉनम्यूटेबल डेटा फ़ाइलों को आपके ऐप डायरेक्टरी में /usr/share/या में रखा जाना चाहिए/usr/local/share/ या/opt/
    • कॉन्फ़िगरेशन फ़ाइलों को एप्लिकेशन द्वारा कभी भी नहीं लिखा /etc/जाना चाहिए जब वह चल रहा हो, भले ही उन तक पहुंच हो। डिफ़ॉल्ट व्यवहार के लिए भंडार होना चाहिए और कुछ नहीं।/etc/
    • आपके आवेदन के लिए योजना तीन स्थानों में से एक में स्थापित होने के लिए: /usr/local/, /opt/appname, या /home/username/appname
    • यदि उन्हें बदलना है तो अन्य कॉन्फ़िगरेशन फ़ाइलों के साथ ब्लब्स को संग्रहीत किया जाना चाहिए। यह आमतौर पर उपयोगकर्ता-संपादन योग्य प्रारूप का उपयोग करने के लिए बेहतर होता है, इसलिए SQLite या बर्कले DB जैसा कुछ पसंद किया जाता है (क्योंकि प्रत्येक के लिए कमांड-लाइन टूल हैं), लेकिन इसकी आवश्यकता नहीं है।
  • विंडोज पर, आपके एप्लिकेशन को केवल उपयोगकर्ता निर्देशिका में लिखना चाहिए। डेटा फ़ाइलों के लिए मानकीकृत स्थान है Users\User\AppData। कहीं और स्वीकार्य नहीं लगता।
  • मैक ओएस एक्स पर, आपकी एप्लिकेशन सेटिंग्स को ~/Library/Preferencesअन्य एप्लिकेशन की सभी प्लिस्ट फ़ाइलों के साथ संग्रहीत किया जाना चाहिए । plistलगता है कि पसंदीदा प्रारूप है, लेकिन आप Apple दिशानिर्देशों के साथ दोबारा जांच करना चाहते हैं।

और सबसे अच्छा पोर्टेबल तरीका क्या है?

ईमानदार होने के लिए कोई "सर्वश्रेष्ठ" नहीं है। केवल मंच-विशिष्ट सीमाएँ और अपेक्षाएँ हैं। मेरी सिफारिश प्लेटफ़ॉर्म-विशिष्ट साधनों से चिपकना है, भले ही इसका अर्थ अधिक कोड लिखना हो।


1
मुझे लगता है कि Microsoft अब कुछ वर्षों के लिए रजिस्ट्री के उपयोग को हतोत्साहित कर रहा है - जो अच्छा है। AppData के लिए लेखन, जैसा कि आपने उल्लेख किया है, जाने का रास्ता है। .NET में (शायद Windows API में भी?) एक तरीका भी है जो सही रास्ता देता है।
मेटलमाइस्टर

एक पर्यावरण चर भी है:%APPDATA%
ग्रेफेड

@MetalMikester - हाँ, बिल्कुल हाजिर। AppData एक डोमेन वातावरण के लिए रोमिंग प्रोफ़ाइल द्वारा भी समर्थित है।
JBRWilkinson

सेटिंग्स! = config
Yousha Aleayoub

> In my opinion, the registry was a poorly-devised system, and instead a simple text file in the Users\Username\AppData directory should be preferred. @greyfade - लंबे समय तक विंडोज एपीआई डेवलपर, रेमंड चेन, इसे संबोधित करते हैं, और बताते हैं कि रजिस्ट्री पर पाठ फ़ाइलों का उपयोग करना बेहतर डिजाइन पैटर्न क्यों
मिक

8

विंडोज के तहत, का उपयोग करें %APPDATA%\appname। के तहत * NIX, का उपयोग करें ~/.appname। किसी भी प्लेटफ़ॉर्म के तहत निश्चित निर्देशिका नामों का उपयोग न करें, क्योंकि उपयोगकर्ता की होम निर्देशिका डिफ़ॉल्ट से भिन्न हो सकती है (यह नेटवर्क पर हो सकता है, उदाहरण के लिए)।

प्रारूप के लिए, जो भी आपको सबसे अच्छा लगता है उसका उपयोग करें। यह एक निर्णय है जो केवल आप अपने आवेदन के संदर्भ में कर सकते हैं। यह अनावश्यक है, और वास्तव में, यह करने के लिए "मानक" तरीका है कि अगर, "मानक" तरीका आपके विशेष कार्यक्रम के लिए सबसे अच्छा नहीं है।

उदाहरण के लिए, XML / JSON उपयोगकर्ता डेटा / कॉन्फ़िगरेशन को संग्रहीत करने का एक अच्छा तरीका हो सकता है यदि आपका एप्लिकेशन पहले से ही किसी अन्य चीज़ के लिए XML / JSON का उपयोग करता है। लेकिन अगर यह एक साधारण कॉन्फ़िगरेशन फ़ाइल है, तो निर्भरता का परिचय देकर अपने ऐप में ब्लोट क्यों जोड़ें? उस स्थिति में, var: value\nलाइनों के साथ एक साधारण पाठ फ़ाइल का उपयोग करना संभव है।

संपादित करें: ओएस के लिए बहुत अलग सम्मेलनों का उपयोग करने के बाद से "सबसे अच्छा" पोर्टेबल तरीका नहीं है। खूनी अच्छे कारण के बिना ओएस मानकों को न तोड़ें।

EDIT2: यदि आप स्वयं को सिस्टम-व्यापी सेटिंग बनाते हुए पाते हैं /etcया HKEY_LOCAL_MACHINE, अपने आप से पूछें कि क्या सेटिंग वास्तव में वैश्विक है। फिर 5 मिनट रुकें और फिर से खुद से पूछें। यदि उत्तर अभी भी हाँ है, तो हर तरह से, वैश्विक सेटिंग करें। याद रखें, एक सामान्य उपयोगकर्ता के पास इस तक पहुँच नहीं है /etcया HKEY_LOCAL_MACHINEऐसा करने से, आप यह सुनिश्चित कर रहे हैं कि कोई भी बिना व्यवस्थापक अधिकार के आपके ऐप को स्थापित न कर सके।


पहला पैराग्राफ किसी को Path.Combine या कुछ समान का उपयोग करने की अनुमति देता है और इस प्रकार एक बार रिश्तेदार रूट लोकेशन को% APPDATA% या ~ पर सेट करता है और कोड को बाकी काम करने देता है, EDIT2 के लिए वास्तव में एक क्रॉस-प्लेटफ़ॉर्म समाधान मौजूद नहीं है जो मुझे पता है का। हो सकता है कि ऐसे लोग हैं जिन्होंने उस उद्देश्य के लिए एक क्रॉस-प्लेटफ़ॉर्म कॉन्फ़िगरेशन लाइब्रेरी लिखी है, यह कम से कम एक अच्छा विचार होगा ...
तमारा विज्समैन

1
@ टॉमीज: निश्चित रूप से किसी भी सक्षम डेवलपर को यह पता लगाने में सक्षम होना चाहिए कि आपको हर जगह शाब्दिक उपयोग करने की आवश्यकता नहीं है))। वैरिएबल किसके लिए हैं।
चिन्मय कांची

1
~/.config/applicatonतेजी से * nix पर पसंदीदा स्थान बनता जा रहा है।
ग्रेफेड

@ ग्रेफेड: मुझे वास्तव में कभी भी इसका एहसास नहीं हुआ, लेकिन आप सही हैं। मेरी मशीन पर, डेटा को स्टोर करने वाले एप्लिकेशन का लगभग एक चौथाई भाग ~ऐसा करता है ~/.config/appname
चिन्मय कांची

एप्लिकेशन का एक पूरा गुच्छा विंडोज में ~ / .appname का उपयोग करता है (जो आपके उपयोगकर्ता प्रोफ़ाइल के लिए समान है, दस्तावेज़ नहीं) और यह बहुत कष्टप्रद है। वे फ़ोल्डर खुद को नहीं छिपाते हैं!
एलन पीयर्स

3

मैं कोशिश करता हूं और रजिस्ट्री से बाहर रहता हूं, यह तरीका है। काश हर कोई होता।

मुझे xml config फाइल या एक बिन फाइल या कभी-कभार लोकल डेटाबेस (SQLite) रखना पसंद है।


रजिस्ट्री से बाहर रखने के लिए +1। मुझे अब यह नहीं मिल रहा है, लेकिन मुझे यह याद है कि एमएस में किसी ने स्वीकार किया था कि रजिस्ट्री में गलती थी।
चिन्मय कांची

1
XML भाग को छोड़कर आपके साथ सहमत हैं। मैं सरल सेटिंग आवश्यकता और जटिल एप्लिकेशन के लिए SQLite के लिए ini (या साधारण पाठ फ़ाइल) का उपयोग करूंगा।
कोडिज्म

वे बस अब स्वीकार कर रहे हैं? मैं आपको बता सकता था कि 1995 में वापस! मैक ओएस क्लासिक ने इसे सही पाया: एक प्रीफ़ॉर्म फ़ोल्डर आपको कॉन्फिगर जानकारी संग्रहीत करने के लिए एक केंद्रीकृत स्थान देने के लिए, प्रत्येक ऐप की अपनी फ़ाइल को सहेजने के साथ जब मैंने पहली बार रजिस्ट्री देखी, तो मैं ऐसा था, "क्या माइक्रोसॉफ्ट ने कभी अपने सभी अंडे एक टोकरी में नहीं डालने के बारे में सुना है?"
मेसन व्हीलर

1
मुझे लगता है कि OS सेटिंग्स (जैसे फ़ाइल एक्सटेंशन पंजीकरण, आदि) डालने के लिए एक जगह है, यह ठीक है। लेकिन अगर माइक्रोसॉफ्ट ने इसे केवल पढ़ने के लिए एपीआई के रूप में प्रकाशित किया, तो संभवतः उन पर मुकदमा चलाया जाएगा और इसे किसी भी तरह से उपयुक्त बनाना होगा।
µBio

@Chinmay, @Mason, रजिस्ट्री ISN'T एक गलती है क्योंकि रजिस्ट्री केवल स्टोर कॉन्फ़िगरेशन डेटा से अधिक FAR करती है (देखें: समूह नीति, डोमेन, प्रतिकृति)। गलती यह है कि Microsoft ने इसे डेवलपर्स के लिए कैसे पेश किया, और इसका उपयोग करने के तरीके पर किसी अच्छे मानक की कमी है। यह ऐप डेटा के लिए एक डंपिंग ग्राउंड के रूप में समाप्त हुआ, जो कि कभी भी इसका मतलब नहीं था।
मैट ओलेनिक

3

मेरा उत्तर चिन्मय कांची के उत्तर और बायोबैंकबॉल के उत्तर का संयोजन है ।

सरल कॉन्फ़िगरेशन के लिए XML / Json, जटिल के लिए SQLite, बड़े विन्यास डिफ़ॉल्ट OS अनुप्रयोग फ़ोल्डर या डिफ़ॉल्ट OS उपयोगकर्ता फ़ोल्डर पर पार्क किए जाते हैं जब कॉन्फ़िगरेशन उपयोगकर्ता पर निर्भर होते हैं। दोनों का उपयोग किया जा सकता है।


2

विंडोज में, मैं एप्लिकेशन सेटिंग को AppDataफ़ोल्डर में रखूंगा


1

उपयोगकर्ता सेटिंग्स आमतौर पर में हैं

/home/<user>/.<application> 

इसलिए उदाहरण के लिए irssi सेटिंग्स /home//.irssi/config हैं


लेकिन यह एक यूनिक्स सम्मेलन है। विंडोज के बारे में क्या? और लिनक्स में, उपनिर्देशिका के साथ उपयोगकर्ता के घर निर्देशिका को बाढ़ नहीं करता है? क्यों नहीं /home/<user>/etc/application?
जादूगर

@ लॉरेंज़ो: उपयोगकर्ता के होम डायरेक्टरी को भरना शायद ही कभी एक समस्या है।
चिन्मय कांची

1
~/.config/applicationचीजों को समेकित रखने में मदद करने के लिए कॉन्फ़िगरेशन सेटिंग्स को तेजी से बढ़ाया जा रहा है । मैं इस आंदोलन से सहमत हूँ।
ग्रेफेड

1
@ लॉरेंज़ो: यह बिल्कुल वैसा ही है, जैसा कि कॉन्फ़िगरेशन फ़ाइलों को संग्रहीत करने का विंडोज सम्मेलन AppData
ग्रेफेड

1
@ क्रिस: कोई रास्ता नहीं! :-)
जादूगर 79

1

मुझे लगता है कि पसंदीदा मंच-विशिष्ट तंत्र का उपयोग करना सबसे अच्छा है। उदाहरण के लिए, ओएस एक्स पर, पसंदीदा तंत्र ~ / लाइब्रेरी / प्राथमिकता में एक संपत्ति सूची रखने के लिए है, और कोको एपीआई में सेटिंग्स को संग्रहीत करने और पुनः प्राप्त करने के लिए एक बहुत ही सरल इंटरफ़ेस है।

यदि आपका ऐप क्रॉस-प्लेटफ़ॉर्म है, तो आप इसे क्लास या व्हाट्सएप से दूर कर सकते हैं।


0

केवल एक चीज जो मैं रजिस्ट्री को लिखता हूं, वह ऐप का स्थान है, ताकि इंस्टॉल करने वाले और अपडेट करने वाले इसे आसानी से पा सकें। बाकी सब कुछ / AppData / Company / App में फाइलों में संग्रहीत है


-2

जावा ऐप्स के लिए मुझे लगता है कि gson एक अच्छा विकल्प है। अपनी सेटिंग्स ऑब्जेक्ट बनाएं और उन्हें JSON में कनवर्ट करने के लिए और इसके विपरीत गॉन का उपयोग करें। कुछ क्रमबद्ध बूँद के बजाय मानव पठनीय होने का लाभ है।

संपादित करें: ठीक है, तो इसकी शायद इतनी सामान्य नहीं ...


-2

यदि आप .NET में लिख रहे हैं, तो आप यह पता लगाने के लिए System.Environment.SpecialFolders का उपयोग कर सकते हैं कि कॉन्फ़िगरेशन या यहां तक ​​कि कुछ डेटा को बचाने के लिए आप किन फ़ोल्डर स्थानों का उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.