проблема при записи данных в xml, когда произошло событие - PullRequest
2 голосов
/ 24 сентября 2010

Я пытаюсь написать небольшое программное обеспечение для регистрации данных, если какой-либо тип файла создан в каталоге 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 ]

2 голосов
/ 24 сентября 2010

Вы столкнулись с проблемой компьютера красоты, прочитайте немного о проблеме «Обедающие философы» в http://en.wikipedia.org/wiki/Dining_philosophers_problem.

Вы можете «заблокировать» файл, просто установив его атрибут в ReadOnly

Я имею в виду, когда вы собираетесь писать, вы проверяете, установлен ли «ReadOnly».В этом случае

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

После записи удалите атрибут.

Более сложным решением может быть использование семафоров, что позволяет контролировать файлы, к которым осуществляется доступ.Подсказку вы можете найти здесь в StackOverflow:

Проблема с использованием семафора для защиты очереди

Кроме того, вы можете использовать эту ссылку в качестве подсказки для реальной блокировки файлов:

Как заблокировать файл

Надеюсь, что поможет,

1 голос
/ 24 сентября 2010

Кажется, что иногда вы открываете файл несколько раз, и между этими операциями файл находится в разных состояниях, поэтому, когда вы пишете его, вы просто перезаписываете некоторые данные, записанные ранее.Я предлагаю вам собрать изменения в Очередь и записать их в файл последовательно.

0 голосов
/ 24 сентября 2010

Если вам нужно регистрировать данные очень часто, вы должны либо записать в базу данных, а не в файл или использовать буферизацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...