2011-02-08 20 views
14

के दौरान बाहरी कॉन्फ़िगरेशन फ़ाइल से कॉन्फ़िगरेशन सेटिंग्स को दोबारा लोड करें मैं सी # में एक गेम सर्वर लिख रहा हूं और सर्वर चल रहा है, जबकि कॉन्फ़िगरेशन फ़ाइल से सेटिंग्स को फिर से लोड या रीफ्रेश करना चाहता हूं।रन-टाइम

आदर्श रूप में मैं एक XML फ़ाइल में सेटिंग्स को बचाने के लिए चाहते हैं, जबकि खेल सर्वर चल रहा है फ़ाइल संपादित करें और फिर फ़ाइल से सेटिंग को फिर से लोड करने के लिए सर्वर कमांड भेजने की क्षमता।

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

मुझे क्या उपयोग करना चाहिए?

+0

यह प्रश्न अपेक्षाकृत व्यक्तिपरक लगता है। – Amy

+3

आप इसे सेट अप कर सकते हैं ताकि सर्वर 'System.IO.FileSystemWatcher' के साथ फ़ाइल सेटिंग्स को स्वतः लोड कर सके। यदि आप कस्टम 'सेटिंग' क्लास का उपयोग करते हैं, तो आप क्लास को लॉक कर सकते हैं, इसे फ़ाइल से पुनः लोड कर सकते हैं, इसे अनलॉक कर सकते हैं (यदि आप एकाधिक थ्रेड का उपयोग कर रहे हैं)। फ़ाइल/सीरियलाइजेशन से/लिखना/लिखना .NET में इतना छोटा है कि शायद वह नहीं है जिसके लिए आपको सहायता चाहिए। –

+0

मैंने अतीत में FileSystemWatcher भी उपयोग किया है। यह तेज़, आसान है, और काम पूरा हो जाता है। –

उत्तर

13

http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx

कस्टम कॉन्फ़िगरेशन अनुभाग का उपयोग करें, अनुभाग के स्थान अटारी को सेट करके app.config से बाहरी कॉन्फ़िगरेशन फ़ाइल में अनुभागों को हुकअप करें। सभी एक्सएमएल लदान और क्रमबद्धता

कोड CarelZA द्वारा प्रदान की कस्टम वर्गों द्वारा किया जाता है:

सबसे पहले, ConfigurationManager config अनुभाग द्वारा आवेदन के विन्यास कैश, और आप ConfigurationManager.RefreshSection() रद्द करने के लिए कॉल कर सकते हैं एक विशिष्ट खंड के लिए कैश।

app.config में मैं कहा:

<configSections> 
    <section name="gameSettings" 
      type="System.Configuration.NameValueSectionHandler,system , Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null"/> 
</configSections> 
<gameSettings configSource="game.config"/> 

मैं एक फ़ाइल "game.config" कहा जाता है और सेट बनाया "हमेशाकॉपी" "आउटपुट निर्देशिका में कॉपी करने के लिए"।

game.config में:

<gameSettings> 
    <add key="SettingName" value="SettingValue" /> 
</gameSettings> 

तब कोड में, किसी भी सेटिंग तक पहुँचने के लिए: जब पुनः लोड आदेश को भेजा जाता है

settings = (NameValueCollection) ConfigurationManager.GetSection("gameSettings"); 
return settings["SettingName"]; 

और किसी भी समय खेल config फिर से लोड करने सर्वर:

ConfigurationManager.RefreshSection("gameSettings"); 
0

एक्सएमएल सीरियलाइजेशन के लिए नौकरी की तरह लगता है! एक्सएमएल को मैन्युअल रूप से पार्स करने और संपादित करने के बजाय, आप सेटिंग ऑब्जेक्ट बनाकर इसे एक्सएमएल में क्रमबद्ध करके, और संशोधनों को करने की आवश्यकता होने पर इसे डी/सीरियलाइज करके आसानी से प्राप्त कर सकते हैं। इस तरह, आप विन्यास फाइलों को स्वैप कर सकते हैं।

using System.Xml.Serialization;

उदाहरण के लिए, आप वस्तु

public class Settings 
{ 
    public string SomeProperty {get; set;} 
    public string SomeProperty2 {get; set;} 
} 

यह सहेजें के रूप में अपने डिस्क के लिए, हो सकता था

