С# 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 и не будет необходимости блокировать файл, каков мой лучший способ достичь желаемого результата и обойти эту проблему?
Спасибо
Ответы
Ответ 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)
)
);