[Mono-dev] FileSystemWatcher Specific Implementation Check

Robert Jordan robertj at gmx.net
Thu Aug 31 16:25:16 UTC 2017


On 29.08.2017 23:05, Rick Tillery wrote:
> In 
> http://www.mono-project.com/docs/faq/technical/#what-are-the-issues-with-filesystemwatcher, 
> it mentions:
> 
> 
>     The Mono implementation of FileSystemWatcher has a number of
>     backends, the most optimal one, the one with fewer dependencies is
>     the inotify-backend (available in Mono 1.1.17 and newer versions).
> 
>     With this backend the kernel provides Mono with updates on any
>     changes to files on the file system but it requires an
>     inotify-enabled kernel, which only newer Linux distributions ship.
> 
>     In older Linux systems, you must have installed FAM or Gamin (it
>     will work with either one). You might need the -devel packets installed.
> 
>     For the *BSD family, there’s a Kqueue based implementation that will
>     be used when detected at runtime.
> 
>     If none of the above work, Mono falls back to polling the
>     directories for changes, which far from optimal.
> 
> Is there any way to determine, on a given system, which backend is being 
> used?
> 
> Specifically, I have to support a large number of Linux distros and 
> versions going back a number of years, so I need to know that none of 
> them are using polling.


You could access the static private field

System.IO.FileSystemWatcher.watcher

via reflection and then check its type:

---
using System;
using System.Reflection;
using System.IO;

class Test {
         public static void Main ()
         {
                 var fsw = new FileSystemWatcher ();
                 var fi = typeof (FileSystemWatcher).GetField 
("watcher", BindingFlags.Static | BindingFlags.NonPublic);
                 Console.WriteLine (fi.GetValue (fsw).GetType ());
         }
}
---

The polling watcher's class is "System.IO.DefaultWatcher".

Robert


More information about the Mono-devel-list mailing list