|
FileSystemWatcher двойной вызов события
|
|||
---|---|---|---|
#18+
Проблема в том, что вызов события изменения файла вызывается дважды. Вот код: watcher.Path = @"e:\"; watcher.Filter = @"txt.txt"; watcher.Changed += new FileSystemEventHandler(watcher_Changed); watcher.NotifyFilter = NotifyFilters.LastWrite; watcher.EnableRaisingEvents = true; В коде-обработчике события приходиться вначале запрещать мониторинг файлов, а потом разрешать: watcher.EnableRaisingEvents = false; // здесь что-то делаю .... watcher.EnableRaisingEvents = true; Никто не знает в чем может быть дело? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2009, 16:23 |
|
FileSystemWatcher двойной вызов события
|
|||
---|---|---|---|
#18+
mishavinНикто не знает в чем может быть дело?Знает. Если файл записывается на самом деле дважды , то и событие возникает дважды. Например, тот же блокнот, видимо, сначала устанавливает длину файла в 0, затем записывает весь текст в него заново. Погуглите, в инете должна быть куча примеров на эту тему (в частности, пример с командной строкой типа echo some_text > 1.txt против echo some_text >> 1.txt - в последнем случае запись происходит только 1 раз, что выражается в однократном срабатывании события). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2009, 16:50 |
|
FileSystemWatcher двойной вызов события
|
|||
---|---|---|---|
#18+
Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2009, 08:49 |
|
FileSystemWatcher двойной вызов события
|
|||
---|---|---|---|
#18+
Решил проверить высказывание о том, что редактор вначале обнуляет длину, а потом записывает текст. Написал Вот такую прогу: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38.
Note++ действительно сначала обнуляет, а потом пишет. А вот Bred тоже выдает два события, но с одинаковой длиной. То есть, когда отлавливаешь изменения в файле, то корректнее ловить второе событие. Особенно это важно когда собираешься что-то делать с этим файлом делать. Можно так же - заблокировать событие, - подождать, например секунду - пока изменения запишуться в файл, - потом снова разблокировать, - сделать какие-то действия. Но в данном случае есть риск пропустить события-изменения файла. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2009, 14:46 |
|
FileSystemWatcher двойной вызов события
|
|||
---|---|---|---|
#18+
Кому интересно - решил привести окончательный вариант класса, отслеживающего изменения. В нем я учел возможность вызова пары событий при изменении файла, а так же возможность одиночного вызова. Для этого я завел словарь, куда записываю имя файла и время. При каждом событии - проверяется словарь. Если элемент словаря существует, то он удаляется и вызывается событие-извещение. Если не существует - просто записывается в словарь. Для случая, когда может прийти только одно событие - крутиться в фоновом режиме поток, который проверяет словарь раз в 3 секунды. Если элемент в словаре находиться более 3 секунд, то он удаляется и вызывается событие. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2009, 16:42 |
|
FileSystemWatcher двойной вызов события
|
|||
---|---|---|---|
#18+
mishavin, Спасибо, очень полезный код! Жаль только, что он не работает :) . Точнее, работает всё, кроме процедуры CheckDict . В ней есть три неточности: 1. В условии оператора if неправильно вычитается время - из раннего (время создания файла) позднее (текущее), в результате получается отрицательный результат. 2. В том же условии свойство TotalSeconds - длительность периода в секундах - сравнивается с миллисекундами. 3. Если в теле цикла Код: c# 1.
попытаться удалить элемент из словаря dic , то возникает прерывание (что-то типа "нельзя осуществить навигацию по изменённой коллекции"), поскольку указатель текущего элемента при модификации/удалении/добавлении элемента коллекции разрушается. Ниже приводится работающий вариант этой процедуры. Всё остальное - пашет на ура. Ну, там, чуть подправить конструктор, чтобы принимал путь к папке, фильтры и т.п.... Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2017, 16:08 |
|
|
start [/forum/topic.php?fid=20&fpage=37&tid=1399628]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
107ms |
get tp. blocked users: |
2ms |
others: | 310ms |
total: | 507ms |
0 / 0 |