2008-08-25 12 views
52

मेरे पास एक .NET 2.0 विंडोज फॉर्म एप्लिकेशन है। स्टोर उपयोगकर्ता सेटिंग्स (विंडोज दिशानिर्देशों पर विचार करने) के लिए सबसे अच्छी जगह कहां है?.NET अनुप्रयोग के लिए उपयोगकर्ता सेटिंग्स को स्टोर करने का सबसे अच्छा तरीका क्या है?

कुछ लोगों ने Application.LocalUserAppDataPath पर इशारा किया।

C: हालांकि, कि एक फ़ोल्डर संरचना की तरह बनाता है \ दस्तावेज़ और सेटिंग्स \ user_name \ Local Settings \ Application Data \ company_name \ product_name \ PRODUCT_VERSION \

अगर मैं जारी के संस्करण 1 मेरी वहां एक एक्सएमएल फ़ाइल को एप्लिकेशन और स्टोर करें, फिर संस्करण 2 जारी करें, जो एक अलग फ़ोल्डर में बदल जाएगा, है ना? एप्लिकेशन संस्करण के बावजूद, मैं सेटिंग्स को स्टोर करने के लिए प्रति उपयोगकर्ता, एक फ़ोल्डर रखना पसंद करूंगा।

+0

मुझे लगता है [यह आलेख] (http://blog.kowalczyk.info/kb/getting-user- विशिष्ट- अनुप्रयोग- डेटा- निर्देशिका-for-.net-winforms-apps.html) समाधान को शामिल करता है। –

+0

[अद्यतन लिंक] (https://blog.kowalczyk.info/article/10b/Getting-user- विशिष्ट- अनुप्रयोग- डेटा-directory.html) जोर्गेस टिप्पणी से। – tm1

उत्तर

74

मुझे अंतर्निहित Application Settings का उपयोग करना पसंद है। तो फिर तुम सेटिंग्स डिजाइनर का उपयोग कर के लिए समर्थन में निर्माण किया है अगर आप डिजाइन समय में चाहते हैं, या कार्यावधि में उपयोग करने के लिए:

// read setting 
string setting1 = (string)Settings.Default["MySetting1"]; 
// save setting 
Settings.Default["MySetting2"] = "My Setting Value"; 

// you can force a save with 
Properties.Settings.Default.Save(); 

यह रूप में आप (में संस्करण के साथ का वर्णन एक समान फ़ोल्डर संरचना में सेटिंग्स को संग्रहीत करता है राह)। हालांकि, के लिए एक सरल कॉल के साथ:

Properties.Settings.Default.Upgrade(); 

एप्लिकेशन को सभी पिछले संस्करणों सेटिंग्स में में बचाने के लिए खींच लेंगे

+1

अपग्रेड() टिप के लिए धन्यवाद। –

+3

'सेटिंग्स.डिफॉल्ट' के बारे में एकमात्र परेशान चीज यह है कि आपको कोको में 'NSUserDefaults' के विपरीत, मैन्युअल रूप से उन्हें मैन्युअल रूप से बनाने की आवश्यकता है जो सेटिंग मौजूद नहीं होने पर शून्य लौटाती है। – Ali

+3

यह किस नामस्थान में है? मुझे लगता है कि मेरे पास सेटिंग्स ऑब्जेक्ट तक पहुंच नहीं है।नेट 4 Winforms ऐप। – NickG

1

सेटिंग्स मानक कुंजी-मूल्य जोड़े (स्ट्रिंग-स्ट्रिंग) हैं। अगर मैं मदद करता हूं तो मैं उन्हें एक एक्सएमएल फ़ाइल में लपेट सकता हूं।

मैं रजिस्ट्री के बजाय फ़ाइल सिस्टम का उपयोग करना चाहता हूं। यह बनाए रखना आसान लगता है। समर्थन परिदृश्यों में, यदि उपयोगकर्ता को सेटिंग्स को मैन्युअल रूप से खोलने/बदलने की आवश्यकता है, तो यह फ़ाइल सिस्टम में आसान होगा।

0

मैं उत्पाद संस्करण को छोड़कर आपके द्वारा पोस्ट की गई फ़ोल्डर सूची में जाउंगा। अपडेट जारी होने के बाद आप सेटिंग रीसेट नहीं करना चाहते हैं।

मैं वास्तव में डीबग/पदचिह्न कारक की वजह से उपयोगकर्ता सेटिंग्स के लिए रजिस्ट्री से दूर जा रहा हूं। मैं वर्तमान में केवल रजिस्ट्री में कुछ मूल सेटिंग्स (विंडो आकार, स्थिति, डेटा फ़ाइल का संस्करण) संग्रहीत कर रहा हूं, और अगर कोई अपडेट खराब हो जाता है या उपयोगकर्ता दूसरी मॉनीटर खो देता है और वह कहां है तो मैं और अधिक समस्याएं चलाता हूं आवेदन खोल रहा था। उनमें से कुछ regedit को समझने के लिए पर्याप्त समझदार हैं, लेकिन बाकी के लिए उन्हें एक पुन: स्थापित करना है, जो जल्दी है, लेकिन मुझे लगता है कि वे थोड़ा सा गुस्से में हैं। फ़ाइल आधारित संस्करण के साथ, मुझे बस इतना करना होगा कि उन्हें नोटपैड में एक एक्सएमएल फ़ाइल खोलें और त्वरित ट्विक करें।

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

मुझे पता है कि इसमें कुछ सुरक्षा व्यापार हैं, लेकिन मैं जिस डेटा को सॉर्ट कर रहा हूं वह उस कारण से महत्वपूर्ण नहीं है, और मुझे एप्लिकेशन के आकार के कारण किसी भी प्रदर्शन हिट का सामना नहीं करना पड़ेगा।

2

एक दृष्टिकोण है कि अतीत में मेरे लिए काम किया है एक सेटिंग वर्ग बनाने के लिए किया गया है और। फ़ाइल सिस्टम में लिखने के लिए एक्सएमएल क्रमबद्धता का प्रयोग करें। आप सेटिंग ऑब्जेक्ट्स का संग्रह बनाकर और इसे क्रमबद्ध करके इस अवधारणा को बढ़ा सकते हैं।फ़ाइल सिस्टम के प्रबंधन के बारे में चिंता किए बिना आपके पास सभी उपयोगकर्ताओं के लिए एक ही स्थान पर आपकी सभी सेटिंग्स होंगी।

इससे पहले कि कोई मुझे आंशिक रूप से पहिया का आविष्कार करने के लिए कोई फ्लाक देता है, तो मुझे कुछ चीजें कहने दें। एक के लिए, फ़ाइल को क्रमबद्ध करने और लिखने के लिए कोड की केवल कुछ पंक्तियां हैं। दूसरा, यदि आपके पास कोई ऑब्जेक्ट है जिसमें आपकी सेटिंग्स हैं, तो आपको ऐप सेट करने पर ऐप सेटिंग्स ऑब्जेक्ट पर एकाधिक कॉल करने की ज़रूरत नहीं है। और आखिरकार, उन अनुप्रयोगों को जोड़ना बहुत आसान है जो आपके अनुप्रयोग स्थिति का प्रतिनिधित्व करते हैं, जिससे एप्लिकेशन लोड होने पर आपको लंबे समय से चलने वाले कार्य को फिर से शुरू करने की अनुमति मिलती है।

+0

यदि आप कस्टम एक्सएमएल सीरियलाइजेशन बनाने के इच्छुक हैं, तो इसे एक ही एप्लिकेशन सेटिंग में क्यों क्रमबद्ध नहीं करें? इस तरह आप ऐप सेटिंग्स बुनियादी ढांचे का उपयोग करने के लिए मिलता है। एक serializable वर्ग या प्रकार कनवर्टर बनाएँ और फिर ऐप सेटिंग्स संवाद का उपयोग कर कक्षा आयात करें। –

4

या अपनी सेटिंग्स को xml फ़ाइल में लिखें और इसे Isolated Storage का उपयोग करके सहेजें। आपके द्वारा उपयोग किए जाने वाले स्टोर के आधार पर यह इसे एप्लिकेशन डेटा फ़ोल्डर में सहेजता है। आप एक रोमिंग सक्षम स्टोर भी चुन सकते हैं जिसका अर्थ है कि जब उपयोगकर्ता किसी भिन्न कंप्यूटर पर लॉग ऑन करता है तो सेटिंग्स उनके साथ चलती हैं।

0

पृथक भंडारण मुख्य रूप से ClickOnce का उपयोग करके वितरित अनुप्रयोगों के लिए उपयोग किया जाता है और एक सुरक्षित सैंडबॉक्स में चलाया जाता है। आधार पथ आपके लिए तय किया गया है और आप इसे अपने कोड में अनुमानित नहीं कर पाएंगे। पथ "\ LocalSettings \ ApplicationData \ IsolatedStorage \ ejwnwe.302 \ kfiwemqi.owx \ url.asdaiojwejoieajae जैसे कुछ होगा ....", वह सभी मित्रवत नहीं। आपकी स्टोरेज स्पेस भी सीमित है।

Ryan Farley has it right

7

.NET अनुप्रयोगों में एक अंतर्निहित सेटिंग्स तंत्र है जिसका उपयोग करना आसान है। मेरी राय में, इसके साथ समस्या यह है कि यह उन सेटिंग्स को एक अस्पष्ट निर्देशिका में बंद करता है और अंतिम उपयोगकर्ता इसे नहीं ढूंढ पाएंगे। इसके अलावा, बस डिबग से रिलीज बिल्डिंग में स्विच करने से इस निर्देशिका का स्थान बदल जाता है, जिसका अर्थ है कि एक कॉन्फ़िगरेशन में सहेजी गई कोई भी सेटिंग दूसरे में खो जाती है।

इन और अन्य कारणों से, मैं my own settings code for Windows Forms के साथ आया था। यह .NET के साथ आता है जितना धीमा नहीं है, लेकिन यह अधिक लचीला है, और मैं इसे हर समय उपयोग करता हूं।

1

मैं बस पाठ फ़ाइल अपनी सेटिंग्स स्टोर करने के लिए कुछ तरीकों की कोशिश और मैं सबसे अच्छा रास्ता मिल गया:

फ़ाइल आवेदन फ़ोल्डर में संग्रहीत उपयोग करने के लिए, settings.txt: (अंदर सेटिंग्स फ़ाइल स्वीकृत टिप्पणियों, कोशिश // टिप्पणी)

// settings मूल्य

Settings.Get("name", "Ivan"); 

// settings मूल्य

स्थापित करने के लिए प्राप्त करने के लिए
Settings.Set("name", "John"); 

का उपयोग कर:

using System; 
using System.Collections.Generic; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Windows.Forms; 

// आप के साथ अनुभाग का नाम भी स्टोर कर सकते हैं,

बस जोड़ने के नाम अनुभाग सेट (SECTION_NAME, नाम, मूल्य) का उपयोग करें और (SECTION_NAME, नाम, मूल्य) प्राप्त करने के लिए
public static class Settings 
{ 
    private static string SECTION = typeof(Settings).Namespace;//"SETTINGS"; 
    private static string settingsPath = Application.StartupPath.ToString() + "\\settings.txt"; 
    [DllImport("kernel32")] 
    private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); 
    [DllImport("kernel32")] 
    private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); 
    public static String GetString(String name) 
    { 
     StringBuilder temp = new StringBuilder(255); 
     int i = GetPrivateProfileString(SECTION,name,"",temp,255,settingsPath); 
     return temp.ToString(); 
    } 
    public static String Get(String name, String defVal) 
    { 
     return Get(SECTION,name,defVal); 
    } 
    public static String Get(string _SECTION, String name, String defVal) 
    { 
     StringBuilder temp = new StringBuilder(255); 
     int i = GetPrivateProfileString(_SECTION, name, "", temp, 255, settingsPath); 
     return temp.ToString(); 
    } 
    public static Boolean Get(String name, Boolean defVal) 
    { 
     return Get(SECTION, name, defVal); 
    } 
    public static Boolean Get(string _SECTION, String name, Boolean defVal) 
    { 
     StringBuilder temp = new StringBuilder(255); 
     int i = GetPrivateProfileString(_SECTION,name,"",temp,255,settingsPath); 
     bool retval=false; 
     if (bool.TryParse(temp.ToString(),out retval)) 
     { 
      return retval; 
     } else 
     { 
      return retval; 
     } 
    } 
    public static int Get(String name, int defVal) 
    { 
     return Get(SECTION, name, defVal); 
    } 
    public static int Get(string _SECTION, String name, int defVal) 
    { 
     StringBuilder temp = new StringBuilder(255); 
     int i = GetPrivateProfileString(SECTION,name,"",temp,255,settingsPath); 
     int retval=0; 
     if (int.TryParse(temp.ToString(),out retval)) 
     { 
      return retval; 
     } else 
     { 
      return retval; 
     } 
    } 
    public static void Set(String name, String val) 
    { 
     Set(SECTION, name,val); 
    } 
    public static void Set(string _SECTION, String name, String val) 
    { 
     WritePrivateProfileString(_SECTION, name, val, settingsPath); 
    } 
    public static void Set(String name, Boolean val) 
    { 
     Set(SECTION, name, val); 
    } 
    public static void Set(string _SECTION, String name, Boolean val) 
    { 
     WritePrivateProfileString(_SECTION, name, val.ToString(), settingsPath); 
    } 
    public static void Set(String name, int val) 
    { 
     Set(SECTION, name, val); 
    } 
    public static void Set(string _SECTION,String name, int val) 
    { 
     WritePrivateProfileString(SECTION, name, val.ToString(), settingsPath); 
    } 
} 
संबंधित मुद्दे

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