var settings = new Settings {SomeProperty="Hello", SomeProperty2="Joe"}; 
var fs = new FileStream("settings.xml"); 
var xs = new XmlSerializer(settings.GetType()); 
xs.Serialize(fs,settings); 

यह के रूप में वापस पढ़ें,

var fs = new FileStream("settings.xml"); 
var settings = (Settings)fs.Deserialize(fs); 
+0

रीन द्वारा जवाब देखें। कॉन्फ़िगरेशन मैनेजर इस उद्देश्य के लिए पहले से मौजूद है और मुझे पता चला कि मुझे जो चाहिए उसे करने के लिए इसका उपयोग कैसे किया जाए। खुद को एक्सएमएल फाइलों को पढ़ने और विश्लेषण करने की जरूरत नहीं है। – CarelZA

0

चेक बाहर System.Runtime.Caching (.NET 4.0) में MemoryCache

  • लोड एक्सएमएल फ़ाइल
  • इसकी सामग्री आप उन्हें चाहते हैं जो कुछ भी प्रतिनिधित्व में
  • स्टोर में एक HostFileChangeMonitor इसे देखने के साथ कैश में उत्पादन पार्स करें: आप अपने आप को एक साधारण वर्ग जो निम्नलिखित चरणों का प्रदर्शन करती है लिख सकता है - फ़ाइल को बदलते समय इसे स्वचालित रूप से कैश से हटा दिया जाएगा

उपरोक्त में से कोई भी करने से पहले, आप यह देखने के लिए कैश की जांच करेंगे कि सेटिंग्स की पूर्व-कैश की गई प्रति मौजूद है या केवल अगर यह करते हैं तो आगे बढ़ें sn't।

इस तरह अपना दृष्टिकोण रोल करने का लाभ यह है कि आप एप्लिकेशन के पुनरारंभ को ट्रिगर नहीं करते हैं, जैसा कि आपके web.config या app.config फ़ाइलों में संग्रहीत AppSettings के मामले में है। (यह कहा जा सकता है कि इस इस को प्राप्त करने का एकमात्र तरीका नहीं है)

+0

आप जानते हैं कि HostFileChangeMonitor .NET 4 के साथ नया है, है ना? –

+0

हाँ, मैं जवाब में बताता हूं :) –

+0

रीन द्वारा जवाब देखें। कॉन्फ़िगरेशन मैनेजर इस उद्देश्य के लिए पहले से मौजूद है और मुझे पता चला कि मुझे जो चाहिए उसे करने के लिए इसका उपयोग कैसे किया जाए। खुद को एक्सएमएल फाइलों को पढ़ने और विश्लेषण करने की जरूरत नहीं है। इसके अलावा, कॉन्फ़िगरेशन मैनेजर अनुभाग द्वारा कॉन्फ़िगरेशन कैश करता है, इसलिए यह मेरे लिए सबकुछ करता है। – CarelZA

4

अनुरोध के अनुसार, एक जवाब के रूप में मेरी टिप्पणी पोस्ट:

आप इसे FileSystemWatcher के साथ ऐसा सर्वर स्वत: लोड फ़ाइल सेटिंग्स सेट कर सकते हैं । यदि आप एक कस्टम Settings कक्षा का उपयोग करते हैं, तो आप बस कक्षा को लॉक कर सकते हैं, इसे फ़ाइल से पुनः लोड कर सकते हैं और इसे अनलॉक कर सकते हैं (यदि आप एकाधिक थ्रेड का उपयोग कर रहे हैं)।

पढ़ना/लिखना/फ़ाइल या क्रमबद्धता से लिखना .NET में इतना छोटा है कि शायद यह नहीं है कि आपको मदद की ज़रूरत है और इसे करने के कई विकल्प हैं।

+0

आपका उत्तर मुझे बताता है कि एक बदलती कॉन्फ़िगरेशन फ़ाइल की जांच कैसे करें, लेकिन कॉन्फ़िगरेशन फ़ाइल को प्रबंधित करने के लिए मुझे क्या उपयोग करना चाहिए। साथ ही, मैंने निर्दिष्ट किया है कि मैं कॉन्फ़िगरेशन फ़ाइल को पुनः लोड करने के लिए एक कमांड का उपयोग करूंगा, यह स्वचालित रूप से होने की आवश्यकता नहीं है। लेकिन यह जानकारीपूर्ण है, वैसे भी धन्यवाद। – CarelZA