C# watch for file changes

Date: 2019-10-29

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);
}
27800cookie-checkC# watch for file changes