【Rust光年纪】简化文件操作流程:深度剖析多款文件系统操作库
文件系统操作利器:介绍常用的文件操作库
前言
在现代软件开发中,文件系统操作是一个十分常见的需求。为了更加高效地进行文件系统操作,开发人员经常会使用各种文件系统操作库来简化开发流程、提高代码可维护性。本文将介绍几个常用的文件系统操作库,包括它们的核心功能、使用场景、安装与配置方法以及API概览,希望能够为开发人员选择合适的库提供一些参考。
欢迎订阅专栏:Rust光年纪
文章目录
- 文件系统操作利器:介绍常用的文件操作库
- 前言
- 1. notify:用于文件系统事件通知的库
- 1.1 简介
- 1.1.1 核心功能
- 1.1.2 使用场景
- 1.2 安装与配置
- 1.2.1 安装指南
- 1.2.2 基本配置
- 1.3 API 概览
- 1.3.1 事件监听
- 1.3.2 事件过滤
- 2. walkdir:用于递归遍历目录的库
- 2.1 简介
- 2.1.1 核心功能
- 2.1.2 使用场景
- 2.2 安装与配置
- 2.2.1 安装指南
- 2.2.2 基本配置
- 2.3 API 概览
- 2.3.1 目录遍历
- 2.3.2 过滤条件
- 3. glob:用于文件路径模式匹配的库
- 3.1 简介
- 3.1.1 核心功能
- 3.1.2 使用场景
- 3.2 安装与配置
- 3.2.1 安装指南
- 3.2.2 基本配置
- 3.3 API 概览
- 3.3.1 匹配文件路径
- 3.3.2 递归匹配
- 4. `tempfile`:用于临时文件和目录创建的库
- 4.1 简介
- 4.1.1 核心功能
- 4.1.2 使用场景
- 4.2 安装与配置
- 4.2.1 安装指南
- 4.2.2 基本配置
- 4.3 API 概览
- 4.3.1 创建临时文件
- 4.3.2 创建临时目录
- 5. std::fs:Rust标准库中的文件系统操作模块
- 5.1 简介
- 5.1.1 核心功能
- 5.1.2 使用场景
- 5.2 API 概览
- 5.2.1 文件创建与删除
- 5.2.2 文件读写操作
- 6. shellexpand:用于扩展环境变量和用户目录的路径的库
- 6.1 简介
- 6.1.1 核心功能
- 6.1.2 使用场景
- 6.2 API 概览
- 6.2.1 路径扩展
- 6.2.2 自定义变量扩展
- 总结
1. notify:用于文件系统事件通知的库
1.1 简介
1.1.1 核心功能
notify
是一个用于监听文件系统事件的 Rust 库,可以实时捕获文件系统的变化,如文件创建、修改、删除、重命名等。
1.1.2 使用场景
- 监听配置文件的变化并自动重新加载
- 实时监控文件夹,响应特定文件类型的更改
1.2 安装与配置
1.2.1 安装指南
在 Cargo.toml
中添加以下依赖:
[dependencies]
notify = "5.0.0"
1.2.2 基本配置
使用时需要引入 notify
库,在代码中使用 notify::Watcher
和 notify::RecursiveMode
进行文件监听设置。
1.3 API 概览
1.3.1 事件监听
use notify::{Watcher, RecursiveMode, watcher};
use std::time::Duration;
use std::path::Path;fn main() {let (tx, rx) = std::sync::mpsc::channel();let mut watcher = watcher(tx, Duration::from_secs(2)).unwrap();watcher.watch(Path::new("/path/to/directory"), RecursiveMode::Recursive).unwrap();loop {match rx.recv() {Ok(event) => println!("event: {:?}", event),Err(e) => println!("watch error: {:?}", e),}}
}
以上代码演示了如何使用 notify
库来监听特定目录下的文件系统事件,并打印出相关事件。
1.3.2 事件过滤
use notify::{Watcher, RecursiveMode, watcher, Event, DebouncedEvent};
use std::time::Duration;
use std::path::Path;fn main() {let (tx, rx) = std::sync::mpsc::channel();let mut watcher = watcher(tx, Duration::from_secs(2)).unwrap();watcher.watch(Path::new("/path/to/directory"), RecursiveMode::Recursive).unwrap();loop {match rx.recv() {Ok(event) => {match event {DebouncedEvent::Create(path) => println!("file created: {:?}", path),DebouncedEvent::Write(path) => println!("file modified: {:?}", path),DebouncedEvent::Remove(path) => println!("file removed: {:?}", path),_ => (),}},Err(e) => println!("watch error: {:?}", e),}}
}
以上代码演示了如何使用 notify
库来监听文件系统事件,并按照特定的事件类型进行过滤和处理。
官网链接:notify
2. walkdir:用于递归遍历目录的库
2.1 简介
walkdir 是一个 Rust 语言下用于递归遍历目录的库,它提供了简单易用的 API 和丰富的功能,帮助开发者快速高效地处理文件和目录操作。
2.1.1 核心功能
walkdir 库的核心功能包括递归遍历目录、过滤条件应用以及对每个遍历到的文件或目录执行自定义操作等。
2.1.2 使用场景
walkdir 在处理文件系统相关操作时非常实用,比如在构建文件索引、查找特定类型文件、清理目录或进行备份等场景中都能发挥作用。
2.2 安装与配置
要使用 walkdir 库,首先需要安装并配置好环境。
2.2.1 安装指南
可以在 Cargo.toml 文件中添加 walkdir 的依赖:
[dependencies]
walkdir = "2.3"
然后通过 Cargo 工具进行安装:
$ cargo build
2.2.2 基本配置
walkdir 库的基本配置相对简单,一般无需额外配置即可使用。
2.3 API 概览
walkdir 提供了丰富的 API 用于处理目录遍历和文件操作。
2.3.1 目录遍历
walkdir::WalkDir 结构体提供了递归遍历目录的方法,可以获取到每个遍历到的文件或目录的元数据,并进行相关操作。
use walkdir::WalkDir;fn main() {for entry in WalkDir::new("path/to/directory").into_iter().filter_map(|e| e.ok()) {println!("{}", entry.path().display());}
}
更多关于目录遍历的信息可参考 walkdir 目录遍历官方文档。
2.3.2 过滤条件
walkdir 支持对遍历结果进行过滤,以便只选择符合特定条件的文件或目录进行操作。
use walkdir::WalkDir;fn main() {for entry in WalkDir::new("path/to/directory").into_iter().filter_entry(|e| !is_hidden(e)) {println!("{}", entry.unwrap().path().display());}
}fn is_hidden(entry: &DirEntry) -> bool {entry.file_name().to_str().map(|s| s.starts_with(".")).unwrap_or(false)
}
更多关于过滤条件的信息可参考 walkdir 过滤条件官方文档。
3. glob:用于文件路径模式匹配的库
3.1 简介
glob
是一个用于文件路径模式匹配的库,可以帮助用户在文件系统中进行文件路径的匹配和查找。
3.1.1 核心功能
glob
库的核心功能是通过指定的模式匹配文件路径,支持通配符 *
和 ?
的使用,能够方便地实现文件路径的筛选和查找。
3.1.2 使用场景
glob
可以被广泛应用于文件系统操作、项目构建工具中的文件匹配、日志文件扫描等场景,能够简化文件路径匹配的复杂度,提高开发效率。
3.2 安装与配置
3.2.1 安装指南
你可以通过 Cargo.toml 中添加以下依赖来安装 glob
库:
[dependencies]
glob = "0.3"
然后执行 cargo build
即可完成安装。
3.2.2 基本配置
无需特殊配置,一般情况下只需要在代码中引入 glob
库即可开始使用。
3.3 API 概览
3.3.1 匹配文件路径
use glob::glob;fn main() {for entry in glob("*.txt").expect("Failed to read glob pattern") {match entry {Ok(path) => println!("{:?}", path.display()),Err(e) => eprintln!("{:?}", e),}}
}
上述示例代码中,通过调用 glob
函数并传入文件路径的模式,可以获取匹配该模式的所有文件路径。更多详细用法,可以参考 glob 官方文档。
3.3.2 递归匹配
use glob::glob_with;fn main() {for entry in glob_with("**/*.rs", glob::MatchOptions {case_sensitive: true,require_literal_separator: false,require_literal_leading_dot: true,}).expect("Failed to read glob pattern") {match entry {Ok(path) => println!("{:?}", path.display()),Err(e) => eprintln!("{:?}", e),}}
}
在上述示例中,通过调用 glob_with
函数并传入递归匹配的模式,可以获取匹配该模式的所有文件路径,包括子目录中的文件路径。更多详细用法,可以参考 glob 官方文档。
4. tempfile
:用于临时文件和目录创建的库
4.1 简介
4.1.1 核心功能
tempfile
是一个用于创建临时文件和目录的 Rust 库。它提供了简单易用的 API,用于在程序运行过程中创建临时文件和目录,并在不需要时将其清理。
4.1.2 使用场景
- 在测试环境中创建临时文件或目录。
- 临时存储数据以供稍后处理。
4.2 安装与配置
4.2.1 安装指南
你可以在 Cargo.toml
中添加以下依赖来安装 tempfile
:
[dependencies]
tempfile = "3.2.0"
更多安装信息,请参考 tempfile GitHub 页面。
4.2.2 基本配置
无需特殊配置,默认即可使用。
4.3 API 概览
4.3.1 创建临时文件
use std::io::prelude::*;
use tempfile::NamedTempFile;fn main() -> std::io::Result<()> {let mut file = NamedTempFile::new()?;writeln!(file, "Hello, world!")?;file.flush()?;Ok(())
}
更多关于创建临时文件的信息,请参考 tempfile::NamedTempFile 官方文档。
4.3.2 创建临时目录
use tempfile::tempdir;fn main() -> std::io::Result<()> {let dir = tempdir()?;// 执行操作Ok(())
}
更多关于创建临时目录的信息,请参考 tempfile::Builder 官方文档。
5. std::fs:Rust标准库中的文件系统操作模块
5.1 简介
std::fs
是 Rust 标准库中用于文件系统操作的模块,提供了对文件的创建、删除、读取、写入等操作。
5.1.1 核心功能
- 文件创建与删除
- 文件读写操作
5.1.2 使用场景
std::fs
可以在需要进行文件操作的 Rust 应用程序中使用。例如,处理配置文件、日志记录或者持久化数据等场景。
5.2 API 概览
下面将介绍 std::fs
模块的常见功能及其对应的方法。
5.2.1 文件创建与删除
在 std::fs
模块中,我们可以使用 File::create
方法来创建一个新文件,并使用 remove_file
方法删除文件。
use std::fs::File;
use std::io;fn main() -> io::Result<()> {// 创建文件let file = File::create("newfile.txt")?;// 删除文件std::fs::remove_file("newfile.txt")?;Ok(())
}
官网链接:std::fs::File
官网链接:std::fs::remove_file
5.2.2 文件读写操作
std::fs
模块提供了丰富的文件读写操作方法,例如 read
, read_to_string
, write
等。
use std::fs::File;
use std::io::{self, Read, Write};fn main() -> io::Result<()> {// 读取文件内容let mut file = File::open("example.txt")?;let mut contents = String::new();file.read_to_string(&mut contents)?;println!("File content: {}", contents);// 写入文件内容let mut output = File::create("output.txt")?;output.write_all(b"Hello, World!")?;Ok(())
}
官网链接:std::fs::File
官网链接:std::fs::read_to_string
官网链接:std::fs::write
通过 std::fs
模块提供的丰富功能,我们可以方便地进行文件的创建、删除、读写等操作,满足不同场景下的文件处理需求。
6. shellexpand:用于扩展环境变量和用户目录的路径的库
6.1 简介
shellexpand 是一个用于扩展环境变量和用户目录路径的 Rust 库。它允许用户在处理文件路径时轻松地扩展 ~
符号以表示用户的主目录,以及 $ENV_VAR
形式的环境变量。
6.1.1 核心功能
- 扩展
~
符号为用户主目录的绝对路径 - 扩展
$ENV_VAR
形式的环境变量为其对应的值
6.1.2 使用场景
shellexpand 适用于任何需要处理文件路径并希望支持用户自定义环境变量的 Rust 项目。例如,在读取配置文件或处理用户输入路径时,可以使用 shellexpand 来确保路径被正确解析。
6.2 API 概览
shellexpand 提供了简单而强大的 API,以下将介绍其主要功能和用法。
6.2.1 路径扩展
以下是一个演示如何使用 shellexpand 扩展文件路径的示例代码:
use shellexpand::tilde;fn main() {let path = "~/documents";let expanded_path = tilde(path).unwrap();println!("Expanded Path: {}", expanded_path);
}
在这个例子中,我们首先导入了 shellexpand 中的 tilde
函数,然后将 ~/documents
这样的路径传递给该函数。tilde
函数会返回一个 Result<PathBuf, ParseError>
,我们使用 unwrap
方法来获取最终的扩展路径,并打印出来。
你可以在 shellexpand 的官方文档 中找到更多关于路径扩展的详细信息。
6.2.2 自定义变量扩展
除了路径扩展,shellexpand 也支持自定义变量的扩展。下面是一个简单的示例:
use shellexpand::env as expand_env;fn main() {let input = "The value of HOME is $HOME";let expanded = expand_env(input).unwrap();println!("Expanded String: {}", expanded);
}
在这个例子中,我们使用了 shellexpand 中的 env
函数来扩展自定义变量。类似地,我们通过 unwrap
方法获取结果并打印出来。
更多关于自定义变量扩展的内容可以在 shellexpand 的官方文档 中找到。
通过上述示例,你可以看到 shellexpand 这个库提供了便捷易用的 API,能够帮助你轻松地处理文件路径并扩展环境变量。
总结
通过本文的介绍,我们可以清晰地了解到notify、walkdir、glob、tempfile、std::fs和shellexpand这几个文件系统操作库的核心功能、使用场景、安装与配置方法以及API概览。这些库涵盖了文件系统操作的各个方面,开发人员可以根据自身需求选择合适的库来简化文件系统操作,并提高代码的可维护性和可扩展性。
相关文章:
【Rust光年纪】简化文件操作流程:深度剖析多款文件系统操作库
文件系统操作利器:介绍常用的文件操作库 前言 在现代软件开发中,文件系统操作是一个十分常见的需求。为了更加高效地进行文件系统操作,开发人员经常会使用各种文件系统操作库来简化开发流程、提高代码可维护性。本文将介绍几个常用的文件系…...
FFmpeg实现文件夹多视频合并
使用FFmpeg合并文件夹中的多个视频文件,可以通过多种方式来实现,具体取决于你希望如何合并这些视频文件。下面介绍两种常见的方法: 按顺序拼接多个视频文件: 适用于希望将多个视频文件按顺序合并成一个视频文件的情况。 将多个视…...

