C# 事件发生时,将数据写入xml时出现问题

C# 事件发生时,将数据写入xml时出现问题,c#,xml,file,file-io,C#,Xml,File,File Io,我正在尝试编写一个用于记录数据的小软件,如果在目录a中创建任何类型的文件 我使用FileSystemWatcher类来获取有关文件夹A中文件创建的信息。文件夹A中有许多子文件夹。许多用户可以一次在这个目录中创建文件 我使用XML数据保存日志数据 XmlTextReader reader = new XmlTextReader(FILE_NAME); XmlDocument doc = new XmlDocument(); doc.Load(reader); reader.Close(); Xml

我正在尝试编写一个用于记录数据的小软件,如果在目录a中创建任何类型的文件

我使用
FileSystemWatcher
类来获取有关文件夹A中文件创建的信息。文件夹A中有许多子文件夹。许多用户可以一次在这个目录中创建文件

我使用XML数据保存日志数据

XmlTextReader reader = new XmlTextReader(FILE_NAME);
XmlDocument doc = new XmlDocument();
doc.Load(reader);
reader.Close();
XmlNode currNode;

XmlDocumentFragment docFrag = doc.CreateDocumentFragment();
docFrag.InnerXml = "<item>" +
"<path>" + fileName + "</path>" +
"<created>0</created>" +
"<date>" + DateTime.ParseExact(DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss"), "dd.MM.yyyy HH:mm:ss", System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None).ToString() + "</date>" +
"</item>";
// insert the availability node into the document
currNode = doc.DocumentElement;
currNode.InsertAfter(docFrag, currNode.LastChild);
//save the output to a file
doc.Save(FILE_NAME);
XmlTextReader=新的XmlTextReader(文件名);
XmlDocument doc=新的XmlDocument();
文件加载(读卡器);
reader.Close();
XmlNode-currNode;
XmlDocumentFragment docFrag=doc.CreateDocumentFragment();
docFrag.InnerXml=“”+
“”+文件名+“”+
"0" +
“+DateTime.ParseExact(DateTime.Now.ToString(“dd.MM.yyyy HH:MM:ss”),“dd.MM.yyyy HH:MM:ss”,System.Globalization.CultureInfo.CurrentCulture,System.Globalization.DateTimeStyles.None)。ToString()+”+
"";
//将可用性节点插入到文档中
currNode=doc.DocumentElement;
currNode.InsertAfter(docFrag,currNode.LastChild);
//将输出保存到文件中
单据保存(文件名);
但有时while出现
watcher.Created+=newfilesystemeventhandler(OnChanged),有关文件创建的数据未插入到XML文件中


那个么,若文件是为数据写入而打开的,并且它是为新的数据写入文件而锁定的,而文档并没有保存,那个么是否可能呢?以及如何修复此问题。

似乎有时您会多次打开文件,并且在这两次操作之间,文件处于不同的状态,所以当您写入文件时,您只需覆盖以前写入的一些数据。我建议您收集队列中的更改并按顺序将其写入文件。

如果您需要经常记录数据,您应该写入数据库而不是写入文件,或者使用缓冲。

您面临一个美容计算机问题,请阅读中有关饮食哲学家问题的部分

只需将文件属性设置为只读,即可“锁定”文件

我的意思是,当你要写的时候,你要检查是否设置了“ReadOnly”。那么

System.IO.File.SetAttributes(“pathtofile\filename.ext”,FileAttributes.ReadOnly)

写入后,请删除该属性

更复杂的解决方案可能是使用信号量,从而控制自己访问的文件。您可以在StackOverflow中找到提示:

此外,您还可以使用此链接作为提示来真正锁定文件:


希望对您有所帮助,

您更喜欢编写哪种数据库的简单数据?如果软件太小,功能不大?你没有可以使用的现有数据库吗?我有很多数据库,但我不想将数据库用于这个小软件,而依赖另一个数据库软件的软件。@Restura,谢谢。我刚刚用C#方法创建了1000个txt文件。问题出现了+1获取有关队列的建议。那么您是否要尝试我的解决方案?我们将编写应用程序服务,创建应用程序日志文件。然后每隔30秒从应用程序服务日志读取数据并写入XML文件。所以XML文件不会处于不同的状态。