我在Ubuntu VM上有一个dnx控制台应用程序,它监视与主机操作系统共享的文件夹(Windows 8.1)。当Ubuntu VM上的共享文件夹中发生文件更改时,控制台应用程序会响应它们,但不会在主机上进行文件更改时响应。怎么样才能让它发挥作用?
using System;
using System.IO;
public class Program
{
public static void Main(string[] args)
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = "/media/sf_shared";
watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName;
watcher.Changed += new FileSystemEventHandler(Respond);
watcher.Created += new FileSystemEventHandler(Respond);
watcher.Deleted += new FileSystemEventHandler(Respond);
watcher.EnableRaisingEvents = true;
Console.ReadKey();
}
private static void Respond(object source, FileSystemEventArgs e)
{
Console.WriteLine("Hej");
}
}
答案 0 :(得分:1)
在Linux上,Mono将使用inotify作为其首选事件,将后端发布到FileSystemWatcher类。在您的情况下,问题是Windows对文件系统的更改不会导致Ubuntu / Linux文件系统发布事件... Windows到Windows UNC共享路径会发布文件系统事件,但是跨平台文件系统共享'典型地'不要......即在VM主机中嵌入Samba ......不是硬规则,但每个部署的环境都需要测试。
在你的情况下,这种情况发生的唯一方法是一个轮询系统,单声道确实支持,如果它支持5个不同的后端,文件系统开箱即用。
您可以强制它使用内置轮询方法(在创建文件监视对象之前执行此操作):
Environment.SetEnvironmentVariable ("MONO_MANAGED_WATCHER", "1");
或者在运行应用程序之前设置环境变量:
export MONO_MANAGED_WATCHER=1
买家要小心:轮询时出现性能问题。这将导致您在观察者中定义的内容的750秒扫描。保持你的观察者一个目录,没有子目录,并且最好将它过滤到一个非常小的文件子集(一个?),如果可能的话,只有一个文件在那个目录中....
这在单声道文档中有一次被记录,但我在那里找不到它(但它在源代码中;-):
在线文件: http://docs.go-mono.com/monodoc.ashx?link=T%3aSystem.IO.FileSystemWatcher
旧文档说明(可能在单声道的手册页中?):
" Mono的FileSystemWatcher实现有多个后端。 这是必要的,因为Mono不支持所有操作系统 具有提供预期功能所需的所有功能 通过申请。
如果操作系统内核支持观看目录(inotify 在Linux上,使用BSD或OSX上的KEvents)使用该功能;否则它 回到使用Gamin或FAM库(这些库 提供一个API来监控目录),如果没有这些功能 可用,Mono将每750毫秒轮询一次目录 观看。
您可以强制轮询行为(而不是使用内核 通过设置MONO_MANAGED_WATCHER环境变量来支持) 在执行您的申请之前。这可能有用 不支持inotify但仍需要轮询的文件系统 检测变化。"