GNU/Linux >> Belajar Linux >  >> Linux

Apakah ada yang setara dengan .Net FileSystemWatcher di dunia Linux?

Seperti yang telah dikatakan, Mono memiliki kelas "System.IO.FileSystemWatcher", ini adalah tautan yang relevan:http://www.go-mono.com/docs/monodoc.ashx?link=T%3aSystem.IO. FileSystemWatcher

"Implementasi FileSystemWatcher Mono memiliki beberapa backend. Hal ini diperlukan karena tidak semua sistem operasi yang didukung oleh Mono memiliki semua fitur yang diperlukan untuk menyediakan fungsionalitas yang diharapkan oleh aplikasi.

Jika kernel sistem operasi mendukung menonton direktori (beritahu di Linux, KEvents di BSD atau OSX) fitur itu digunakan; Jika tidak, akan kembali menggunakan perpustakaan Gamin atau FAM (perpustakaan ini menyediakan API untuk memantau direktori) dan jika tidak ada fitur tersebut yang tersedia, Mono akan memilih setiap 750 milidetik direktori yang ditonton.

Anda dapat memaksakan perilaku polling (alih-alih menggunakan dukungan kernel) dengan menyetel variabel lingkungan MONO_MANAGED_WATCHER sebelum menjalankan aplikasi Anda. Ini mungkin berguna untuk sistem file yang tidak mendukung notifikasi dan masih memerlukan polling untuk mendeteksi perubahan."


Itu adalah Gamin the File Alteration Monitor atau Inotify.

Sunting:Mono memang memiliki ikatan Gamin - pada kenyataannya, penerapan FileSystemWatcher menggunakan Gamin. https://www.mono-project.com/docs/faq/technical/#what-are-the-issues-with-filesystemwatcher.

Apa masalah dengan FileSystemWatcher?

Implementasi Mono dari FileSystemWatcher memiliki sejumlah backend, yang paling optimal, yang memiliki dependensi lebih sedikit adalah inotify-backend (tersedia di Mono 1.1.17 dan versi yang lebih baru).

Dengan backend ini, kernel memberi Mono pembaruan pada setiap perubahan pada file pada sistem file tetapi membutuhkan kernel yang mendukung inotify, yang hanya dikirimkan oleh distribusi Linux yang lebih baru.

Di sistem Linux yang lebih lama, Anda harus menginstal FAM atau Gamin (itu akan bekerja dengan salah satunya). Anda mungkin perlu menginstal paket -devel.

Untuk keluarga *BSD, ada implementasi berbasis Kqueue yang akan digunakan saat terdeteksi saat runtime.

Jika tidak ada di atas yang berhasil, Mono akan kembali melakukan polling pada direktori untuk perubahan, yang jauh dari optimal.


Saya ingin membagikan pengamatan saya menggunakan FileSystemWatcher di Mono di Ubuntu 10.10. Ini adalah implementasi FileSystemWatcher yang sangat sederhana di 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);
        }
    }
}

Kode ini telah diuji dan bekerja pada Windows XP dan Ubuntu 10.10. Namun, saya ingin menunjukkan bahwa di bawah Ubuntu 10.10 (mungkin juga versi sebelumnya), FileSystemWatcher berperilaku unik.
Jika direktori yang sedang diawasi tidak berisi subdirektori, maka memanggil FileSystemWatcher dengan properti IncludeSubdirectories disetel ke true akan mengakibatkan FileSystemWatcher mengabaikan peristiwa. Namun, jika ada subdirektori di direktori target, maka IncludeSubdirectories yang disetel ke true akan berfungsi seperti yang diharapkan.
Apa yang akan selalu berhasil adalah jika IncludeSubdirectories disetel ke false. Dalam hal ini, FileSystemWatcher hanya akan mengawasi direktori target.
Saya harap ini berguna bagi pemrogram yang ingin menggunakan Mono di berbagai sistem operasi dan menjalankan jenis FileSystemWatcher.


Linux
  1. Memulai dengan perintah cat Linux

  2. Fedora – Apakah Ada Layanan Ppa Setara Di Dunia Fedora?

  3. Apakah ada cara untuk memeriksa rpath saat ini di Linux?

  1. Apakah ada Windows yang setara dengan perintah string Unix?

  2. Apa yang setara dengan ~ (tilde) Linux di Windows?

  3. Apa sumber mentalitas kompilasi sendiri di linux

  1. Apa persamaan Linux dengan jeda DOS?

  2. Linux setara dengan perintah terbuka Mac OS X

  3. Apakah ada STDCALL di Linux?