[设备] 关于手机设备中几种传感器的研究
一、手机设备中三位坐标系概念 X轴的方向:沿着屏幕水平方向从左到右,如果手机如果不是是正方形的话,较短的边需要水平 放置,较长的边需要垂直放置。Y轴的方向:从屏幕的左下角开始沿着屏幕的的垂直方向指向屏幕的顶端Z轴…...
C#通过Modbus读取温度和湿度
使用 C# 通过 RS-485 接口读取温湿度数据并在电脑上显示,需要使用串口通信。假设你的温湿度传感器使用 Modbus RTU 协议,这里提供一个示例代码,使用 System.IO.Ports 命名空间进行串口通信,并使用 Modbus 协议库 NModbus 进行通信…...

海量数据处理商用短链接生成器平台 - 9
第二十六章 短链服务-冗余双写架构删除和更新消费者开发实战 第1集 冗余双写架构-更新短链消费者开发实战 简介: 短链服务-更新短链-消费者开发实战 具体步骤见代码 第2集 冗余双写架构-更新短链消费者链路测试 简介: 冗余双写架构-更新短链消费者链…...

从困境到突破,EasyMR 集群迁移助力大数据底座信创国产化
在大数据时代,企业对数据的依赖程度越来越高。然而,随着业务的不断发展和技术的快速迭代,大数据平台的集群迁移已成为企业数据中台发展途中无法回避的需求。在大数据平台发展初期,国内数据中台市场主要以国外开源 CDH、商业化 CDP…...
【Mysql】第十二章 视图特性(概念+使用)
文章目录 一、概念二、使用1.创建视图2.修改视图会影响基表3.修改基表会影响视图4.删除视图 一、概念 视图不能添加索引,也不能有关联的触发器或者默认值。由于视图和基表用的本质是同一份数据,因此对视图的修改会影响到基表,对基表的修改也…...

