Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/40: Рейтинг темы: голосов - 40, средняя оценка - 4.90
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018

FileSystemWatcher дублирует событие изменения

06.03.2012, 03:37. Показов 8441. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно проблема озвучена в названии темы. Не знаю, как это побороть... При изменении файла в каталоге, за которым следит FileSystemWatcher, событие изменения происходит дважды.

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
28
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
 
namespace DataBetwenPrograms_Client_
{
    class Program
    {
        static void Main(string[] args)
        {
            FileSystemWatcher watcher = new System.IO.FileSystemWatcher(Environment.CurrentDirectory, "*.txt");
            watcher.NotifyFilter = NotifyFilters.LastWrite
                        | NotifyFilters.FileName | NotifyFilters.DirectoryName;
            watcher.Changed += new System.IO.FileSystemEventHandler(OnChanged);
            watcher.EnableRaisingEvents = true;
            Console.ReadKey();
        }
 
        static public void OnChanged(object source, FileSystemEventArgs e)
        {
            Console.WriteLine("txt-file changed.");
        }
    }
}
И после гугления этой проблемы я узнал, что с таковой траблой сталкивался не только я...
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.03.2012, 03:37
Ответы с готовыми решениями:

Событие изменения содержимого страницы без изменения адреса и перезагрузки страницы
Доброго времени суток! Такая проблема имеется: есть форма на определенном сайте (сам сайт, к сожалению показать не могу), на которой по...

Событие изменения значения
Есть некий метод для получения значения public string GetValue() { ... return value } Необходимо , чтобы метод...

Создать событие изменения html элемента в webbrowser
Создать событие изменения html элемента в webbrowser нашел такой код но не знаю как его подстроить под себя HtmlElement div1,...

11
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
06.03.2012, 08:14
Вот тут описано та же проблема http://stackoverflow.com/q/1764809/272742
И там же есть обход этой проблемы во втором ответе
2
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
06.03.2012, 09:45  [ТС]
хм, действительно. Описание возникновния проблемы интересное, и ее решение тоже... Но главное, что оно есть Спасибо!
0
0 / 0 / 0
Регистрация: 11.11.2015
Сообщений: 2
11.11.2015, 21:54
Столкнулся с подобной проблемой. Прочитал статью, понял что надо удалить стандартные обработчики событий, но как сделать не понял.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void Main(string[] args)
        {
            FileSystemWatcher myWatcher = new FileSystemWatcher();
            myWatcher.Path = "D:\\1";
            myWatcher.IncludeSubdirectories = true;
            myWatcher.Filter = "*.txt";
            myWatcher.NotifyFilter = NotifyFilters.LastWrite;
 
            myWatcher.Changed += new FileSystemEventHandler(myWatcher_Changed);
            myWatcher.EnableRaisingEvents = true;
 
            Console.ReadLine();
 
        }
 
        private static void myWatcher_Changed(object sender,
    System.IO.FileSystemEventArgs e)
        {
            Console.WriteLine("Произошло слбытие {0} в ", e.ChangeType);
            Console.WriteLine(e.FullPath);
            Console.WriteLine(DateTime.Now);
            Console.WriteLine();
        }
0
0 / 0 / 0
Регистрация: 11.11.2015
Сообщений: 2
17.11.2015, 11:45
Сам нашел ответ. Если кому то будет интересно смотри здесь http://www.sql.ru/forum/695701... v-sobytiya
0
195 / 13 / 4
Регистрация: 26.04.2011
Сообщений: 137
05.08.2016, 05:34
Систематизируя все выше описное, имеем:
1. Большинство GUI-утилит для работы с текстом в действительности меняют файл дважды.
2. Буферы/счетчики/таймеры костыль.
3. Кошерный способ, как и сказал turbanoff, это заворачивать в блок try отключение уведомлений и действия обработчика, а в блоке finnaly включать уведомление обратно.

Кликните здесь для просмотра всего текста
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
28
29
30
31
32
33
34
35
36
37
38
using System.Windows.Forms;
using System.IO;
 
namespace nsparse
{
    public partial class Form1 : Form
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        public Form1()
        {
            InitializeComponent();
            Run();
        }
        
        public void Run()
        {
            watcher.Path = Directory.GetCurrentDirectory();
            watcher.NotifyFilter = NotifyFilters.LastWrite;
            watcher.Filter = "1.txt";
            watcher.Changed += new FileSystemEventHandler(OnChanged);
            //
            watcher.EnableRaisingEvents = true;
        }
 
