当前位置:  开发笔记 > 编程语言 > 正文

是否有与Linux世界中的.Net FileSystemWatcher相同的东西?

如何解决《是否有与Linux世界中的.NetFileSystemWatcher相同的东西?》经验,为你挑选了3个好方法。

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

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



1> Mihai Limbăș..:

那就是Gamin the File Alteration Monitor或Inotify.

编辑:Mono确实有Gamin绑定 - 事实上,它的FileSystemWatcher实现使用Gamin.请访问http://www.mono-project.com/FAQ:_Technical(搜索FileSystemWatcher的页面,遗憾的是,FAQ没有锚点.)



2> J Mills..:

问候,我想在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



3> 小智..:

正如已经说过的,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且仍需要轮询来检测更改的文件系统可能很有用."

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有