Подтвердить что ты не робот

С# xml.Load() файл блокировки на диске, вызывающий ошибки

У меня есть простой класс XmlFileHelper следующим образом:

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
}

Проблема заключается в том, что при загрузке появляется следующая ошибка:

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

это происходит, когда этот класс используется двумя работающими экземплярами параллельного компонента, пытающегося загрузить файл xml выше, это законное поведение и требуется приложением.

Я хочу только один раз прочитать xml off disk и выпустить любую ссылку на файл на диске и использовать представление в памяти с этой точки вперед.

Я бы предположил, что Load работает в режиме readonly и не будет необходимости блокировать файл, каков мой лучший способ достичь желаемого результата и обойти эту проблему?

Спасибо

4b9b3361

Ответ 1

это зависит от того, что вам нужно из файла,

Если вам нужно, чтобы это было threasdsafe, вам нужно было бы внедрить мьютекс, чтобы заблокировать загрузку между экземпляром,

Если вам действительно не нужна потоковая безопасная загрузка (т.е. файл никогда не изменяется), вы можете загрузить его через поток, а затем загрузить XmlDocument из потока

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

Ответ 2

Вы можете сделать это

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

вместо

xmlDoc.Load(xmlFilePath);

Ответ 3

Если файл не слишком большой для чтения в память сразу:

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

Ответ 4

попробовать:

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