在事件发生时将数据写入xml时出现问题

时间:2010-09-24 12:50:53

标签: 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();
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);

但有时发生watcher.Created += new FileSystemEventHandler(OnChanged);时,有关文件创建的数据不会插入XML文件。

那么,是否有可能为数据写入打开文件,并且锁定新的dataWrite文件文件未保存?以及如何解决这个问题。

3 个答案:

答案 0 :(得分:2)

你面临美容电脑问题,请在http://en.wikipedia.org/wiki/Dining_philosophers_problem中阅读一下关于餐饮哲学家的问题。

您只需将其属性设置为ReadOnly

即可“锁定”文件

我的意思是,当你要写作时,你会检查是否设置了“ReadOnly”。在那种情况下

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

写完后,请删除该属性。

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

Problem with using Semaphore to protect queue

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

How to lock file

希望有所帮助,

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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