using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Wox.Infrastructure.Logger; using Wox.Plugin.Program.ProgramSources; namespace Wox.Plugin.Program { internal static class FileChangeWatcher { private static readonly List WatchedPath = new List(); // todo remove previous watcher events public static void AddAll(List sources, string[] suffixes) { foreach (var s in sources) { if (Directory.Exists(s.Location)) { AddWatch(s.Location, suffixes); } } } public static void AddWatch(string path, string[] programSuffixes, bool includingSubDirectory = true) { if (WatchedPath.Contains(path)) return; if (!Directory.Exists(path)) { Log.Warn($"FileChangeWatcher: {path} doesn't exist"); return; } WatchedPath.Add(path); foreach (string fileType in programSuffixes) { FileSystemWatcher watcher = new FileSystemWatcher { Path = path, IncludeSubdirectories = includingSubDirectory, Filter = $"*.{fileType}", EnableRaisingEvents = true }; watcher.Changed += FileChanged; watcher.Created += FileChanged; watcher.Deleted += FileChanged; watcher.Renamed += FileChanged; } } private static void FileChanged(object source, FileSystemEventArgs e) { Task.Run(() => { Main.IndexPrograms(); }); } } }