Skip to content
Snippets Groups Projects
Select Git revision
  • dev
  • master default protected
2 results

elixir__file_system

  • Clone with SSH
  • Clone with HTTPS
  • user avatar
    falood authored
    94e5a207
    History

    FileSystem

    A file change watcher wrapper based on fs

    System Support

    • Mac fsevent
    • Linux, FreeBSD and OpenBSD inotify
    • Windows inotify-win

    NOTE:

        On Linux, FreeBSD and OpenBSD you need to install inotify-tools.
        On Macos 10.14, you need run `open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg` to compile `mac_listener`.

    Usage

    Put file_system in the deps and application part of your mix.exs

    defmodule Excellent.Mixfile do
      use Mix.Project
    
      def project do
      ...
      end
    
      defp deps do
        [
          { :file_system, "~> 0.2", only: :test },
        ]
      end
      ...
    end

    Subscription API

    You can spawn a worker and subscribe to events from it:

    {:ok, pid} = FileSystem.start_link(dirs: ["/path/to/some/files"])
    FileSystem.subscribe(pid)

    or

    {:ok, pid} = FileSystem.start_link(dirs: ["/path/to/some/files"], name: :my_monitor_name)
    FileSystem.subscribe(:my_monitor_name)

    The pid you subscribed from will now receive messages like

    {:file_event, worker_pid, {file_path, events}}

    and

    {:file_event, worker_pid, :stop}

    Example with GenServer

    defmodule Watcher do
      use GenServer
    
      def start_link(args) do
        GenServer.start_link(__MODULE__, args)
      end
    
      def init(args) do
        {:ok, watcher_pid} = FileSystem.start_link(args)
        FileSystem.subscribe(watcher_pid)
        {:ok, %{watcher_pid: watcher_pid}}
      end
    
      def handle_info({:file_event, watcher_pid, {path, events}}, %{watcher_pid: watcher_pid}=state) do
        # YOUR OWN LOGIC FOR PATH AND EVENTS
        {:noreply, state}
      end
    
      def handle_info({:file_event, watcher_pid, :stop}, %{watcher_pid: watcher_pid}=state) do
        # YOUR OWN LOGIC WHEN MONITOR STOP
        {:noreply, state}
      end
    end

    Tweaking behaviour via extra arguments

    For each platform, you can pass extra arguments to the underlying listener process.

    Each backend support different extra arguments, check backend module documentation for more information.

    Here is an example to get instant notifications on file changes for Mac OS X:

    FileSystem.start_link(dirs: ["/path/to/some/files"], latency: 0, watch_root: true)