https://stackoverflow.com/a/721743
public class ValidTime
{
private DateTime _validTo;
readonly TimeSpan _validTimeSpan;
private ValidTime(TimeSpan validTimeSpan)
{
_validTimeSpan = validTimeSpan;
_validTo = DateTime.Now.Add(_validTimeSpan);
}
public bool IsValid() => DateTime.Now >= _validTo;
public void Reset() => _validTo = DateTime.Now.Add(_validTimeSpan);
public static ValidTime From(TimeSpan ts) => new(ts);
}
public class DirectoryWatcher
{
readonly ValidTime _watcherValidTime;
readonly string _path;
readonly Action _action;
IDisposable _watcher;
public DirectoryWatcher(string path, TimeSpan validTime, Action action)
{
_watcherValidTime = ValidTime.From(validTime);
_path = path;
_action = action;
}
public void UpdateWatcher(bool checkNow = false)
{
if (_watcher != null && _watcherValidTime.IsValid()) return;
_watcherValidTime.Reset();
_watcher?.Dispose();
_watcher = CreateFileWatcher(_path, (object sender, EventArgs e) => _action());
if (checkNow)
_action();
}
public static IDisposable CreateFileWatcher(string path, EventHandler onSomethingChanged)
{
var watcher = new FileSystemWatcher
{
Path = path,
IncludeSubdirectories = true,
};
// Add event handlers.
watcher.Changed += (a, b) => onSomethingChanged(a, b);
watcher.Created += (a, b) => onSomethingChanged(a, b);
watcher.Deleted += (a, b) => onSomethingChanged(a, b);
watcher.Renamed += (a, b) => onSomethingChanged(a, b);
// Begin watching.
watcher.EnableRaisingEvents = true;
return watcher;
}
} public IDisposable WatchForFolderChanges(string path, Action<object, object> onSomethingChanged)
{
var watcher = new FileSystemWatcher
{
Path = path,
IncludeSubdirectories = true,
};
// Add event handlers.
watcher.Changed += (a, b) => onSomethingChanged(a, b);
watcher.Created += (a, b) => onSomethingChanged(a, b);
watcher.Deleted += (a, b) => onSomethingChanged(a, b);
watcher.Renamed += (a, b) => onSomethingChanged(a, b);
// Begin watching.
watcher.EnableRaisingEvents = true;
return watcher;
}
public void CreateFileWatcher(string path)
{
// Create a new FileSystemWatcher and set its properties.
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = path;
/* Watch for changes in LastAccess and LastWrite times, and
the renaming of files or directories. */
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
// Only watch text files.
watcher.Filter = "*.txt";
// Add event handlers.
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
// Begin watching.
watcher.EnableRaisingEvents = true;
}
// Define the event handlers.
private static void OnChanged(object source, FileSystemEventArgs e)
{
// Specify what is done when a file is changed, created, or deleted.
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}
private static void OnRenamed(object source, RenamedEventArgs e)
{
// Specify what is done when a file is renamed.
Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
}
278000cookie-checkC# watch for file changes