        private void OnChanged(object source, FileSystemEventArgs e)
        {
            try
            {
                watcher.EnableRaisingEvents = false;
                MessageBox.Show("File: " + e.FullPath + " is " + e.ChangeType);
            }
            finally
            {
                watcher.EnableRaisingEvents = true;
            }
        }
    }
}
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.08.2016, 12:02
enzo_brn, хз, я делал через время последнего чтения/записи файла, этого достаточно, чтобы понимать, что если мы 10мс назад в этот файл уже писали, вряд ли с ним что-то произошло за это время.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private void OnChanged(string path)
{
    FileDescriptor descriptor;
    if (!_pathToDescriptor.TryGetValue(path, out descriptor)) //Если нет дескриптора, значит новый файл и удалять еще нечего
    {
        OnNewFile(path);
        return;
    }
    if (File.GetLastWriteTime(path) <= descriptor.LastWrite) // Если документ не изменялся, то это известный баг вотчера: [url]http://stackoverflow.com/questions/1764809/filesystemwatcher-changed-event-is-raised-twice[/url]
        return;
    OnDeleted(path);
    OnNewFile(path);
}
0
Заблокирован
09.08.2016, 21:56
C#
1
2
3
4
 System.IO.FileSystemWatcher fsw = new FileSystemWatcher(@"pathName", "*.txt");
            fsw.Changed += (s, e) => { Console.WriteLine(e.Name); };
            fsw.NotifyFilter = NotifyFilters.Size| NotifyFilters.CreationTime;
            fsw.EnableRaisingEvents = true;
0
4 / 4 / 0
Регистрация: 07.08.2015
Сообщений: 40
23.11.2016, 16:17
Привет а научились ли вы получать источник от куда заменили файл в папке, или из какого приложения выполнено изменение?
0
0 / 0 / 0
Регистрация: 13.03.2017
Сообщений: 5
29.08.2021, 18:44
Тоже столкнулся с подобной проблемой. Всё переискал, перегуглил, нашёл такое решение, но в моём случае оно не сработало

C#
1
2
3
4
5
6
7
8
9
10
11
12
public void watcher_Changed(object sender, FileSystemEventArgs e)
{
    try
    {
        -----------код----------------------------
         watcher.EnableRaisingEvents = false;
    }
    finally
    {
        watcher.EnableRaisingEvents = true;
    }
}
Так как лично в моём случае новый файл генерируется не чаще чем 1 раз в минуту, то решил применить таймер на 1 сек.
Может чего-то лишнего нагородил, но в моём случае работает:

C#
1
2
3
4
5
6
7
8
 //метод наблюдающий за изменением состояния системы (создание файлов в подкаталогах)                 
        private void OnCreate(object sender, FileSystemEventArgs e)
        {
           Thread.Sleep(1000);
           start(e.FullPath);
           watcher.EnableRaisingEvents = true;
           File.Move(e.FullPath, Path.ChangeExtension(e.FullPath, ".csv"));//изменяем тип файла с TXT на CSV
        }
C#
1
2
3
4
5
//метод преобразования файла
         void start(string filePath){
                ----------код----------------
                watcher.EnableRaisingEvents = false;           
       }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.08.2021, 18:50
Цитата Сообщение от roler Посмотреть сообщение
в моём случае работает
Если какие-то файлы изменятся пока вы "спите" или передвигаете файл, то вы об этих изменениях не узнаете.
0
 Аватар для Kostya_unix
1 / 1 / 0
Регистрация: 25.03.2020
Сообщений: 15
06.08.2022, 06:56
Цитата Сообщение от roler Посмотреть сообщение
Тоже столкнулся с подобной проблемой.
И у меня так же. Даже через исключения все равно некоторое количестро раз пробивалось дублирование сообщения об изменении файла. Пок не поставил задержку:
Code
1
2
3
4
5
6
7
8
9
10
try
                {
                    watcher.EnableRaisingEvents = false;
                    Thread.Sleep(1); // задержка
                     Console.WriteLine("файл изменен.... " + i++);
                }
                finally
                {
                    watcher.EnableRaisingEvents = true;
                }
Написал два консольных приложения (для теста). Одно записывало, другое проверяло.
Записывало через 50 м.секунд 300 раз и без одной ошибки (дублировании).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.08.2022, 06:56
Помогаю со студенческими работами здесь

MediaPlayer: событие изменения прогресса
где в MediaPlayer событие изменения прогресса? или какой еще способ можно придумать чтобы двигать слайдер отвечающий в плеере (пишу плеер)...

Событие изменения данных itemSource у comboBox
Имеется comboBox, к itemsSource биндится коллекция. Вопрос такой: есть ли событие у comboBox'a которое срабатывает при изменении этой...

FileSystemWatcher событие Deleted: как проверить, что было удалено - файл или папка?
Нужно определять является ли объект файлом или директорией, в остальных событиях изпользую if (File.Exists(e.FullPath)) {} else {} ...

Событие изменения текста
Добрый день! Написал первую программу на C#, там сказано сделать так, чтобы в случае пустой строки выскакивала ошибка. using System; ...

Подписаться на событие изменения коллекции
Собственно как? Имеются такие коллекции List&lt;string&gt; scanUrls = new List&lt;string&gt;(); HashSet&lt;string&gt; resUrls = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru