Наблюдение за файловой системой

Привет, может немного не по адресу, но вроде тут очень разная аудитория…
Мне вот интересно в природе существуют нормальные либы (высокоуровневае) для отслеживания изменения файлов?

Когда-то долго пытался добиться нужного результата на C# (file system watcher). В итоге из багов и лимитов так и не вылез. Потом другие вотчеры смотрел… Вот недавно решил посмотреть что там в rust (rsnotify) - те же грабли.

Я так понял что задача не решима на уровне системного апи и решается только полингом.
Может я чего-то не понимаю?

Задача вроде бы казалось банальная:
Допустим есть некий конфиг. Из него выдираются пути к файлам(потенциально много, допустим несколько тысяч).
При изменении файла - производится некой действие.
Все что хочется - это корректной обработки исключений!!! И тут начинается…
В конфиге стоит путь: D:/test/test.txt
Я переименовываю test в test2 - в итоге новый путь казалось бы уже не имеет отношения к делу, но файл продолжает мониториться…

Как я пытался решит проблему:

  1. тупо ставить мониторинг на корень, но так вообще ахтунг по перформэнсу особенно если на системный диск поставить вотчер :slight_smile:
  2. по списку фалов строить дерево(аля shadow file system) и вешать витчеры по какому то хитрому механизму на его ноды.

2-й вариант вроде бы более менее приемлемый но куча нюансов:
а. изначальный список(по которому строится дерево) может часто меняться
б. дерево должно поддерживать многопоточность (в купе с 1-м тоже по перформэнсу бьёт)
в. есть вроде лимит в некоторых ОС на кол-во отрытых файловых дескрипторов (то есть в какой то момент все мот перестать работать)
г. дерево все равно не защищает от потенциального затыка по перформэнсу(в какой то ноде мот быть большое число файлов с которыми работают другие программы).

Я вот только не понимаю как с этим борются в IDE. Что если у меня проект на 100500 файлов все тупо полится будут?

Под Виндой? Есть же стандартный виндовозный api. Чему бы самому не сделать к нему биндинги, если их ещё нет.
И использовать напрямую.

FILE_NOTIFY_CHANGE_FILE_NAME

2 лайка

Позволю себе продолжить беседу :slight_smile:
Если я не ошибаюсь тот же сишарповский вотчер по сути тоже биндинг к винапи. Проблема в том что ему нужна так сказать точка(директория) от которой он же работает. А в том как я себе такой вотчер представляю, этой точки быть не может(наверное можно сказать что это не вотчер файлов а вотчер путей). Даже для вотчера с одним путем/файлом:

watcher.add(["D:/test/test.txt"]);

Допустим файл такой существует.
Переименовываем директорию test/анмаунтим диск D - вотчер сигнализирует что файл по такому пути отвалился.
Делаем обратное действие - вотчер сигнализирует что файл доступен.

Как я понял чтоб сделать такое надо драйвер свой писать и приуныл :slight_smile:

Под Виндой?

Не, это просто я видусятник. Так кросплатформ хотелось.

Если уж надо смотреть за несуществующими файлами, то смотри корень диска и фильтруй события:

        Ok(notify::RawEvent {
            path: Some(path),
            op: Ok(op),
            cookie,
        }) => {
            if path.starts_with("D:/test/") {
                ...
            }
        }

Ты хочешь по сути того же самого, но зачем то в ядре. Работает такой вотчер очень быстро. У меня в тесте копирование тысяч мелких файлов на SSD съедает по мониторингу до 1% CPU.

Также рекомендую почитать ответ: