rust 使用hotwatch 监控文件变化

本文介绍了Rust库hotwatch用于监控文件变化的使用方法,包括如何监控单个文件和整个目录。在Windows下,hotwatch能正确捕获文件修改事件,但在Linux下,当使用vim编辑文件时,由于vim的临时文件机制,hotwatch只能捕获到NoticeRemove事件。为了解决这个问题,建议直接监控包含待观察文件的整个目录。文章还提供了示例代码以展示如何实现这一功能。
摘要由CSDN通过智能技术生成

hotwatch是一个可以监控文件变化的crate,使用起来非常方便。参考:GitHub - francesca64/hotwatch: A Rust library for conveniently watching and handling file changes.

监控单个文件

的代码示例如下:

use std::{thread::sleep, time::Duration};

fn main() {
    use hotwatch::{Event, Hotwatch};

    let mut hotwatch = Hotwatch::new().expect("hotwatch failed to initialize!");
    hotwatch
        .watch("test.txt", |event: Event| {
            println!("get some event {:?}",event);
            if let Event::Write(path) = event {
                println!("test.txt has changed.{:?}",path);
            }
        })
        .expect("failed to watch file!");

    loop {
        sleep(Duration::from_secs(2));
    }
}

在windows下,修改一个文件,hotwatch会先捕获到一个NoticeWrite事件,再捕获到一个Write事件。这是符合我们预期的。

但是在linux下会有一个坑。如果用vim修改这个文件,hotwatch仅仅会捕获到一个NoticeRemove事件,而且之后再也捕获不到任何事件。参考

unable to watch file edits by vim · Issue #247 · notify-rs/notify · GitHub

这可能是跟vim修改文件的机制有关,猜测vim是先整个test.txt.swap临时文件,然后当wq保存时将test.txt删掉再把test.txt.swap重名名为test.txt。 

如果使用echo "xxx">>test.txt 的方式修改文件,hotwatch是可以正常观测的。

监控整个目录

由于监控单个文件会有上述问题,所以当我们想要关注单个文件变化的时候,最好还是要监控整个目录。示例代码如下:

use std::{thread::sleep, time::Duration};

fn main() {
    use hotwatch::{Event, Hotwatch};

    let mut hotwatch = Hotwatch::new().expect("hotwatch failed to initialize!");
    hotwatch
        .watch("./", |event: Event| {
            println!("get some event {:?}",event);
            if let Event::Write(path) = event {
                if path.file_name().unwrap().to_str().unwrap().eq("test.txt") {
                println!("test.txt has changed.{:?}",path);
                }
                else{
                    println!("other file has been changed!{:?}",path);
                }
            }
        })
        .expect("failed to watch file!");

    loop {
        sleep(Duration::from_secs(2));
    }
}

在Linux下用vim编辑单个文件,结果如下:

可以看出来,vim修改文件的机制与上文猜想的一致。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值