Linux世界中是否有与.Net FileSystemWatcher相当的function?

我发现.Net FileSystemWatcher类非常方便编写实用程序,当文件显示在他们的监视文件夹中时它们会自动生效。 在* nix世界中是否有与此function相同的function,可以让我观看文件夹(可能还有其所有子目录)?

编辑:最好这将是不需要内核补丁的东西。

Solutions Collecting From Web of "Linux世界中是否有与.Net FileSystemWatcher相当的function?"

这将是Gamin文件更改监视器或Inotify 。

编辑:单声道有Gamin绑定 – 实际上,它的FileSystemWatcher的实现使用Gamin。 请参阅http://www.mono-project.com/FAQ:_Technical (搜索FileSystemWatcher的页面,常见问题解答中不包含锚点)。

问候,我想在Ubuntu 10.10的Mono中使用FileSystemWatcher分享我的观察。 这里是一个非常简单的实现FileSystemWatcher在C#

using System; using System.Collections.Generic; using System.Collections; using System.Text; using System.IO; using System.Reflection; namespace FileSystemWatcherSandbox { public class Program { static void Main(string[] args) { foreach(DictionaryEntry de in Environment.GetEnvironmentVariables()) { Console.WriteLine("{0} = {1}",de.Key,de.Value); } string basePath = AppDomain.CurrentDomain.BaseDirectory; Console.WriteLine("watching: {0}", basePath); FileSystemWatcher fsw = new FileSystemWatcher(basePath); fsw.Changed += new FileSystemEventHandler(fsw_Changed); fsw.Created += new FileSystemEventHandler(fsw_Created); fsw.Deleted += new FileSystemEventHandler(fsw_Deleted); fsw.Error += new ErrorEventHandler(fsw_Error); fsw.Renamed += new RenamedEventHandler(fsw_Renamed); fsw.EnableRaisingEvents = true; fsw.IncludeSubdirectories = true; while (true) { WaitForChangedResult result = fsw.WaitForChanged(WatcherChangeTypes.All,10000); Console.WriteLine(result.TimedOut ? "Time out" : "hmmm"); } } static void fsw_Renamed(object sender, RenamedEventArgs e) { Console.WriteLine("({0}): {1} | {2}", MethodInfo.GetCurrentMethod().Name, e.ChangeType, e.FullPath); } static void fsw_Error(object sender, ErrorEventArgs e) { Console.WriteLine("({0}): {1}", MethodInfo.GetCurrentMethod().Name, e.GetException().Message); } static void fsw_Deleted(object sender, FileSystemEventArgs e) { Console.WriteLine("({0}): {1} | {2}", MethodInfo.GetCurrentMethod().Name, e.ChangeType, e.FullPath); } static void fsw_Created(object sender, FileSystemEventArgs e) { Console.WriteLine("({0}): {1} | {2}", MethodInfo.GetCurrentMethod().Name, e.ChangeType, e.FullPath); } static void fsw_Changed(object sender, FileSystemEventArgs e) { Console.WriteLine("({0}): {1} | {2}", MethodInfo.GetCurrentMethod().Name, e.ChangeType, e.FullPath); } } } 

此代码已经过测试,可以在Windows XP和Ubuntu 10.10上运行。 不过,我想指出的是,在Ubuntu 10.10(可能更早的版本)下,FileSystemWatcher的行为是唯一的。
如果正在监视的目录不包含子目录,则调用带有IncludeSubdirectories属性设置为true的FileSystemWatcher将导致FileSystemWatcher忽略事件。 但是,如果目标目录中有子目录,则IncludeSubdirectories设置为true将按预期工作。
如果IncludeSubdirectories设置为false,总是会工作的。 在这种情况下,FileSystemWatcher只会看目标目录。
我希望这对于希望跨不同操作系统使用Mono并调用FileSystemWatcher类型的程序员很有用。

chickenSandwich

正如已经说过的,Mono具有类“System.IO.FileSystemWatcher”,这是相关链接: http : //www.go-mono.com/docs/monodoc.ashx? link=T% 3aSystem.IO。 FileSystemWatcher的

Mono的FileSystemWatcher实现有多个后端,这是必要的,因为并不是Mono支持的所有操作系统都具有提供应用程序所需功能所需的所有功能。

如果操作系统内核支持观看目录(在Linux上进行inotify,BSD或OSX上的KEvents),则使用该功能; 否则,它会回到使用Gamin或FAM库(这些库提供了一个API来监视目录),如果没有这些功能可用,Mono将每隔750毫秒轮询目录。

在执行应用程序之前,可以通过设置MONO_MANAGED_WATCHER环境变量来强制轮询行为(而不是使用内核支持)。 这对于不支持inotify的文件系统可能很有用,而且仍然需要轮询来检测更改。“

是的,通知和通知 。

我不知道莫诺是否有这些包裹,但它是值得检查。

如果您使用的是精彩的QT库(www.qtsoftware.com),那么它就是QFileSystemWatcher。