GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Gibt es in der Linux-Welt ein Äquivalent zum .Net FileSystemWatcher?

Wie bereits gesagt, hat Mono die Klasse "System.IO.FileSystemWatcher", das ist der entsprechende Link:http://www.go-mono.com/docs/monodoc.ashx?link=T%3aSystem.IO. FileSystemWatcher

"Monos Implementierung des FileSystemWatcher hat mehrere Backends. Dies ist notwendig, da nicht alle von Mono unterstützten Betriebssysteme alle erforderlichen Funktionen haben, um die von Anwendungen erwartete Funktionalität bereitzustellen.

Wenn der Kernel des Betriebssystems das Überwachen von Verzeichnissen unterstützt (inotify unter Linux, KEvents unter BSD oder OSX), wird diese Funktion verwendet; Andernfalls greift es auf die Verwendung der Gamin- oder FAM-Bibliotheken zurück (diese Bibliotheken bieten eine API zum Überwachen von Verzeichnissen) und wenn keine dieser Funktionen verfügbar ist, fragt Mono alle 750 Millisekunden die beobachteten Verzeichnisse ab.

Sie können das Polling-Verhalten erzwingen (anstatt die Kernel-Unterstützung zu verwenden), indem Sie die Umgebungsvariable MONO_MANAGED_WATCHER festlegen, bevor Sie Ihre Anwendung ausführen. Dies kann für Dateisysteme nützlich sein, die keine Benachrichtigung unterstützen und dennoch eine Abfrage zum Erkennen von Änderungen erfordern."


Das wäre Gamin the File Alteration Monitor oder Inotify.

Bearbeiten:Mono hat Gamin-Bindungen - tatsächlich verwendet seine Implementierung von FileSystemWatcher Gamin. https://www.mono-project.com/docs/faq/technical/#what-are-the-issues-with-filesystemwatcher.

Was sind die Probleme mit FileSystemWatcher?

Die Mono-Implementierung von FileSystemWatcher hat eine Reihe von Backends, das optimalste mit weniger Abhängigkeiten ist das inotify-Backend (verfügbar in Mono 1.1.17 und neueren Versionen).

Mit diesem Backend versorgt der Kernel Mono mit Updates zu allen Änderungen an Dateien im Dateisystem, aber es erfordert einen inotify-fähigen Kernel, der nur von neueren Linux-Distributionen ausgeliefert wird.

In älteren Linux-Systemen müssen Sie FAM oder Gamin installiert haben (es funktioniert mit beiden). Möglicherweise müssen die -devel-Pakete installiert sein.

Für die *BSD-Familie gibt es eine Kqueue-basierte Implementierung, die verwendet wird, wenn sie zur Laufzeit erkannt wird.

Wenn keiner der obigen Schritte funktioniert, greift Mono darauf zurück, die Verzeichnisse nach Änderungen abzufragen, was alles andere als optimal ist.


Ich möchte meine Beobachtungen mit FileSystemWatcher in Mono in Ubuntu 10.10 teilen. Hier ist eine sehr einfache Implementierung von FileSystemWatcher in C#

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);
        }
    }
}

Dieser Code wurde getestet und funktioniert sowohl unter Windows XP als auch unter Ubuntu 10.10. Allerdings möchte ich darauf hinweisen, dass sich der FileSystemWatcher unter Ubuntu 10.10 (evtl. auch frühere Versionen) eindeutig verhält.
Wenn das überwachte Verzeichnis keine Unterverzeichnisse enthält, führt das Aufrufen eines FileSystemWatcher mit auf „true“ gesetzter IncludeSubdirectories-Eigenschaft dazu, dass FileSystemWatcher Ereignisse ignoriert. Wenn es jedoch Unterverzeichnisse im Zielverzeichnis gibt, funktioniert IncludeSubdirectories auf true gesetzt wie erwartet.
Was immer funktioniert, ist, wenn IncludeSubdirectories auf false gesetzt ist. In diesem Fall überwacht der FileSystemWatcher nur das Zielverzeichnis.
Ich hoffe, dies ist nützlich für Programmierer, die Mono auf verschiedenen Betriebssystemen verwenden und den FileSystemWatcher-Typ aufrufen möchten.


Linux
  1. Gibt es STDCALL unter Linux?

  2. Gibt es ein Linux-Äquivalent zu Programmer's Notepad oder Notepad++

  3. Was ist das Äquivalent zum Linux-Dateibefehl für Windows?

  4. Was ist das Äquivalent von Linux's ~ (Tilde) in Windows?

  5. Gibt es ein Äquivalent zu cd - für cp oder mv?

Die 8 beliebtesten verfügbaren Linux-Distributionen

Ein Windows-Typ in einer Linux-Welt:YaST und der Desktop

Gibt es ein WinSCP-Äquivalent für Linux?

Was wäre das Äquivalent der Win32-API in Linux?

Gibt es ein Windows-Äquivalent zum Unix-Strings-Befehl?

Was ist das Linux-Äquivalent zum Windows-Startup?