Как использовать FileSystemWatcher в Linux с .NET 5.0+

Я пытаюсь следить за изменениями в указанном каталоге с помощью класса FileSystemWatcher. Основываясь на примере Документы MS, которые отлично работают на моем компьютере с Windows. Проблема, однако, в том, что я нацелен на Ubtuntu 18.04 lts и выше для этого. Наблюдатель, по-видимому, настраивается нормально (код выполняется, а сообщения консоли / журнала распечатываются), но ни одно из событий файловой системы никогда не запускается, например: изменение / создание / удаление / переименование / и т. Д. Ничего не запускается те.

Есть ли какие-либо недокументированные или скрытые детали настройки, необходимые для работы с Linux, или это не поддерживается вообще, и даже при том, что это в .NET 5, не должно использоваться для сборок Linux / Mac / Unix? Я не могу найти никаких исчерпывающих документов об использовании не-Windows, но подумал, что .NET 5 предназначен для переносимой работы. Любые советы / подробности будут оценены, поскольку я уверен, что другие тоже сталкивались с этим или, по крайней мере, вероятно, сделают это.

Текущий код, который работает со сборкой Windows, но не работает с Linux:

public void WatchFolder()
{
    string directoryPath = _configuration["FolderLocation"];

    if (string.IsNullOrWhiteSpace(directoryPath))
        throw new Exception("Folder location was not set.");

    try
    {
        // setup file system watcher
        using var watcher = new FileSystemWatcher(directoryPath);
        watcher.NotifyFilter = NotifyFilters.Attributes
                         | NotifyFilters.CreationTime
                         | NotifyFilters.DirectoryName
                         | NotifyFilters.FileName
                         | NotifyFilters.LastAccess
                         | NotifyFilters.LastWrite
                         | NotifyFilters.Security
                         | NotifyFilters.Size;

        // add handler methods
        watcher.Changed += OnChanged;
        watcher.Created += OnCreated;
        watcher.Deleted += OnDeleted;
        watcher.Renamed += OnRenamed;
        watcher.Error += OnError;

        watcher.IncludeSubdirectories = true;
        watcher.EnableRaisingEvents = true;

        // wait for next key to kill execution
        Console.ReadLine();
    }
    catch (Exception ex)
    {
        _logger.LogError($"Couldn't watch folder: {directoryPath}\nBecause: {ex}");
    }
}

Изменить

Попытка использовать ответ в этой связанной задаче SO: https://stackoverflow.com/a/57025115/8645002 не сделала исправить проблему. Делегат по-прежнему не запускается при запуске встроенного исполняемого файла в среде Linux.

примечание: сборка для Linux x64 однофайловый автономный exe.


person CoderLee    schedule 22.04.2021    source источник
comment
Попробуйте установить watcher.IncludeSubdirectories = false;. Но проверьте это: Microsoft.Extensions.FileProviders.Physical   -  person Jimi    schedule 22.04.2021
comment
Что, если я хочу смотреть подкаталоги, тогда мне нужно будет создать новый наблюдатель для каждого подкаталога?   -  person CoderLee    schedule 22.04.2021
comment
Тест должен проверить, существует ли проблема по-прежнему, пакет NuGet является заменой в случае, если тесты дадут ожидаемые результаты.   -  person Jimi    schedule 22.04.2021
comment
Ладно, при этом никакой разницы не было. @Jimi Какой пакет NuGet я хочу использовать сейчас? Не уверен, что я понял ваш последний комментарий.   -  person CoderLee    schedule 22.04.2021
comment
Тот, что указан в первом комментарии?   -  person Jimi    schedule 22.04.2021
comment
Ах, значит, этот пакет у меня установлен и включен. Я даже попытался передать наблюдателя в PhysicalFileWatcher с включенным опросом. Что еще стоит попробовать?   -  person CoderLee    schedule 22.04.2021
comment
Когда вы вызываете [PhysicalFileProvider].Watch("*"), он возвращает IChangeToken (сохраните его как поле), затем вы вызываете IChangeToken.RegisterChangeCallback () (это делегат действия, поэтому зарегистрируйте метод void - не используйте Lambda). Обратный вызов уведомляет State (как объект), когда состояние отслеживаемого пути изменяется.   -  person Jimi    schedule 22.04.2021
comment
Что делать, если это не работает? Я создаю автономный исполняемый файл Linux, который не запускает делегат при запуске в WSL2, но отлично работает при отладке для Windows.   -  person CoderLee    schedule 22.04.2021