#filesystem-events #watch #events

notify-debouncer-full

notify event debouncer optimized for ease of use

6 releases (breaking)

0.6.0 Aug 3, 2025
0.5.0 Jan 10, 2025
0.4.0 Oct 25, 2024
0.3.2 Oct 14, 2024
0.1.0 May 17, 2023

#106 in Filesystem

Download history 98752/week @ 2025-07-28 91662/week @ 2025-08-04 103004/week @ 2025-08-11 100069/week @ 2025-08-18 102932/week @ 2025-08-25 100602/week @ 2025-09-01 105574/week @ 2025-09-08 90952/week @ 2025-09-15 110208/week @ 2025-09-22 80354/week @ 2025-09-29 86312/week @ 2025-10-06 85194/week @ 2025-10-13 88078/week @ 2025-10-20 79546/week @ 2025-10-27 73696/week @ 2025-11-03 80205/week @ 2025-11-10

326,348 downloads per month
Used in 195 crates (74 directly)

MIT/Apache

255KB
4.5K SLoC

A debouncer for [notify] that is optimized for ease of use.

  • Only emits a single Rename event if the rename From and To events can be matched
  • Merges multiple Rename events
  • Takes Rename events into account and updates paths for events that occurred before the rename event, but which haven't been emitted, yet
  • Optionally keeps track of the file system IDs all files and stitches rename events together (macOS FS Events, Windows)
  • Emits only one Remove event when deleting a directory (inotify)
  • Doesn't emit duplicate create events
  • Doesn't emit Modify events after a Create event

Installation

[dependencies]
notify-debouncer-full = "0.5.0"

In case you want to select specific features of notify, specify notify as dependency explicitly in your dependencies. Otherwise you can just use the re-export of notify from debouncer-full.

notify-debouncer-full = "0.5.0"
notify = { version = "..", features = [".."] }

Examples

use notify_debouncer_full::{notify::*, new_debouncer, DebounceEventResult};

// Select recommended watcher for debouncer.
// Using a callback here, could also be a channel.
let mut debouncer = new_debouncer(Duration::from_secs(2), None, |result: DebounceEventResult| {
    match result {
        Ok(events) => events.iter().for_each(|event| println!("{event:?}")),
        Err(errors) => errors.iter().for_each(|error| println!("{error:?}")),
    }
}).unwrap();

// Add a path to be watched. All files and directories at that path and
// below will be monitored for changes.
debouncer.watch(".", RecursiveMode::Recursive).unwrap();

Features

The following crate features can be turned on or off in your cargo dependency config:

  • serde passed down to notify-types, off by default
  • web-time passed down to notify-types, off by default
  • crossbeam-channel passed down to notify, off by default
  • flume passed down to notify, off by default
  • macos_fsevent passed down to notify, off by default
  • macos_kqueue passed down to notify, off by default
  • serialization-compat-6 passed down to notify, off by default

Caveats

As all file events are sourced from notify, the known problems section applies here too.


Notify Debouncer Full

» Docs

A debouncer for notify that is optimized for ease of use.

  • Only emits a single Rename event if the rename From and To events can be matched
  • Merges multiple Rename events
  • Takes Rename events into account and updates paths for events that occurred before the rename event, but which haven't been emitted, yet
  • Optionally keeps track of the file system IDs all files and stitches rename events together (FSevents, Windows)
  • Emits only one Remove event when deleting a directory (inotify)
  • Doesn't emit duplicate create events
  • Doesn't emit Modify events after a Create event

Features

  • crossbeam-channel passed down to notify, off by default

  • flume passed down to notify, off by default

  • serialization-compat-6 passed down to notify, off by default

Dependencies

~0.2–12MB
~64K SLoC