2009-11-28 14 views
20

diski neden hataları dosyayı kilitleme şöyle:C# xml.Load() Basit bir sınıf XmlFileHelper sahip

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 
} 

Sorunum Yük aşağıdaki hatayı alıyorum olduğunu Bu, her ikisi de yukarıdaki xml dosyasını yüklemeyi deneyen paralel çalışan bir bileşenin iki çalışan örneği tarafından kullanıldığında oluşur, bu yasal bir davranıştır ve uygulama tarafından istenir.

Sadece xml kapalı diskte bir kez okumak ve diskteki herhangi bir referansı diske dökmek ve o noktadan bir bellek gösterimini kullanmak istiyorum.

Yükümün, salt okunur bir şekilde çalıştığını ve dosyayı kilitlemeye gerek olmadığını, istenen sonuca ulaşmak için en iyi yolun nedir ve bu sorunla uğraşmayı kabul ederdim?

Teşekkür

cevap

20

o Dosyadan gerekenler bağlıdır

Eğer yükleme kilitlemek için bir muteksi impliment gerekir threasdsafe olmasını gerekiyorsa Örneğin,

Gerçekten güvenli bir şekilde yüklemeye ihtiyacınız yoksa (yani dosya hiçbir zaman değişmez) bir filestream aracılığıyla yükleyebilir ve ardından XmlDocument öğesinden yükleyebilirsiniz. dosyanız tek seferde belleğe okumak için çok büyük değilse

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

Bunu şimdi deniyorum, teşekkürler – m3ntat

+0

Mükemmel Bu hile yaptı! – m3ntat

-1

deneyin:

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

akışı:

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

Bu

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

yerine yapabileceği

xmlDoc.Load(xmlFilePath);