Rust로 폴더 감시자 만들기

2023. 3. 5. 18:59Language/Rust

오늘은 특정 폴더를 감시하여 이벤트를 받아오는 프로그램을 만들어보도록 하겠습니다.

notify라는 라이브러리를 사용하면 쉽게 만들 수 있습니다.

먼저 해당 라이브러리 의존성을 추가해 줍니다.

> cargo add notify

cargo를 사용하여 추가하거나 Cargo.toml에 직접 추가합니다

[dependencies]
notify = "5.1.0"

watch 함수를 제작합니다. notify에서 RecommendedWatcher, Watcher, RecursiveMode, Config를 import 해줍니다

use std::path::Path;
use notify::{RecommendedWatcher, Watcher, RecursiveMode, Config};

fn watch<P:AsRef<Path>>(path:P) -> notify::Result<()> {
    let (tx, rx) = std::sync::mpsc::channel();

    let mut watcher = RecommendedWatcher::new(tx, Config::default())?;

    watcher.watch(path.as_ref(), RecursiveMode::Recursive)?;

    for res in rx {
        match res {
            Ok(event) => println!("changed: {:?}", event),
            Err(e) => println!("watch error: {:?}", e),

        }
    }
    Ok(())
}

watch 함수는 channel을 사용하여 동시성을 구현합니다. channel을 사용하면 Sender(tx)와 Receiver(rx)를 사용하게 되는데 이때 Receiver를 사용하여 이벤트를 받으면 됩니다.

Watcher를 사용하여 특정 폴더를 감시하다가 파일이나 폴더가 생성되면 이벤트를 발생시킵니다.

main 함수는 프로그램을 실행 시킬 때 특정 경로를 입력 반아 watch를 사용해 감시하도록 합니다.

fn main() {
    let path = std::env::args()
                    .nth(1)
                    .expect("Argument 1 needs to be a path");
    println!("watching {}", path);

    if let Err(e) = watch(path){
        print!("error: {:?}", e);
    }
}

최종

use std::path::Path;
use notify::{RecommendedWatcher, Watcher, RecursiveMode, Config};
fn watch<P:AsRef<Path>>(path:P) -> notify::Result<()> {
    let (tx, rx) = std::sync::mpsc::channel();

    let mut watcher = RecommendedWatcher::new(tx, Config::default())?;

    watcher.watch(path.as_ref(), RecursiveMode::Recursive)?;

    for res in rx {
        match res {
            Ok(event) => println!("changed: {:?}", event),
            Err(e) => println!("watch error: {:?}", e),

        }
    }
    Ok(())
}

fn main() {
    let path = std::env::args()
                    .nth(1)
                    .expect("Argument 1 needs to be a path");
    println!("watching {}", path);

    if let Err(e) = watch(path){
        print!("error: {:?}", e);
    }
}

실행

> cargo build
> cargo run D:\Temp
> watching D:\Temp\watch

실행이 되면 해당 경로에서 새로운 파일을 만들어봅니다.

changed: Event { kind: Create(Any), paths: ["D:\\Temp\\watch\\새 텍스트 문서.txt"], attr:tracker: None, attr:flag: None, attr:info: None, attr:source: None }

새파일이나 폴더가 만들어지면 이벤트가 발생하는 것을 볼 수 있습니다.

출처 : How to start with Rust developing a simple fs-watcher (linkedin.com)

'Language > Rust' 카테고리의 다른 글

Rust 매크로  (0) 2023.03.11
Rust gRPC 사용하기  (0) 2023.03.06
Rust 마스코트로 콘솔 메시지 출력  (1) 2023.03.05
Rust Dangling Pointer  (0) 2023.02.25
Rust의 배열  (0) 2023.01.09