【颠覆数据处理的利器】全面解读Apache Flink实时大数据处理的引擎-上篇
什么是 Apache Flink? Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink 被设计为在所有常见的集群环境中运行,以内存速度和任何规模执行计算。 如何理解无界和有界数据? 无界数据&#…...

【C++】C++11(可变参数模板、lambda表达式、包装器)
文章目录 1. 可变参数模板1.1 介绍1.2 emplace系列接口实现 2. lambda表达式2.1 语法介绍2.2 原理 3. 包装器4. bind 1. 可变参数模板 1.1 介绍 可变参数我们在C语言阶段已经了解过了,C语言中叫做可变参数列表,其中使用 ... 代表可变参数。 C语言中的可…...

矩阵获客时代,云微客让你一个人成就一支队伍
短视频利用大家碎片化的时间让自身得到广泛的应用和发展,因此很多公司纷纷布局短视频赛道。但是一个账号的曝光量有限,并且能够出的爆款视频更是少之又少,这个时候就需要增加账号的数量,布局形成账号矩阵。 做账号矩阵,…...

浅谈基础的图算法——Tarjan求强联通分量算法(c++)
文章目录 强联通分量SCC概念例子有向图的DFS树代码例题讲解[POI2008] BLO-Blockade题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 思路AC代码 【模板】割点(割顶)题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示…...

