FileSystemWatcher不响应虚拟机及其主机共享的文件夹中的文件事件

时间:2015-07-05 21:10:50

标签: c# ubuntu mono virtualbox filesystemwatcher

我在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");
    }
}

1 个答案:

答案 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秒扫描。保持你的观察者一个目录,没有子目录,并且最好将它过滤到一个非常小的文件子集(一个?),如果可能的话,只有一个文件在那个目录中....

这在单声道文档中有一次被记录,但我在那里找不到它(但它在源代码中;-):

https://github.com/mono/mono/blob/88d2b9da2a87b4e5c82abaea4e5110188d49601d/mcs/class/System/System.IO/FileSystemWatcher.cs#L115

在线文件: 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但仍需要轮询的文件系统   检测变化。"