Я пытаюсь следить за изменениями в указанном каталоге с помощью класса 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.
watcher.IncludeSubdirectories = false;
. Но проверьте это: Microsoft.Extensions.FileProviders.Physical - person Jimi   schedule 22.04.2021[PhysicalFileProvider].Watch("*")
, он возвращает IChangeToken (сохраните его как поле), затем вы вызываете IChangeToken.RegisterChangeCallback () (это делегат действия, поэтому зарегистрируйте методvoid
- не используйте Lambda). Обратный вызов уведомляетState
(как объект), когда состояние отслеживаемого пути изменяется. - person Jimi   schedule 22.04.2021