我正在尝试编写一个用于记录数据的软件,如果在目录 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文件文件未保存?以及如何解决这个问题。
答案 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
此外,您可以使用此链接作为提示来真正锁定文件:
希望有所帮助,
答案 1 :(得分:1)
似乎有时你会多次打开文件,而且这个操作文件处于不同的状态,所以当你写它时你只是覆盖之前写的一些数据。我建议您收集队列中的更改并按顺序将它们写入文件。
答案 2 :(得分:0)
如果您需要经常记录数据,则应该写入数据库而不是写入文件或使用缓冲。