2009-11-28 8 views
20

ich eine einfache Klasse XmlFileHelper haben wie folgt:C# XML.load() Sperrdatei auf dem Datenträger verursacht Fehler

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 
} 

Das Problem ist, ich bin den folgenden Fehler beim Laden bekommen:

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

Dies tritt auf, wenn diese Klasse von zwei ausgeführten Instanzen einer parallel ausgeführten Komponente verwendet wird, die beide versuchen, die obige XML-Datei zu laden. Dies ist ein zulässiges Verhalten und wird von der Anwendung benötigt.

Ich möchte nur einmal in der XML-Off-Disk einlesen und einen Verweis auf die Datei auf der Festplatte freigeben und eine In-Memory-Darstellung ab diesem Punkt verwenden.

Ich hätte angenommen, dass Load schreibgeschützt arbeitet und die Datei nicht sperren muss. Was ist meine beste Methode, um das gewünschte Ergebnis zu erzielen und dieses Problem zu umgehen?

Dank

Antwort

20

es hängt davon ab, was Sie aus der Datei benötigen,

Wenn Sie es sein müssen threasdsafe Sie einen Mutex impliment müsste das Laden sperren zwischen Instanz

Wenn Sie nicht wirklich threadsicheres Laden benötigen (dh die Datei ändert sich nie), können Sie es über einen Filestream laden und dann das XmlDocument aus dem laden streamen

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

Ich probiere das jetzt aus, danke – m3ntat

+0

Ausgezeichnet Das hat den Trick gemacht! – m3ntat

-1

Versuch:

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

Wenn die Datei auf einmal nicht zu groß ist, in den Speicher zu lesen:

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

Sie können dies tun

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

statt

xmlDoc.Load(xmlFilePath); 
Verwandte Themen