Rust 文件 I/O 操作高级应用指南

Rust 社区 RFC 导读 | 构建安全的 I/O 动机 最近Rust官方合并了一个RFC,通过引入I/O安全的概念和一套新的类型和特征,为AsRawFd和相关特质的用户提供关于其原始资源句柄的保证,从而弥补Rust中封装边界的漏洞。 Rust 标准库提供了 I/O 安全性,保证程序持有私有的原始句柄(raw handle),其他部分无法访问它。但是 FromRawFd::from_raw_fd 是 Unsafe 的,所以在 Safe Rust中无法做到 File::from_raw(7) 这种事。 在这个文件描述符上面进行 I/O 操作,而这个文件描述 阅读详情

Rust 文件 I/O 操作高级应用指南

1. 文件 I/O 基础

Rust 的文件 I/O 操作主要通过 std::fs 模块实现,支持同步和异步操作。

use std::fs::File;
use std::io::{Read, Write};

fn main() {
    // 写入文件
    let mut file = File::create("output.txt").expect("Failed to create file");
    file.write_all(b"Hello, World!").expect("Failed to write to file");
    
    // 读取文件
    let mut file = File::open("output.txt").expect("Failed to open file");
    let mut content = String::new();
    file.read_to_string(&mut content).expect("Failed to read from file");
    println!("File content: {}", content);
}

2. 高级文件 I/O 技巧

2.1 目录操作

use std::fs;
use std::path::Path;

fn main() {
    // 创建目录
    fs::create_dir("test_dir").expect("Failed to create directory");
    
    // 创建嵌套目录
    fs::create_dir_all("test_dir/nested").expect("Failed to create nested directory");
    
    // 读取目录内容
    let entries = fs::read_dir("test_dir").expect("Failed to read directory");
    for entry in entries {
        let entry = entry.expect("Failed to get entry");
        println!("{:?}", entry.path());
    }
    
    // 删除目录
    fs::remove_dir_all("test_dir").expect("Failed to remove directory");
}

2.2 文件元数据

use std::fs::File;
use std::os::unix::fs::MetadataExt;

fn main() {
    let file = File::open("output.txt").expect("Failed to open file");
    let metadata = file.metadata().expect("Failed to get metadata");
    
    println!("File size: {} bytes", metadata.len());
    println!("Is file: {}", metadata.is_file());
    println!("Is directory: {}", metadata.is_dir());
    println!("Permissions: {:?}", metadata.permissions());
    
    // Unix-specific metadata
    #[cfg(unix)]
    {
        println!("UID: {}", metadata.uid());
        println!("GID: {}", metadata.gid());
    }
}

2.3 临时文件

use std::fs::File;
use std::io::Write;
use tempfile::tempfile;

fn main() {
    // 创建临时文件
    let mut file = tempfile().expect("Failed to create temp file");
    
    // 写入数据
    file.write_all(b"Temporary data").expect("Failed to write to temp file");
    
    // 临时文件会在离开作用域时自动删除
}

2.4 异步文件 I/O

use tokio::fs::File;
use tokio::io::{AsyncReadExt, AsyncWriteExt};

#[tokio::main]
async fn main() {
    // 异步写入文件
    let mut file = File::create("async_output.txt").await.expect("Failed to create file");
    file.write_all(b"Hello, Async World!").await.expect("Failed to write to file");
    
    // 异步读取文件
    let mut file = File::open("async_output.txt").await.expect("Failed to open file");
    let mut content = String::new();
    file.read_to_string(&mut content).await.expect("Failed to read from file");
    println!("File content: {}", content);
}

3. 实际应用场景

3.1 配置文件处理

use serde::{Deserialize, Serialize};
use std::fs::File;
use std::io::{Read, Write};

#[derive(Debug, Serialize, Deserialize)]
struct Config {
    host: String,
    port: u16,
    debug: bool,
}

