另一个进程异常使用的文件

时间:2015-04-22 21:16:46

标签: c# xml windows

我有两个C#.NET应用程序:

  • 一个应用程序(比如App1)将数据写入XML文件。
  • 第二个应用程序(让我们称之为App2)从中读取数据 XML文件并自行更新。

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);
        }
    }
}

我该如何解决这个问题?

2 个答案:

答案 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);
       }
   }