2 个版本 (1 个稳定版)
5.0.0-pre.2 | 2019 年 9 月 12 日 |
---|---|
4.0.12 | 2019 年 9 月 12 日 |
#563 in 文件系统
125KB
2K SLoC
Notify
Rust 的跨平台文件系统通知库。
注意!这是不稳定代码!
你可能想要最新 4.0 版本或 5.0.0-pre.1 版本。
(在寻找桌面通知吗?请查看 notify-rust 或 alert-after!)
由以下项目使用: alacritty,cargo watch,cobalt,docket,mdBook,pax rdiff,rust-analyzer,timetrack,watchexec,xi-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