fn main() {
    // 读取配置文件
    let mut file = File::open("config.toml").expect("Failed to open config file");
    let mut content = String::new();
    file.read_to_string(&mut content).expect("Failed to read config file");
    
    // 解析配置
    let config: Config = toml::from_str(&content).expect("Failed to parse config");
    println!("Config: {:?}", config);
    
    // 修改配置
    let mut config = config;
    config.debug = true;
    
    // 写入配置文件
    let mut file = File::create("config.toml").expect("Failed to create config file");
    let content = toml::to_string(&config).expect("Failed to serialize config");
    file.write_all(content.as_bytes()).expect("Failed to write config file");
}

3.2 日志文件

use std::fs::OpenOptions;
use std::io::Write;
use std::time::SystemTime;

fn log(message: &str) {
    let mut file = OpenOptions::new()
        .create(true)
        .append(true)
        .open("app.log")
        .expect("Failed to open log file");
    
    let timestamp = SystemTime::now()
        .duration_since(SystemTime::UNIX_EPOCH)
        .expect("Failed to get timestamp")
        .as_secs();
    
    writeln!(file, "[{}] {}", timestamp, message).expect("Failed to write to log file");
}

fn main() {
    log("Application started");
    log("Processing data");
    log("Application exited");
}

3.3 文件复制

use std::fs::{File, copy};
use std::io::{Read, Write};

// 方法 1: 使用 copy 函数
fn copy_file_1(src: &str, dst: &str) {
    copy(src, dst).expect("Failed to copy file");
}

// 方法 2: 手动复制
fn copy_file_2(src: &str, dst: &str) {
    let mut src_file = File::open(src).expect("Failed to open source file");
    let mut dst_file = File::create(dst).expect("Failed to create destination file");
    
    let mut buffer = [0; 1024];
    loop {
        let n = src_file.read(&mut buffer).expect("Failed to read from source");
        if n == 0 {
            break;
        }
        dst_file.write_all(&buffer[0..n]).expect("Failed to write to destination");
    }
}

fn main() {
    copy_file_1("input.txt", "output1.txt");
    copy_file_2("input.txt", "output2.txt");
}

3.4 文件监控

use notify::{RecommendedWatcher, RecursiveMode, Watcher};
use std::sync::mpsc::channel;
use std::time::Duration;

fn main() {
    // 创建通道
    let (tx, rx) = channel();
    
    // 创建监控器
    let mut watcher: RecommendedWatcher = RecommendedWatcher::new(tx, Duration::from_secs(1))
        .expect("Failed to create watcher");
    
    // 监控目录
    watcher.watch(".", RecursiveMode::Recursive)
        .expect("Failed to start watching");
    
    // 处理事件
    loop {
        match rx.recv() {
            Ok(event) => println!("Event: {:?}", event),
            Err(e) => println!("Error: {:?}", e),
        }
    }
}

4. 最佳实践

  1. 错误处理:使用 Result 类型和 ? 操作符处理文件 I/O 错误。
  2. 资源管理:使用 File 类型的析构函数自动关闭文件,或使用 drop 显式释放资源。
  3. 缓冲区:对于大文件操作,使用缓冲区提高性能。
  4. 异步 I/O:对于 I/O 密集型应用,使用异步 I/O 提高并发性能。
  5. 权限管理:注意文件权限,避免安全问题。
  6. 路径处理:使用 std::path::Path 处理路径,提高代码的跨平台兼容性。
  7. 临时文件:使用 tempfile 库创建临时文件,自动管理生命周期。

5. 总结

Rust 的文件 I/O 操作提供了丰富的功能,从基本的文件读写到高级的目录操作、元数据获取、临时文件和异步 I/O。通过掌握这些高级应用,我们可以编写更加高效、可靠的文件操作代码。

在实际应用中,文件 I/O 操作可以用于配置文件处理、日志记录、文件复制、文件监控等多种场景,大大提高应用程序的功能性和可靠性。

希望本文对你理解和应用 Rust 文件 I/O 操作有所帮助!

