2008-10-16 17 views
7

मुख्य रूप से विंडोज़ के लिए एप्लिकेशन सेटिंग्स को संग्रहीत करने के लिए एक मानक मानक तरीका है, लेकिन अन्य प्लेटफ़ॉर्म पर जाने के लिए भी आसान है।एप्लिकेशन सेटिंग्स

वहाँ मूलतः सेटिंग्स के 4 समूहों है मैं करना चाहते हैं:,

  • वैश्विक सेटिंग सभी उपयोगकर्ताओं को प्रभावित है, और मशीनों के बीच
  • वैश्विक सिस्टम सेटिंग से ले जाया जा सकता है, सभी उपयोगकर्ताओं को प्रभावित है, लेकिन यह प्रणाली के लिए विशिष्ट (उदाहरण के लिए ग्राफिक्स विकल्प, उदाहरण के लिए ग्राफिक्स विकल्प)
  • उपयोगकर्ता सेटिंग्स, उपयोगकर्ता सेटिंग्स जो सिस्टम (जैसे ध्वनि मात्रा)
  • उपयोगकर्ता सिस्टम सेटिंग्स, उस सिस्टम के लिए विशिष्ट उपयोगकर्ता सेटिंग्स (जैसे ग्राफिक्स विकल्प जो हार्डवेयर निर्भर हैं))

प्रत्येक स्तर पिछले स्तर को ओवरराइड करता है, जो "वैश्विक सेटिंग्स" को बड़े पैमाने पर अनुप्रयोगों के डिफ़ॉल्ट होने की इजाजत देता है, उपयोगकर्ता सेटिंग्स द्वारा चुने गए विकल्पों को संग्रहीत करने के साथ। पहले दो मूल रूप से डिफ़ॉल्ट होंगे जहां उपयोगकर्ता सेटिंग नहीं है (उदाहरण के लिए एक नए उपयोगकर्ता के लिए)।

मैंने कार्यों के एक सेट को लागू करने पर विचार किया, जिसे मैं विभिन्न प्रणालियों (आईएनआई फाइलों के माध्यम से होने की संभावना) के लिए लागू कर सकता था, लेकिन क्या यह सबसे अच्छा तरीका है?

(C++)

namespace config 
{ 
    void Init(const std::string &AppName); 
    //updates config for keys/sections that don't exist (ie don't overwrite changes by advanced users by rewriting the entire file) 
    void Defaults   (std::map<std::string,std::map<std::string,std::string> > &Map); 
    void SystemDefaults (std::map<std::string,std::map<std::string,std::string> > &Map); 

    void Set    (const std::string &Section, const std::string &Key, const std::string &Value); 
    void SetSystem   (const std::string &Section, const std::string &Key, const std::string &Value); 

    void SetUser   (const std::string &Section, const std::string &Key, const std::string &Value); 
    void SetUserSystem  (const std::string &Section, const std::string &Key, const std::string &Value); 

    std::string GetValue (const std::string &Section, const std::string &Key); 
} 

मैं जानता हूँ कि खिड़कियां इस तरह सेटिंग्स के लिए निर्देशिका का एक सेट है, लेकिन मेरी जरूरतों के लिए इन सही dirs हैं?

संपादित करें: मैं विंडोज़ पंजीकरण के बजाय फ़ाइलों (आईएनआई या एक्सएमएल) के साथ जाऊंगा। हालांकि इन कॉन्फ़िगरेशन फ़ाइलों को प्रत्येक ओएस के तहत रखने के लिए सबसे अच्छे स्थान हैं?

विस्टा के तहत मुझे ये मिला, जो मेरे समूहों में फिट लगते हैं, हालांकि पुराने विंडोज संस्करणों (मुझे win2000, XP, आदि का समर्थन करने की आवश्यकता है), और मैक/लिनक्स के पास अपने सिमेलर फ़ोल्डर्स हैं?

  • वैश्विक सेटिंग - <SYSDRIVE> \ Users \ डिफ़ॉल्ट \ AppData \
  • वैश्विक सिस्टम सेटिंग रोमिंग - <SYSDRIVE> \ Users \ डिफ़ॉल्ट \ AppData \ Local
  • उपयोगकर्ता सेटिंग - <SYSDRIVE> \ Users \ < उपयोगकर्ता > \ AppData \
  • उपयोगकर्ता सिस्टम सेटिंग रोमिंग - <SYSDRIVE> \ Users \ < उपयोगकर्ता > \ AppData \ Local

उत्तर

1

रहे हैं (कम से कम) तीन उचित विकल्प:

रजिस्ट्री: यह पोर्टेबिलिटी और रिश्तेदार अस्पष्टता की वजह से मेरी कम से कम पसंदीदा है।

पर्यावरण चर: मैं एक (केवल एक) का उपयोग करने की अनुशंसा करता हूं जो आपकी सामग्री को रखा जाता है - एक "स्थापना निर्देशिका" या कुछ ऐसे।

फ़ाइलें: उपयोगकर्ता/होम निर्देशिका (या इसके उपनिर्देशिका में) और परियोजना/उत्पाद निर्देशिका दोनों चीजें संग्रहीत करने के लिए उपयुक्त हैं।

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

+0

अच्छी फ़ाइलें मेरे पसंदीदा तरीके हैं, क्योंकि वही सामान छोटे प्लेटफ़ॉर्म वाले सभी प्लेटफॉर्म पर काम करेगा। मुख्य समस्या यह है कि फाइलें होनी चाहिए, और एक साफ इंटरफ़ेस कैसे प्रदान करें (उदाहरण के लिए माइक्रोसॉफ्ट एप्स नहीं चाहता ऐप्स में फ़ाइलों के साथ काम कर रहे हैं ... आईडी% username% .ini से खुश रहें)। –

6

आप एक बढ़ावा उपयोगकर्ता हैं, तो आप program options पुस्तकालय पर एक नज़र हो सकता है, यह config फ़ाइलों के साथ-साथ वातावरण चर और (बेशक) कमांड लाइन विकल्पों का उपयोग कर समर्थन करता है।

यह पोर्टेबल होने के लिए डिज़ाइन किया गया है, ताकि आपके क्रॉस-प्लेटफ़ॉर्म सिरदर्द को कम किया जा सके।

संबंधित मुद्दे