2009-11-28 14 views
20

मैं एक साधारण वर्ग XmlFileHelper है पर फ़ाइल प्रकार है:C# xml.Load() ताला लगा डिस्क के कारण त्रुटियों

System.IO.IOException: The process cannot access the file ''C:\CvarUAT\ReportWriterSettings.xml'' **because it is being used by another process** 

:

public class XmlFileHelper 
{ 
    #region Private Members 

    private XmlDocument xmlDoc = new XmlDocument(); 
    private string xmlFilePath; 

    #endregion 

    #region Constructor 

    public XmlFileHelper(string xmlFilePath) 
    { 
     this.xmlFilePath = xmlFilePath; 
     xmlDoc.Load(xmlFilePath); 
    } 

    #endregion 

    #region Public Methods 

    public XmlNode SelectSingleNode(string xPathQuery) 
    { 
     return xmlDoc.SelectSingleNode(xPathQuery); 
    } 

    public string GetAttributeValueByName(XmlNode node, string attributeName) 
    { 
     return node.Attributes.GetNamedItem(attributeName).Value; 
    } 

    #endregion 

    #region Public Properties 

    public string XmlFilePath 
    { 
     get 
     { 
      return xmlFilePath; 
     } 
    } 

    #endregion 
} 

मुद्दा मैं लोड पर निम्न त्रुटि हो रही है है ऐसा तब होता है जब इस वर्ग का उपयोग उपरोक्त xml फ़ाइल को लोड करने का प्रयास करने वाले समानांतर में चल रहे घटक के दो चलने वाले उदाहरणों द्वारा किया जाता है, यह वैध व्यवहार है और एप्लिकेशन द्वारा आवश्यक है।

मैं केवल एक बार एक्सएमएल डिस्क में पढ़ना चाहता हूं और डिस्क पर फ़ाइल का कोई संदर्भ जारी करना चाहता हूं और उस बिंदु से स्मृति प्रतिनिधित्व में उपयोग करना चाहता हूं।

मुझे लगता है कि लोड एक पठनीय फैशन में काम करता है और फ़ाइल को लॉक करने की कोई आवश्यकता नहीं होगी, वांछित परिणाम प्राप्त करने और इस मुद्दे को पाने के लिए मेरा सबसे अच्छा तरीका क्या है?

धन्यवाद

उत्तर

20

यह तुम क्या फ़ाइल से की जरूरत पर निर्भर करता है,

आप इसे की जरूरत है threasdsafe आप लोड हो रहा है लॉक करने के लिए एक म्युटेक्स impliment करने की आवश्यकता होगी होने के लिए उदाहरण के बीच,

यदि आपको वास्तव में थ्रेड सुरक्षित लोडिंग की आवश्यकता नहीं है (यानी फ़ाइल कभी नहीं बदली जाती है) तो आप इसे फाइलस्ट्रीम के माध्यम से लोड कर सकते हैं और XmlDocument को लोड कर सकते हैं धारा

  FileStream xmlFile = new FileStream(xmlFilePath, FileMode.Open, 
FileAccess.Read, FileShare.Read); 
      xmlDoc.Load(xmlFile); 
+0

मैं इसे अभी आज़मा रहा हूं, धन्यवाद – m3ntat

+0

उत्कृष्ट यह चाल है! – m3ntat

-1

कोशिश:

xml.Load(
     new StreamReader(
      new FileStream(
        path, 
        FileMode.Open, 
        FileAccess.Read, 
        FileShare.Read) 
      ) 
     ); 
0

तो फ़ाइल बहुत बड़ी सभी को एक बार स्मृति में पढ़ने के लिए नहीं है:

xml.Load(new MemoryStream(File.ReadAllBytes(path))); 
34

आप इस

using (Stream s = File.OpenRead(xmlFilePath)) 
{ 
    xmlDoc.Load(s); 
} 

के बजाय कर सकते हैं

xmlDoc.Load(xmlFilePath); 
संबंधित मुद्दे