手机如何高效辅助林业调查 手机如何高效辅助林业调查 很多林业工作者将栅格类型的地形图处理后导入平板电脑,在林地使用平板电脑加载小班矢量图,辅助林业调查。但是,如果没有地形图底图,这种方法可能就有难度,而且最重要的是,大部分林地工作者没有能力配置平板电脑。大凡林业基层工作者在林地调查时,除调查记录本等部分纸质材料外,都必然携带手机和水杯,此外其他设备已经成为累赘,尤其是炎热的夏季在杂灌丛生的林地进行调查作业。因此,使用手机... 阅读详情

相关推荐

SAP CO实战:如何用KKA2/CJ88结果分析码搞定项目收入成本匹配(附真实案例)

本文深入探讨了SAP CO模块中KKA2和CJ88结果分析码在项目收入成本匹配中的高阶应用。通过真实案例解析,详细介绍了这两种分析码在分阶段收入确认和终验法项目中的配置技巧与实战经验,帮助财务人员高效解决复杂业务场景下的财务数据处理难题。

weixin_29230773的博客 171

Rust 文件 I/O 高级应用指南

Rust 的文件 I/O 系统提供了丰富的功能,从基本的文件读写到高级的文件元数据操作。通过掌握文件 I/O 的高级应用,我们可以编写更加高效、可靠的文件处理代码。在实际应用中,我们可以根据具体需求选择合适的文件操作方法,从简单的到复杂的异步文件操作。希望本文对你理解和应用 Rust 文件 I/O 有所帮助!

no1coder的博客 2397

告别Mac自带终端:iTerm2 + Oh My Zsh 保姆级配置指南(含国内镜像源)

本文提供了一份详细的Mac终端优化指南,涵盖iTerm2、Oh My Zsh和Homebrew的配置流程,特别针对国内用户提供镜像源解决方案。通过安装现代化工具链和优化配置,帮助开发者打造高效、美观的终端工作环境,提升日常开发效率。

weixin_42638178的博客 401

CrossWatch MCP 端点实战:让 Claude、Codex 快速只读接入你的媒体库

CrossWatch 是一个自托管的媒体同步服务,能在 Plex、Trakt、SIMKL 等媒体服务器与追踪器之间同步片单、评分、观看历史和播放进度。而它的 MCP(Model Context Protocol)端点,可以让 Claude、Codex、Cursor 等 AI 客户端**只读接入**你的 CrossWatch:AI 能查看健康状态、最近的同步结果、日志和事件,帮你快速定位"为什么这部

gitblog_01113的博客 783

帆软报表JS导出避坑指南:如何正确处理sessionid和参数传递

本文深入探讨了帆软报表中通过JavaScript实现一键导出的关键技术,重点解析了如何正确获取并传递sessionid以确保会话不丢失,以及如何构造包含必要参数的导出URL。文章详细对比了预览后导出与直接URL导出两种方式的差异,并提供了从参数拼接、前端触发下载到高级场景(如SPA集成)的完整避坑指南,帮助开发者构建稳定可靠的自定义导出功能。

weixin_42522857的博客 163

CoppeliaSim(原V-REP)新手上路

CoppeliaSim(原V-REP)是一个机器人仿真平台,里面有很多来自别的公司的机器人模型以及完备的物理引擎,我们可以通过python,c++,matlab等语言控制里面的机器人。,您也可以在官网中Downloads里找您需要的版本,一般只需要下载EDU版本就可以了,我下载的是v4.1.0 windows EDU版本。在版本V4之前,CoppeliaSim叫V-REP,在官网可以下载到之前的V-REP版本。

qq_37051669的博客 4万+

Rust 文件 I/O 操作高级应用:从入门到精通

Rust的文件I/O操作是一个非常强大的特性,它可以帮助我们处理各种文件相关的任务。通过掌握异步文件I/O、文件元数据、目录操作等高级技巧,我们可以更好地利用Rust文件I/O的能力,提高代码的性能和可靠性。作为一名从Python转向Rust的开发者,我发现Rust的文件I/O操作与Python的文件操作有一些相似之处,但Rust的文件I/O更加类型安全、性能更高。这让我更加相信,Rust是构建高性能、可靠的后端服务的理想选择。希望这篇文章能对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言。

