Skip to content
Snippets Groups Projects
Select Git revision
  • 00a8bcd15b0385539bb1399e3a83da0f1deb1283
  • master default protected
  • dev
3 results

elixir__file_system

  • Clone with SSH
  • Clone with HTTPS
  • user avatar
    Xiangrong Hao authored and GitHub committed
    * add docs and spec
    
    * make find_executable private
    00a8bcd1
    History

    FileSystem

    A file change watcher wrapper based on fs

    System Support

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

    NOTE: On Linux and FreeBSD you need to install inotify-tools.

    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.1.0", 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 listener extra arguments

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

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

    FileSystem.start_link(dirs: ["/path/to/some/files"], listener_extra_args: "--latency=0.0")

    See the fs source for more details.