【Godot4自学手册】第四十四节用着色器(shader)实现溶解效果
本小节,我将自学用用着色器(shader)实现溶解效果,最终效果如下: 一、进行shader初始设置 首先我们进入Player场景,选择AnimatedSprite2D节点,在检查器中找到CanvasItem属性,并在M…...

【画流程图工具】
画流程图工具 draw.io draw.io(现称为 diagrams.net)是一款在线图表绘制工具,可以用于创建各种类型的图表,如流程图、网络图、组织结构图、UML图、思维导图等。以下是关于它的一些优点、应用场景及使用方法: 优点&a…...

Revit二次开发选择过滤器,SelectionFilter
过滤器分为选择过滤器与规则过滤器 规则过滤器可以看我之前写的这一篇文章: Revit二次开发在项目中给链接模型附加过滤器 选择过滤器顾名思义就是可以将选择的构件ID集合传入并加入到视图过滤器中,有一些场景需要对某些构件进行过滤选择,但是没有共同的逻辑规则进行筛选的情况…...

【Linux】进程概念—环境变量
目录 一、冯诺依曼体系结构 二、操作系统(Operator System) 1 .概念 2 .设计OS的目的 3 . 定位 4 . 系统调用和库函数概念 三、进程 1 .基本概念 2 .描述进程-PCB(process control block)进程控制块 3 . 组织进程 4 . 查看进程 5 .通过系统调用获取进程…...
第十二章 Spring MVC 框架扩展和SSM框架整合(2023版本IDEA)
学习目标 12.1 Spring MVC 框架处理JSON数据12.1.1 JSON数据的传递处理12.1.2 JSON数据传递过程中的中文乱码和日期问题12.1.3 多视图解析器 12.2 Spring MVC 框架中的数据格式转换12.2.1 Spring MVC 框架数据转换流程12.2.2 编写自定义转换器12.2.3 使用InitBinder装配自定义编…...
js中的全局函数有这些
js中的全局函数有这些,记忆规则 6个编译 escape、unescape、decodeURI、decodeURIComponent、encodeURI、encodeURIComponent 2个数据处理 Number()、String() 4个数字处理 isFinite、isNaN、parseFloat、parseInt 1个特殊情况 eval()...
Android SurfaceFlinger——重绘闪烁处理(四十六)
在帧数据准备完成后,下一步是调用 devOptRepaintFlash() 函数处理显示输出设备的可选重绘闪烁问题,这里我们就来看一下重绘闪屏问题的处理方案。 1.更新输出设备的色彩配置文件2.更新与合成相关的状态3.计划合成帧图层4.写入合成状态5.设置颜色矩阵6.开始帧7.准备帧数据以进行…...
罗马数字转整数 C++
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#x…...
Day20_2--介绍同步加载和异步加载
同步加载和异步加载是处理程序或数据的两种不同方式,它们在处理任务的方式、效率和用户体验上有显著差异。下面是对这两种加载机制的详细介绍。 1. 同步加载(Synchronous Loading) 定义: 同步加载是一种加载数据或资源的方式&am…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...