jiang_style的博客 4227

python爬取巨潮资讯网所有股票年报数据

爬虫获取巨潮资讯网数据

qq_42752524的博客 6126

高级嵌入式开发:std-training低层I/O编程完全指南

想要掌握嵌入式Rust开发的核心技能吗?通过std-training项目的完整指南,你将学会如何在ESP32-C3上进行低层I/O编程!嵌入式Rust开发是物联网和嵌入式系统领域的重要技能,而低层I/O编程则是与硬件直接交互的关键技术。本指南将带你深入了解std-training项目中提供的实战训练,从GPIO控制到I2C通信,再到中断处理,全面掌握嵌入式系统开发的核心概念。 ## 🔧 什么是

gitblog_00376的博客 429

提交 ieee 手稿出现:Do not include the Reviewer PDF with my submission 怎么办

IEEE投稿Reviewer PDF选项说明 投稿时出现的"Do not include the Reviewer PDF with my submission"选项控制是否附带评审专用PDF文件。Reviewer PDF是系统自动生成包含所有投稿材料的完整PDF,用于同行评审。建议保持默认不勾选状态,除非确认编辑部不需要该文件,否则可能影响审稿流程。勾选表示不附带此PDF,不勾选则会正常生成并提交该评审文件。

ZhangJiqun&191cm&85kg 2224

基于毫米波雷达的智能风扇算法设计与实现

摘要:本文设计了一种基于毫米波雷达的智能风扇控制系统,采用FMCW雷达实现人体目标的精准检测与定位。系统通过距离FFT、速度FFT、CFAR检测和AoA估计构建完整的信号处理链路,并针对风扇叶片干扰设计了基于自相关函数的抗干扰算法。创新性地提出了人在开机、多人优先送风、摇头追踪等控制策略。研究采用MATLAB完成全链路算法仿真验证,并在STM32平台上实现实物系统。实验表明,该系统可实现0.15m测距精度和±60°方位角覆盖,有效解决了传统风扇的能源浪费和用户体验问题。本文提供了完整的MATLAB仿真代码和

huanghm88的专栏 405

Mio终极指南:如何用Rust构建高性能I/O应用

Mio是一个专为Rust设计的高性能金属I/O库,专注于非阻塞API和事件通知,为构建高性能I/O应用提供最低的操作系统抽象开销。作为Tokio异步运行时的底层核心,Mio在现代网络编程中扮演着至关重要的角色。🚀 ## 为什么选择Mio? ### 零运行时分配 Mio的核心优势在于其零运行时分配的设计理念。通过精心优化的内存管理策略,Mio能够在运行时避免不必要的内存分配,从而显著提升性能表

gitblog_00064的博客 639

CloudCompare 多窗口联动显示点云

CloudCompare支持多窗口联动显示多个点云数据,可以用来比对原始点云数据与语义分割后的结果。 一、创建多个视窗 打开CloudCompare后会默认有一个视图,我们要同时打开两个数据就需要再创建一个视图,选择菜单栏里的3D Views,在下拉菜单中点击new,这样就创建了一个新的视图,这时3D Views的下拉菜单中有3D View 1和3D View 2两个视图,然后点击3D Views下拉菜单中的Title,这时在数据展示区就会出现两个并列的窗口。 二、分别加载点云数据 将数据分别拖进两个

zhaoguanhua的博客 2740

革命性终端文件管理器yazi:Rust异步I/O带来的极速体验

