gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:41:24 25 4
gpt4 key购买 nike

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

最佳答案

在 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's implementation of the FileSystemWatcher has multiple backends. This is necessary because not all operating systems supported by Mono have all the features necessary to provide the functionality expected by applications.

If the operating system kernel supports watching directories (inotify on Linux, KEvents on BSD or OSX) that feature is used; Otherwise it falls back to using the Gamin or FAM libraries (these libraries provide an API to monitor directories) and if none of those features are available, Mono will poll every 750 milliseconds the directories watched.

You can force the polling behavior (instead of using the kernel support) by setting the MONO_MANAGED_WATCHER environment variable before executing your application. This might be useful for filesystems that do not support inotify and still require polling to detect changes."

关于c# - FileSystemWatcher 不响应虚拟机及其主机共享文件夹中的文件事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31235034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com