我发现.Net FileSystemWatcher类对于编写实用程序非常方便,这些实用程序会在文件显示在其监视文件夹中时自动生效.在*nix世界中是否有任何与此功能相同的功能可以让我观看文件夹(可能还有它的所有子目录)?
编辑:最好这将是不需要内核补丁的东西.
那就是Gamin the File Alteration Monitor或Inotify.
编辑:Mono确实有Gamin绑定 - 事实上,它的FileSystemWatcher实现使用Gamin.请访问http://www.mono-project.com/FAQ:_Technical(搜索FileSystemWatcher的页面,遗憾的是,FAQ没有锚点.)
问候,我想在Ubuntu 10.10中使用Mono中的FileSystemWatcher分享我的观察结果.这是C#中FileSystemWatcher的一个非常简单的实现
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且仍需要轮询来检测更改的文件系统可能很有用."