yazi是一款用Rust编写的极速终端文件管理器,基于异步I/O技术构建,旨在为用户提供高效、友好且可高度定制的文件管理体验。无论是日常文件操作还是复杂的批量处理,yazi都能以闪电般的速度完成任务,重新定义终端文件管理的效率标准。 [![yazi终端文件管理器logo](https://raw.gitcode.com/GitHub_Trending/ya/yazi/raw/24c60419bb

gitblog_00790的博客 1014

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Rust 异步编程详解(async/await)

Rust异步编程通过async/await语法和Future trait实现高效I/O处理,核心机制包括状态机模型和运行时调度。文章详细解析了异步编程基础、核心组件(Future trait、async/await语法)、工作流程,并提供了HTTP请求等代码示例。同时探讨了错误处理、任务取消、Pin/Unpin等高级话题,比较了不同运行时的适用场景。最佳实践建议选择合适运行时、避免阻塞操作,并指出异步编程在性能和安全方面的优势,以及调试复杂度等限制。附带的并发网络请求示例展示了tokio运行时的实际应用,包

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 2224

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Command-Line Rust高级技巧:错误处理、文件I/O和正则表达式最佳实践

想要掌握Rust命令行开发的核心技能吗?Command-Line Rust项目为你提供了完美的学习路径!这个开源项目基于《Command-Line Rust》书籍,通过12个完整的命令行工具实现,帮助你深入理解Rust的错误处理机制、文件I/O操作和正则表达式应用。无论你是Rust新手还是想要提升命令行开发技能的开发者,这个项目都能提供实用的学习资源。 [![Rust命令行开发示例](https

gitblog_00317的博客 452

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Rust文件I/O操作深度解析

作为一名从后端开发转向Rust的开发者,我发现Rust的文件I/O操作与Python的文件操作有很多相似之处,但也有一些不同。Rust的文件I/O操作更加注重安全性和性能,同时保持了Rust的类型安全特性。今天我想分享一下我对Rust文件I/O操作的理解和实践。

no1coder的博客 4319

Rust 零拷贝技术:从所有权到 I/O 优化的深度实践

零拷贝在 Rust 中不是一个孤立的“技巧”,而是其设计哲学的必然产物。Rust 的所有权和生命周期系统,将零拷贝从一个高风险、难以维护的优化,转变为一个由编译器保证安全的日常工具。专业的 Rust 开发者在设计 API 时,会优先考虑接受切片(&str&[u8])或泛型(),而不是拥有所有权的类型。在处理高性能 I/O 时,会主动使用bytesmemmap2和零拷贝serde等模式。这种从“拥有数据”转向“借用数据”的思维模式,是 Rust 在性能和安全之间取得平衡的核心。

m0_73760343的博客 676

React Native 高性能列表组件详解:FlatList、SectionList 与 VirtualizedList

> 本文基于仓库中 [blog/2017-03-13-better-list-views.md](https://link.gitcode.com/i/97a23faf2e71350cb508137e08c0cb82) 这篇官方工程博客展开,结合当前仓库 `Libraries/Lists/` 下的真实源码与测试,系统梳理 React Native 新一代列表组件(`FlatList`、`Secti

gitblog_00904的博客 1083

Rust 文件操作详解及OpenOptions模块

本文详细介绍了Rust语言中的文件操作功能,主要涵盖两大核心内容: 文件操作详解: 基础操作:文件读取(一次性/逐行)、写入(覆盖/流式)、追加等 进阶功能:错误处理、元数据获取、目录操作和路径处理 高级应用:内存映射文件实现高性能访问 OpenOptions模块: 提供精细控制文件打开行为的能力 支持多种打开模式、创建策略和权限控制 特别强调原子性操作和跨平台注意事项 文章通过大量代码示例展示了Rust强大且安全的文件处理能力,从基础到高级循序渐进,适合不同水平的Rust开发者参考。

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 1729

Rust 异步编程高级应用指南

Rust 的异步编程系统是一种强大的工具,特别适合 I/O 密集型任务。通过掌握其高级特性,我们可以编写更加高效、可维护的异步代码。在实际应用中,我们可以使用异步编程构建高性能的网络应用、数据库操作和文件处理系统,充分发挥 Rust 的并发能力。希望本文对你理解和应用 Rust 异步编程有所帮助!

no1coder的博客 4345
上一篇: Rust 错误处理高级应用指南
下一篇: Rust 泛型编程高级应用指南
第一程序员
博客等级 码龄1年 1万+粉丝 1822原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值