All Projects → notify-rs → Notify

notify-rs / Notify

Licence: other
🔭 Cross-platform filesystem notification library for Rust.

Programming Languages

rust
11053 projects

Projects that are alternatives of or similar to Notify

fswatch
File/Directory Watcher for Modern C++
Stars: ✭ 56 (-95.01%)
Mutual labels:  filesystem, watcher
rorshach
A watchman for your directories. Rorshach allows you to listen to file system changes and run commands when these events occur.
Stars: ✭ 26 (-97.68%)
Mutual labels:  filesystem, watcher
Dfc
Report file system space usage information with style (mirror repository)
Stars: ✭ 84 (-92.52%)
Mutual labels:  cross-platform, filesystem
Watcher
watcher is a Go package for watching for files or directory changes without using filesystem events.
Stars: ✭ 1,004 (-10.6%)
Mutual labels:  watcher, cross-platform
watcher
The file system watcher that strives for perfection, with no native dependencies and optional rename detection support.
Stars: ✭ 37 (-96.71%)
Mutual labels:  filesystem, watcher
chokidar-socket-emitter
a simple chokidar watcher which emits events to all connected socket.io clients
Stars: ✭ 28 (-97.51%)
Mutual labels:  filesystem, watcher
Renamer
Rename files in bulk.
Stars: ✭ 240 (-78.63%)
Mutual labels:  cross-platform, filesystem
SwiftFSWatcher
A simple easy to use / extend File System watcher using Swift
Stars: ✭ 35 (-96.88%)
Mutual labels:  filesystem, watcher
System.io.abstractions
Just like System.Web.Abstractions, but for System.IO. Yay for testable IO access!
Stars: ✭ 844 (-24.84%)
Mutual labels:  cross-platform, filesystem
Chokidar
Minimal and efficient cross-platform file watching library
Stars: ✭ 8,538 (+660.28%)
Mutual labels:  watcher, filesystem
Chime
🎵 Python sound notifications made easy
Stars: ✭ 56 (-95.01%)
Mutual labels:  cross-platform
F2fs Notes
F2FS的学习笔记以及源码分析。这个github的分析都是初版,CSDN的版本是经过修改的,应该逻辑更为通畅,建议去CSDN进行阅读,连接如下。
Stars: ✭ 56 (-95.01%)
Mutual labels:  filesystem
Cmake Get
Get dependencies with cmake
Stars: ✭ 59 (-94.75%)
Mutual labels:  cross-platform
Wago
Automate the actions you do after saving code.
Stars: ✭ 60 (-94.66%)
Mutual labels:  watcher
Ueviewer
Viewer and exporter for Unreal Engine 1-4 assets (UE Viewer).
Stars: ✭ 1,083 (-3.56%)
Mutual labels:  cross-platform
Win10 Explorer
A new windows 10 file explorer
Stars: ✭ 58 (-94.84%)
Mutual labels:  filesystem
Cords
File-system fault injection framework for distributed storage systems
Stars: ✭ 55 (-95.1%)
Mutual labels:  filesystem
Criterion
A cross-platform C and C++ unit testing framework for the 21st century
Stars: ✭ 1,073 (-4.45%)
Mutual labels:  cross-platform
Swspotify
Cross-platform library to get the currently playing song and artist from Spotify w/o using the API or the internet. Very fast.
Stars: ✭ 54 (-95.19%)
Mutual labels:  cross-platform
Linux Apfs
APFS module for linux, with experimental write support. This tree is just for development, please use linux-apfs-oot instead.
Stars: ✭ 63 (-94.39%)
Mutual labels:  filesystem

Notify

» Crate » Docs » CI » Downloads » Conduct » Public Domain

Cross-platform filesystem notification library for Rust.

Caution! This is unstable code!

You likely want either the latest 4.0 release or 5.0.0-pre.6.

(Looking for desktop notifications instead? Have a look at notify-rust or alert-after!)

As used by: alacritty, cargo watch, cobalt, docket, mdBook, pax rdiff, rust-analyzer, timetrack, watchexec, xi-editor, and others.

Installation

[dependencies]
crossbeam-channel = "0.4.0"
notify = "5.0.0-pre.6"

Usage

The examples below are aspirational only, to preview what the final release may have looked like. They may not work. Refer to the API documentation instead.

use notify::{RecommendedWatcher, RecursiveMode, Result, watcher};
use std::time::Duration;

fn main() -> Result<()> {
    // Automatically select the best implementation for your platform.
    // You can also access each implementation directly e.g. INotifyWatcher.
    let mut watcher = watcher(Duration::from_secs(2))?;

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

    // This is a simple loop, but you may want to use more complex logic here,
    // for example to handle I/O.
    for event in &watcher {
        match event {
            Ok(event) => println!("changed: {:?}", event.path),
            Err(err) => println!("watch error: {:?}", err),
        };
    }

    Ok(())
}

With a channel

To get a channel for advanced or flexible cases, use:

let rx = watcher.channel();

loop {
    match rx.recv() {
        // ...
    }
}

To pass in a channel manually:

let (tx, rx) = crossbeam_channel::unbounded();
let mut watcher: RecommendedWatcher = Watcher::with_channel(tx, Duration::from_secs(2))?;

for event in rx.iter() {
    // ...
}

With precise events

By default, Notify issues generic events that carry little additional information beyond what path was affected. On some platforms, more is available; stay aware though that how exactly that manifests varies. To enable precise events, use:

use notify::Config;
watcher.configure(Config::PreciseEvents(true));

With notice events

Sometimes you want to respond to some events straight away, but not give up the advantages of debouncing. Notice events appear once immediately when the occur during a debouncing period, and then a second time as usual at the end of the debouncing period:

use notify::Config;
watcher.configure(Config::NoticeEvents(true));

With ongoing events

Sometimes frequent writes may be missed or not noticed often enough. Ongoing write events can be enabled to emit more events even while debouncing:

use notify::Config;
watcher.configure(Config::OngoingEvents(Some(Duration::from_millis(500))));

Without debouncing

To receive events as they are emitted, without debouncing at all:

let mut watcher = immediate_watcher()?;

With a channel:

let (tx, rx) = unbounded();
let mut watcher: RecommendedWatcher = Watcher::immediate_with_channel(tx)?;

Serde

Events can be serialisable via serde. To enable the feature:

notify = { version = "5.0.0-pre.6", features = ["serde"] }

Platforms

  • Linux / Android: inotify
  • macOS: FSEvents
  • Windows: ReadDirectoryChangesW
  • All platforms: polling

FSEvents

Due to the inner security model of FSEvents (see FileSystemEventSecurity), some event cannot be observed easily when trying to follow files that do not belong to you. In this case, reverting to the pollwatcher can fix the issue, with a slight performance cost.

License

Notify was undergoing a transition to using the Artistic License 2.0 from CC Zero 1.0. A part of the code is only under CC0, and another part, including all new code since commit 3378ac5a, is under both CC0 and Artistic. When the project was to be entirely free of CC0 code, the license would be formally changed (and that would have incurred a major version bump). As part of this, contributions to Notify since would agree to release under both.

Origins

Inspired by Go's fsnotify and Node.js's Chokidar, born out of need for cargo watch, and general frustration at the non-existence of C/Rust cross-platform notify libraries.

Written by Félix Saparelli and awesome contributors.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].