1

我的应用程序已经在工作了,它可以检测到xml文件并提示xml文件的内容,但有时会提示“缺少根元素”,有时也可以,但是当我打开xml文件时,就可以了,它上面有内容。如何解决这个问题。

这是错误的屏幕截图:

在此处输入图像描述

这是代码:

private void fileSystemWatcher_Created(object sender, System.IO.FileSystemEventArgs e)
    {
        string invoice = "";
        using (var stream = System.IO.File.Open(e.FullPath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite))
        {
            var doc = System.Xml.Linq.XDocument.Load(stream);
            var transac = from r in doc.Descendants("Transaction")
                          select new
                          {
                              InvoiceNumber = r.Element("InvoiceNumber").Value,
                          };

            foreach (var i in transac)
            {
                invoice = i.InvoiceNumber;
            }
        }

        MessageBox.Show(invoice);
        fileSystemWatcher.EnableRaisingEvents = false;
    }

错误在这里var doc = System.Xml.Linq.XDocument.Load(stream);

4

2 回答 2

3

当文件发生变化时,FileSystemWatcher 将很快引发事件。在您读取文件之前,写入操作可能尚未完成。

要对此进行测试,请在读取文件之前添加一个Thread.Sleep(100);作为快速解决方法。

为了获得更好的解决方案,请不要以共享模式打开文件,而是尝试以独占方式打开它。如果失败,请等待几毫秒,然后重试 - 直到您可以以独占方式打开文件。还要注意事件可能会被多次触发 - 这取决于其他任务如何写入文件。

于 2012-11-23T22:54:09.920 回答
2

当文件创建然后在单独的步骤中写入时,可能存在竞争条件。因此,当创建的事件触发导致异常时,有时您会有一个空文件。您应该在事件Created触发后等待一小段时间,以等待. 另外,请注意,如果正在写入大量内容,则在所有内容出现在文件中之前有许多事件。ChangedFileSystemWatcherChanged

于 2012-11-23T22:54:01.457 回答