Уроки C# - Следим за файловой системой - FileSystemWatcher

Поделиться
HTML-код
  • Опубликовано: 2 янв 2025

Комментарии • 98

  • @Max1GameChannel
    @Max1GameChannel 3 года назад +29

    1) Второй параметр конструктора является необязательным, то есть мы можем следить за всеми файлами по указанному пути (как в примере ниже) , или же за определёнными файлами по маске, например "*.txt" следит за всеми текстовыми файлами.
    2) Поля EnableRaisingEvents и SynchronizingObject можем задать в инициализаторе и сэкономить 2 строчки.
    3) При добавлении обработчика событий можно просто указать название метода, без необходимости вызывать конструктор делегата(как в примере ниже).(да и вообще как только написали watcher.Created += жмем TAB и вижла сама всё сделает)
    4) У EventArgs`ов есть интересные свойства - Name, OldName и тд(используются в примере ниже)
    void Form1_Load(object s, EventArgs e)
    {
    FileSystemWatcher watcher = new FileSystemWatcher(@"C:\Users\TTR\Desktop\") { EnableRaisingEvents=true, SynchronizingObject=this };
    watcher.Created += Watcher_Created;
    watcher.Deleted += Watcher_Deleted;
    watcher.Renamed += Watcher_Renamed;
    }
    void Watcher_Created(object s, FileSystemEventArgs e) => label1.Text += $"Файл {e.Name} создан
    ";
    void Watcher_Deleted(object s, FileSystemEventArgs e) => label1.Text += $"Файл {e.Name} удалён
    ";
    void Watcher_Renamed(object s, RenamedEventArgs e) => label1.Text += $"Файл {e.OldName} переименован в {e.Name}
    ";
    Результат работы программы:
    Файл Новый текстовый документ.txt создан
    Файл Новый текстовый документ.txt переименован в 3.txt
    Файл 3.txt удалён
    Файл ACValhalla.exe - копия.lnk создан
    Файл ACValhalla.exe - копия.lnk удалён

    • @XpucT
      @XpucT  3 года назад +6

      Закреп 👍

    • @RoyZASTEROiD
      @RoyZASTEROiD 3 года назад

      В консоль апп как использовать -SynchronizingObject=this- ? не получается использовать так.

    • @Max1GameChannel
      @Max1GameChannel 3 года назад +1

      ​@@RoyZASTEROiD оно там не нужно, просто не пиши

    • @RoyZASTEROiD
      @RoyZASTEROiD 3 года назад

      @@Max1GameChannel спс, а для чего надо SynchronizingObject можеш обяснить из видео не полностью понялф

    • @Max1GameChannel
      @Max1GameChannel 3 года назад

      @@RoyZASTEROiD
      MSDN: "Если SynchronizingObject имеет значение null , методы, обрабатывающие событие, вызываются в потоке из пула системных потоков.
      Если событие обрабатывается компонентом Windows Forms, например Button , доступ к компоненту через пул системных потоков может не работать или может привести к исключению. Это следует избегать, если задать SynchronizingObject компоненту Windows Forms, в результате чего методы, обрабатывающие событие, вызываются в том же потоке, в котором был создан компонент."

  • @toshmatov
    @toshmatov Год назад +2

    Спасибо за прекрасные уроки!

  • @hulumulumulus
    @hulumulumulus 3 года назад +5

    Пишу на шарпах уже почти 2 года, а об этой штуке узнал только сейчас из твоего видео. Спасибо, Хачатур! Действительно лучшие уроки по C#.

  • @remontunasdotru
    @remontunasdotru 3 года назад +2

    Спасибо! Очень полезно!

  • @suhochef
    @suhochef 3 года назад +2

    Спасибо! Четкая, понятная, логичная подача информации.

  • @Undexpented
    @Undexpented Год назад

    Здравствуйте.
    Возник вопрос: А как сделать чтобы файл 1.txt (как было в примере) было невозможно удалить, переименовать, переместить и редактировать, пока работает программа?
    Или это делается не с помощью FileSystemWatcher?

  • @Vovnenko
    @Vovnenko 3 года назад +2

    Ctrl + Shift + Space в помощь вместо запятой. Shift + Стрелки перегрузки методов. Спасибо за видео.

  • @mikhail5402
    @mikhail5402 3 года назад +1

    Спасибо

  • @oz9608
    @oz9608 3 года назад +2

    Хачатур, человечище! Жду продолжения !:)

  • @mozze6262
    @mozze6262 3 года назад +2

    Доброй ночи, пишу вам из командного центра. В прошлый раз вы отшутились на мой комментарий про редакцию Windows. Всё таки, LTSC или Pro у вас стоит?

    • @arteria-circumflexa6527
      @arteria-circumflexa6527 3 года назад +1

      Pro. 1055 оригинал.

    • @mozze6262
      @mozze6262 3 года назад +1

      @@arteria-circumflexa6527 Благодарю

    • @serpotapov
      @serpotapov 3 года назад

      Доброй 🌙
      Про Windows Хачатур отвечал в Уроке 1.1.

  • @Oleksandr-Nikolaev
    @Oleksandr-Nikolaev 3 года назад +1

    Хачатур балует выпусками.

  • @chuvak_2553
    @chuvak_2553 3 года назад +1

    Здравствуйте, а вы случайно когда-то не сталкивались с такой проблемой: у меня в студии в шаблонах проекта почему-то нет WinForms .NET Core, только .NET Framework есть. Всё в установщике нужное вроде стоит, могу создавать консольку и библиотеки на .NET Core

    • @chuvak_2553
      @chuvak_2553 3 года назад

      Приходится создавать .NET Framework WinForms и с помощью .NET Upgrade переводить на .NET Core

    • @XpucT
      @XpucT  3 года назад

      Добрый день 🖐
      Всё потому, что .NET Core нужно отдельно указывать. Если студия стояла ДО Core, то так и будет теперь, если не ошибаюсь.

    • @chuvak_2553
      @chuvak_2553 3 года назад

      @@XpucT да, стояла до .net core, но сейчас с ним, спасибо за ответ

  • @kostya1306
    @kostya1306 2 года назад +1

    Спасибо! А вот есть вопрос. Если файл большой, и копируется долго. Событие генерируется в какой момент?

    • @XpucT
      @XpucT  2 года назад

      Логично, что по заключению.
      То есть если не скопирован, а только копируется, это ещё не событие.

    • @kostya1306
      @kostya1306 2 года назад

      @@XpucT Ну там не совсем логично. Я провел эксперимент. Слежу за пустой папкой. И по событию Created копирую этот файл в другую папку. Так вот, по событию копируется пустой файл, размером 0 KB. Так же, в описании класса сказано, что по мере записи файла, еще может вызываться несколько событий Changed. А как отследить окончание записи файла нигде не сказано (:

    • @pas9857
      @pas9857 Год назад

      @@kostya1306 я сделал так:
      public void CreateMy(string fileName)
      {
      Program.log.Clear();
      new Thread(() =>
      {
      {
      tryagain:
      try
      {
      File.Copy(Path.Combine(sourceDir, fileName), Path.Combine(destinationDir, fileName), true);
      }
      catch (Exception ex)
      {
      listBox1.Items.Add(ex.Message);
      goto tryagain;
      }
      };
      Program.log.Add(DateTime.Now.ToString());
      Program.log.Add("Синхронизация файла" + fileName);
      }).Start();

  • @vadymkon
    @vadymkon Год назад +1

    Такой вопрос:
    При создании файла он это не видит. Created видит только когда файл копируется на рабочий стол, когда возвращают с корзины видимо как в видео, НО, не создание. Чем может решится?
    Вот код:
    void Watcher_Deleted(object sender, FileSystemEventArgs e) => label4.Text = $"Куда удалил файлик? Я всё видел.
    Ты это сделал в {DateTime.Now}";
    void Watcher_Created(object s, FileSystemEventArgs e) => label4.Text = $"Файл сделан {DateTime.Now}";
    private void Form1_Load(object sender, EventArgs e)
    {
    FileSystemWatcher watcher = new FileSystemWatcher(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "123.txt");
    watcher.EnableRaisingEvents = true; //позволяет пихать методы
    watcher.SynchronizingObject = this; //синхронизация с файловой системой
    watcher.Deleted += new FileSystemEventHandler(Watcher_Deleted);
    watcher.Created += new FileSystemEventHandler(Watcher_Created);
    }

  • @bonickd9095
    @bonickd9095 3 года назад +1

    По зову сердца

  • @walerij
    @walerij 3 года назад +1

    Сразу лайк не глядя!

  • @felikssstepanovs2861
    @felikssstepanovs2861 2 года назад +1

    Привет Хачатур!
    Мне нужно отследить, какой пользователь компьютера открыл соответствующий файл. Возможно ли с FileSystemWatcher?

    • @XpucT
      @XpucT  2 года назад

      Привет 🖐
      По сути это просто Environment.Username.

    • @felikssstepanovs2861
      @felikssstepanovs2861 2 года назад

      @@XpucT пользователя я то могу узнать кто в данном моменте работает за компютером:
      textBox1.Text = string.Format("{0}\\{1}", Environment.UserDomainName, Environment.UserName);
      Но как отследить открывал ли он определенный файл!
      Пробовал по Диспетчер задач отследить, но работает только если я компьютером пользуюсь:
      var processes = from p in Process.GetProcessesByName("excel")
      select p;
      foreach (var process in processes)
      {
      if (process.MainWindowTitle == excelFileName)
      {
      listBox1.Items.Add(process.MainWindowTitle);
      }
      if (listBox1.Items.Contains("2022.xlsx - Excel"))
      {
      label9.Text = DateTime.Now + "
      " + textBox1.Text + " " + "Открыл Файл";
      }
      }
      Если на этом же компьютере залогинился другой то все это неработает.
      Программа у меня запускается при каждой смене пользователя.

    • @XpucT
      @XpucT  2 года назад

      @@felikssstepanovs2861 в любой смене пользователя, в любой среде и при любой учётке при первом обращении или изменении файла сразу же в лог кидаешь Username и всё. Либо Я чего-то не пойму до сих пор. Откуда ни торкай файл Username будет именно того, кто торкает.

    • @felikssstepanovs2861
      @felikssstepanovs2861 2 года назад

      @@XpucT
      Вот этот код работает, но я думаю он слишком кривой. Может можно как то иначе?
      // Когда программа запускается то button1 сама нажимается каждые 5 секунд
      private void button1_Click(object sender, EventArgs e)
      {
      try
      {
      using (Stream stream = new FileStream("C:\\1.txt", FileMode.Open))
      label1.Text = "Файл не открыт";
      }
      catch
      {
      label1.Text = "Файл открыт";
      }
      if (label1.Text == "Файл открыт")
      {
      //тут обработка информации - записывается в лог файл кто когда открыл файл 1.txt
      }
      }

    • @XpucT
      @XpucT  2 года назад +1

      @@felikssstepanovs2861 Если код работает, то он уже не кривой.

  • @Ист-и3х
    @Ист-и3х 3 года назад +1

    А как следить за именно изменениями в папке? Типо: в папке был создан файл и т.д?

    • @XpucT
      @XpucT  3 года назад

      .Changed

    • @Ист-и3х
      @Ист-и3х 3 года назад +1

      @@XpucT, спасибо большое.

  • @СерОрл-ш5м
    @СерОрл-ш5м 3 года назад +1

    Странно если файл изменить 1 раз watcher_changed { label4.Text = (i += 1).ToString() } То число будет равным 2! Я просмотрел в debug И о чуда там цикл в 2 прохода. Почему?

    • @XpucT
      @XpucT  3 года назад

      Не обращал внимания. А i точно равен 0 изначально?

    • @СерОрл-ш5м
      @СерОрл-ш5м 3 года назад

      @@XpucT да i=0; само событие обрабатывается дважды оно циклично! почему?

    • @СерОрл-ш5м
      @СерОрл-ш5м 3 года назад

      @@XpucT или баг или перепроверка (а точно файл изменен? а может показалась? а ну-ка проверю еще O_o )

    • @XpucT
      @XpucT  3 года назад

      @@СерОрл-ш5м сложно сказать, возможно файл меняется + изменяется имя, но уже после доступа (изменения).

  • @chechensoft_ru
    @chechensoft_ru 3 года назад

    А как вывести кто удалил или переименовал файл? FileSystemWatcher умеет это вывести?

  • @АлександрЛукьяненко-ц1з

    Хачатур, а как ты скопировал целую строку, когда курсор был в конце неё?

  • @serpotapov
    @serpotapov 3 года назад +4

    Спасибо за урок! Но у Меня есть вопрос:

  • @mikkimorfin5406
    @mikkimorfin5406 3 года назад +1

    Круто большое спасибо))

  • @ЕгорКостин-э3ж
    @ЕгорКостин-э3ж 3 года назад +1

    а нет случайно такого же наблюдателя только для диспетчера задач?(

    • @XpucT
      @XpucT  3 года назад

      Такого нет.

    • @ЕгорКостин-э3ж
      @ЕгорКостин-э3ж 3 года назад

      @@XpucT жаль, придется самописное делать, а по вин апи есть видео?

    • @XpucT
      @XpucT  3 года назад

      @@ЕгорКостин-э3ж ruclips.net/video/KYq2WF3otxc/видео.html

  • @skbmw530
    @skbmw530 2 года назад

    Добрый день. Очень классно рассказали. Но я нашел одну проблему, функция создания файла срабатывает сразу как только файл создан. НО, если файл очень большой и он ещё качается, например размер файла 1 гб, который качается еще, как отследить когда он полностью скачается. Ведь функция создания сразу срабатывает. Но файл еще не готов.

    • @XpucT
      @XpucT  2 года назад

      Добрый 🖐
      Для специфического или конкретного отслеживания, лучше, конечно, дополнять своими сценариями. То есть if (new FileInfo...)
      Замерять размер и т.д.

  • @van_k41
    @van_k41 3 года назад +1

    Всем привет!

  • @__Goodwin__
    @__Goodwin__ 3 года назад

    Зачем ставить запятую, чтоб посмотреть аргументы функции, если есть сочетание клавиш: ctr + shift + пробел?

    • @XpucT
      @XpucT  3 года назад

      Нажимайте 3 кнопки вместо 1, Я не против.

  • @безбашенийпро
    @безбашенийпро 3 года назад +1

    а я в FileSystemEventHandler сразу лямбду сую

  • @mideks
    @mideks 2 года назад

    А почему и зачем у вас 2 рабочих стола? 🤔

    • @XpucT
      @XpucT  2 года назад

      Судя по вопросу... их будет очень много. И на все есть ответы, если смотреть плейлист с Урока #0
      ruclips.net/p/PL05SB3rBbUsraqiEUeS70RKhVAu97nGeb

    • @mideks
      @mideks 2 года назад

      @@XpucT вау, так оказывается есть целый плейлист большой, спасибо!

  • @Denis.999
    @Denis.999 3 года назад +1

    Стыдно признаться, но я совершенно не понял что это было и чего

    • @XpucT
      @XpucT  3 года назад +1

      Если нужно следить за изменением файла.
      Тебе такое просто пока не пригождалось наверно.

    • @Denis.999
      @Denis.999 3 года назад

      @@XpucT верно!

  • @danielnull7810
    @danielnull7810 3 года назад +1

    Спасибо.