Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用FileSystemWatcher检测xml文件,使用Linq读取xml文件并提示结果错误;缺少根元素";_C#_Xml_Linq_Filesystemwatcher - Fatal编程技术网

C# 使用FileSystemWatcher检测xml文件,使用Linq读取xml文件并提示结果错误;缺少根元素";

C# 使用FileSystemWatcher检测xml文件,使用Linq读取xml文件并提示结果错误;缺少根元素";,c#,xml,linq,filesystemwatcher,C#,Xml,Linq,Filesystemwatcher,我的应用程序已经开始工作了,它可以检测xml文件并提示xml文件的内容,但有时它会提示“根元素丢失”,有时它也可以,但当我打开xml文件时,它可以,它上面有内容。如何解决这个问题 以下是错误的屏幕截图: 代码如下: private void fileSystemWatcher_Created(object sender, System.IO.FileSystemEventArgs e) { string invoice = ""; using (var

我的应用程序已经开始工作了,它可以检测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)

当文件创建并在单独的步骤中写入时,可能存在争用条件。因此,当创建的事件引发异常时,偶尔会有一个空文件。在
Created
事件触发后,您应该在
FileSystemWatcher
上等待
Changed
事件。另外,请注意,如果写入了大量内容,则在文件中出现所有内容之前,可能会发生多个
已更改的
事件。

当文件创建并在单独的步骤中写入时,可能存在争用条件。因此,当创建的事件引发异常时,偶尔会有一个空文件。在
Created
事件触发后,您应该在
FileSystemWatcher
上等待
Changed
事件。另外,请注意,如果写入了大量内容,则在文件中出现所有内容之前,会有多个
已更改的
事件。

当文件更改时,FileSystemWatcher会很快引发该事件。在读取文件之前,写入操作可能尚未完成

为了测试这一点,添加一个
Thread.Sleep(100)作为快速解决方法读取文件之前


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

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

为了测试这一点,添加一个
Thread.Sleep(100)作为快速解决方法读取文件之前


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

我的眼睛不太好——我看不到小屏幕上的任何东西。但即使我可以,我也不能剪切并粘贴到Linqpad或Visual studio中进行测试或提供帮助。建议您放置一个小的、仅限文本的简化测试用例,以显示您的问题,使其更有可能获得有效的帮助。对不起,我将粘贴好的^^^更新文件的内容(前几行):)粘贴代码:>我的眼睛不太好——我在一个小屏幕上看不到任何东西。但即使我可以,我也不能剪切并粘贴到Linqpad或Visual studio中进行测试或提供帮助。建议您放置一个小的、仅限文本的简化测试用例,以显示您的问题,使其更有可能获得有效的帮助。对不起,我将粘贴好的^^^更新文件的内容(前几行):)粘贴代码:>谢谢,先生。非常感谢:)谢谢你,先生。真的很感激:)