2010-09-24 42 views
2

我想写一个用于记录数据的小软件,如果目录中创建的任何类型的文件A写入数据到XML时,发生事件时的问题

我使用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文件文件没有保存?以及如何解决这个问题。

回答

2

你是在美容计算机问题面前,请阅读http://en.wikipedia.org/wiki/Dining_philosophers_problem中有关Dining Philosophers的问题。

可以“锁定”文件只是设置其属性为只读

我的意思是,当你会写,你是否“只读”设置。在这种情况下,

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

写完后请删除属性。

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

Problem with using Semaphore to protect queue

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

How to lock file

希望帮助,

+0

感谢您的建议,并为wiki页+1。 – loviji 2010-09-24 14:02:55

1

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

+0

@ Restura,谢谢。我刚刚用C#方法创建了1000个txt文件。发生问题。有关Queue的建议+1。 – loviji 2010-09-24 14:01:30

+0

那么你会尝试我的解决方案吗? – Restuta 2010-09-24 14:50:08

+0

我们将编写应用程序服务来创建应用程序日志文件。然后每30秒从应用程序服务日志和写入XML文件中读取数据。所以XML文件不会处于不同的状态。 – loviji 2010-09-27 06:13:57

0

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

+0

哪个数据库你喜欢写简单的数据?如果软件小而且功能不大? – loviji 2010-09-24 13:41:37

+0

难道你没有可以使用的现有数据库吗? – 2010-09-24 13:44:26

+0

我有很多数据库,但我不想为这个小软件使用数据库,并且依赖于来自其他数据库软件的软件。 – loviji 2010-09-24 14:04:14

相关问题