我有两个C#.NET应用程序:
App2会持续监控XML文件中的更改,我正在使用FileSystemWatcher
。
只要App1完成对文件的写入,App2就会读取更改。
我确保我的App2只使用读访问权限读取XML,但有时我的App1会抛出异常:
"该进程无法访问该文件' C:\ xmlFile'因为它正被另一个进程使用"。这是我在App2中的代码片段,它正在读取文件。
这是我的代码:
using (var stream = File.Open(filePath,FileMode.Open,FileAccess.Read))
{
using (XmlReader reader = XmlReader.Create(stream))
{
while (reader.Read())
{
// Only detect start elements.
if (reader.IsStartElement())
{
switch (reader.Name)
{
case "Component":
fileElements.ComponentName = reader["Name"];
fileElements.DateRun = reader["DateRun"];
fileElements.Passed = reader["Passed"];
break;
}
}
}
if (filePath.ToLower().Contains("ebsserver"))
{
UpdateDataTable1(fileElements);
}
else if (filePath.ToLower().Contains("ebsui"))
{
UpdateDataTable2(fileElements);
}
else
{
UpdateDataTable3(fileElements);
}
}
}
我该如何解决这个问题?
答案 0 :(得分:1)
您必须在阅读应用中使用FileShare.ReadWrite
来表示打开时没有锁定。它与用于打开也写入的文件的文本编辑器使用的机制相同。
File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
答案 1 :(得分:0)
您错过了File.Open方法上的FileShare参数
using (var stream = File.Open(filePath,FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (XmlReader reader = XmlReader.Create(stream))
{
while (reader.Read())
{
// Only detect start elements.
if (!reader.IsStartElement())
{
continue;
}
if (reader.Name != "Component")
{
continue;
}
fileElements.ComponentName = reader["Name"];
fileElements.DateRun = reader["DateRun"];
fileElements.Passed = reader["Passed"];
}
if (filePath.ToLower().Contains("ebsserver"))
{
UpdateDataTable1(fileElements);
}
else if (filePath.ToLower().Contains("ebsui"))
{
UpdateDataTable2(fileElements);
}
else
{
UpdateDataTable3(fileElements);
}
}