2010-09-24 39 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

相關問題