#events #notify #watch

notify-forked

跨平台文件系统通知库

2 个版本 (1 个稳定版)

5.0.0-pre.22019 年 9 月 12 日
4.0.12 2019 年 9 月 12 日

#563 in 文件系统

CC0 许可证

125KB
2K SLoC

Notify

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

Rust 的跨平台文件系统通知库。

注意!这是不稳定代码!

你可能想要最新 4.0 版本或 5.0.0-pre.1 版本。

(在寻找桌面通知吗?请查看 notify-rustalert-after!)

由以下项目使用: alacrittycargo watchcobaltdocketmdBookpax rdiffrust-analyzertimetrackwatchexecxi-editor 以及其他。

Notify 已停止开发

抱歉。

Notify 占据了我多年的生活,尽管这是一个艰难的决定,但我也非常如释重负。它有好的时候,也有不好的时候;现在是时候了。我有一些距离,仔细地看了看这一切,并意识到我不想再这样做。Notify 激发了长时间的负面情绪,我现在要把它整理一下。

后勤:有几个人有提交权限,有几个人有发布权限,项目也受到 Rust Bus 的保护。

如果你想接管或获得提交/发布权限,并且你是受信任/受尊敬的社区成员,请提出申请。如果你不是受信任/受尊敬的社区成员,请先尝试分支。

我不会合并 PR,除非是紧急情况,我不会提交,除非我真的非常想这么做,我不会回应问题或评论,目标是完全脱离。

再见了 🔭 感谢所有的一切 🐬

安装

[dependencies]
crossbeam-channel = "0.3.8"
notify = "5.0.0-pre.2"

使用

以下示例仅为理想状态,用于预览最终发布版本可能的外观。它们可能无法正常工作。请参阅API 文档

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(())
}

使用通道

要获取用于高级或灵活情况的通道,请使用

let rx = watcher.channel();

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

手动传递通道

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

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

使用精确的事件

默认情况下,Notify 会发布通用事件,除了受影响的路径外,几乎没有携带其他附加信息。在一些平台上,还有更多信息可用;但请注意,具体表现形式可能会有所不同。要启用精确事件,请使用

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

使用通知事件

有时您希望立即对某些事件做出响应,但又不想放弃防抖的优势。通知事件在防抖期间发生时立即出现一次,然后在防抖周期的末尾再次以常规方式出现

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

使用持续事件

有时频繁的写入可能会被忽略或未足够引起注意。启用持续写入事件可以在防抖的同时发出更多事件

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

不使用防抖

以它们被发布的方式接收事件,完全不进行防抖

let mut watcher = immediate_watcher()?;

使用通道

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

Serde

事件可以通过 serde 进行序列化。要启用此功能

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

平台

  • Linux / Android: inotify
  • macOS: FSEvents
  • Windows: ReadDirectoryChangesW
  • 所有平台: 轮询

FSEvents

由于 FSEvents 的内部安全模型(请参阅 FileSystemEventSecurity),在尝试跟踪不属于您的文件时,某些事件可能难以观察到。在这种情况下,可以回退到 pollwatcher 以解决问题,但会略微影响性能。

许可证

Notify 正在过渡到使用Artistic License 2.0,从 CC Zero 1.0 过渡而来。部分代码仅受 CC0 许可,另一部分(包括自提交 3378ac5a 以来的所有新代码)受 CC0 和 Artistic 许可的双重许可。当项目要完全摆脱 CC0 代码时,许可证将正式更改(这将导致主要版本号的增加)。作为此过程的一部分,自那时以来对 Notify 的贡献将同意在两种许可证下发布。

起源

受 Go 的 fsnotify 和 Node.js 的 Chokidar 启发,出于对 cargo watch 的需求,以及对 C/Rust 跨平台通知库不存在的普遍不满而诞生。

Félix Saparelli 和出色的 贡献者 编写。

依赖项

~2–11MB
~84K SLoC