C# 使用FileSystemWatcher检测xml文件,使用Linq读取xml文件并提示结果错误;缺少根元素";
我的应用程序已经开始工作了,它可以检测xml文件并提示xml文件的内容,但有时它会提示“根元素丢失”,有时它也可以,但当我打开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
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中进行测试或提供帮助。建议您放置一个小的、仅限文本的简化测试用例,以显示您的问题,使其更有可能获得有效的帮助。对不起,我将粘贴好的^^^更新文件的内容(前几行):)粘贴代码:>谢谢,先生。非常感谢:)谢谢你,先生。真的很感激:)