使用 Rust 实现递归拷贝文件并根据文件名正则过滤

以下是一个使用 Rust 实现的递归拷贝文件的方法,可以根据文件名正则过滤掉不想要的文件:rustuse std::fs;use std::io::{self, ErrorKind};use regex::Regex;

fn copy_file(src: &str, dest: &str, regex: &Regex) -> io::Result<()> { let metadata = fs::metadata(src)?; let file_type = metadata.file_type();

if file_type.is_dir() {        // 处理目录        fs::create_dir_all(dest)?;        for entry in fs::read_dir(src)? {            let entry = entry?;            let src_path = entry.path();            let file_name = entry.file_name().to_string_lossy();

        if regex.is_match(&file_name) {                let dest_path = format!('{}/{'}', dest, file_name);                copy_file(&src_path.to_string_lossy(), &dest_path, regex)?;            }        }    } else {        // 处理文件        if regex.is_match(src) {            fs::copy(src, dest)?;        }    }

Ok(())}

该方法接收三个参数:源文件路径、目标文件路径和一个正则表达式,用于过滤文件名。如果源文件是目录,则递归地处理该目录下的所有文件和子目录;如果源文件是普通文件,则直接复制到目标文件。

例如,如果要将目录/home/user/source中所有以.txt结尾的文件拷贝到目录/home/user/dest中,可以这样调用该方法:rustuse regex::Regex;

let src = '/home/user/source';let dest = '/home/user/dest';let regex = Regex::new(r'.txt$').unwrap();

copy_file(src, dest, &regex)?;

使用方法:

  1. 确保已安装 Rust 语言环境。2. 将代码保存为 .rs 文件。3. 使用 cargo build 编译代码。4. 运行可执行文件,并传入源路径、目标路径和正则表达式作为参数。

注意:

  • 正则表达式需要使用 r 前缀,表示原始字符串。- 目标路径的目录需要提前存在,否则程序会报错。- 程序会覆盖目标路径中已存在的文件。

示例:

假设源路径为 /home/user/source,目标路径为 /home/user/dest,正则表达式为 .txt$,则运行程序后,所有源路径中以 .txt 结尾的文件会被复制到目标路径中。

Rust 递归拷贝文件并使用正则表达式过滤文件名

原文地址: https://www.cveoy.top/t/topic/n4RU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录