rust文件读写的实现示例

 更新时间:2023年12月07日 11:29:22   作者:int8  
Rust语言提供了强大的文件读写库,使得开发者可以更加方便地进行文件操作,并且其安全性可以有效避免文件操作中可能出现的风险,本文就来详细的介绍了rust文件读写的实现示例,感兴趣的可以了解一下

std::fs模块提供了结构体File,它表示一个文件。

一、打开文件

结构体File提供了open()函数
open()以只读模式打开文件,如果文件不存在,则会抛出一个错误。如果文件不可读,那么也会抛出一个错误。

范例

fn main() {
     let file = std::fs::File::open("data.txt").unwrap();
     println!("文件打开成功:{:?}", file);
}

std::fs::File的open函数没有配套的close函数,因为Rust编译器可以在文件不再被使用时自动关闭文件。

二、创建文件

结构体File提供了create() 函数
以只写模式打开文件。如果文件存在则清空旧内容;如果文件不存在则新建

范例

fn main() {
     let file = std::fs::File::create("data.txt").expect("create failed");
     println!("文件创建成功:{:?}",file);
}

三、读取文件

(一)结构体File实现了Read特性
Read特性提供了如下方法

fn read(&mut self, buf: &mut [u8]) -> Result<usize>

读取一些字节到指定的缓冲区中,返回读取的字节数。读取的字节数等于缓冲区的长度

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>

读取所有字节,直到此源中的 EOF 为止,然后将它们追加到 buf

fn read_to_string(&mut self, buf: &mut String) -> Result<usize>

读取所有字节,直到 EOF 为止,然后将它们追加到 buf。如果读取成功则返回读取的字节数,如果读取失败则抛出错误。

实例

use std::io::prelude::*;
use std::fs;
fn main() {
    let mut buffer = [0u8; 5];
    let mut file = fs::File::open("text.txt").unwrap();
    file.read(&mut buffer).unwrap();
    println!("{:?}", buffer);
    file.read(&mut buffer).unwrap();
    println!("{:?}", buffer);
}
运行结果:
[84, 104, 105, 115, 32]
[105, 115, 32, 97, 32]

范例

data.txt内容如下

简单教程
简单编程

代码如下

use std::io::Read;
fn main(){
     let mut file = std::fs::File::open("data.txt").unwrap();
     let mut contents = String::new();
     file.read_to_string(&mut contents).unwrap();
     println!("{}", contents);
}

运行结果如下

简单教程
简单编程

(二)快捷函数

std::fs::read_to_string

pub fn read_to_string<P: AsRef<Path>>(path: P) -> Result<String>

将文件的全部内容读取为字符串。这是使用File::open和File::read_to_string 的便捷函数

实例

use std::fs;
fn main() {
    let text = fs::read_to_string("text.txt").unwrap();
    println!("{}", text);
}
运行结果:
This is a text file.

std::fs::read

pub fn read<P: AsRef<Path>>(path: P) -> Result<Vec<u8>>

将文件的全部内容读取为字节 vector。这是使用 File::open 和 read_to_end 的便捷函数

实例

use std::fs;
fn main() {
    let content = fs::read("D:\\text.txt").unwrap();
    println!("{:?}", content);
}
运行结果:
[84, 104, 105, 115, 32, 105, 115, 32, 97, 32, 116, 101, 120, 116, 32, 102, 105, 108, 101, 46]

以上两种方式是一次性读取,十分适合Web应用的开发。但是更多情况下文件的大小可能远超内存容量。所以不常使用。

四、写入文件

(一)结构体File实现了Write特性
Write特性提供了如下方法

fn write(&mut self, buf: &[u8]) -> Result<usize>

写入一个缓冲区,返回写入的字节数。这个函数会尝试写入 buf 的全部内容,但是整个写入可能不会成功,或者写入也会产生错误。

fn write_all(&mut self, buf: &[u8]) -> Result<()>

将整个缓冲区写入File。此方法将连续调用 write,直到没有更多数据要写入或返回非 ErrorKind::Interrupted 类型的错误为止。 在成功写入整个缓冲区或发生此类错误之前,此方法将不会返回

实例

use std::io::prelude::*;
use std::fs::File;
fn main() {
    let mut file = File::create("text.txt").unwrap();
    file.write(b"FROM RUST PROGRAM").unwrap();
}

范例

use std::io::Write;
fn main() {
     let mut file = std::fs::File::create("data.txt").expect("create failed");
     file.write_all("简单教程".as_bytes()).expect("write failed");
     file.write_all("\n简单编程".as_bytes()).expect("write failed");
     println!("data written to file" );
}
编译运行,则data.txt的内容如下
简单教程
简单编程

(二)快捷函数
std::fs::write

pub fn write<P: AsRef<Path>, C: AsRef<[u8]>>(path: P, contents: C) -> Result<()>

把一个切片写入文件,如果文件不存在就会创建文件,如果文件存在就替换其内容。
这是使用 File::create 和 write_all 的便捷函数

实例

use std::fs;
fn main() {
    fs::write("text.txt", "FROM RUST PROGRAM").unwrap();
}

执行程序之后,text.txt文件的内容将会被重写为FROM RUST PROGRAM。

五、追加内容到文件末尾

Write特性并没有提供函数用于追加内容
但std::fs::OpenOptions结构体,可以配置文件打开方式。
OpenOptions提供了append()用于设置追加模式

pub fn append(&mut self, append: bool) -> &mut Self

当文件的模式设置为 追加 之后,写入文件的内容就不会代替原先的旧内容而是放在旧内容的后面。

范例

data.txt内容如下
简单教程
简单编程

代码如下
use std::fs::OpenOptions;
use std::io::Write;
fn main() {
     let mut file = OpenOptions::new().append(true).open("data.txt").expect("cannot open file");
     file.write_all("www.twle.cn".as_bytes()).expect("write failed");
     file.write_all("\n简单教程".as_bytes()).expect("write failed");
     file.write_all("\n简单编程".as_bytes()).expect("write failed");
     println!("数据追加成功");
}
运行结果如下
数据追加成功

打开  data.txt  文件,可以看到内容如下
简单教程
简单编程www.twle.cn
简单教程
简单编程

OpenOptions除append权限以外还有read权限和write权限,如果我们想以读写权限打开一个文件可以这样写

实例

text.txt内容如下
this is text

代码如下
use std::io::prelude::*;
use std::fs::OpenOptions;
fn main() -> std::io::Result<()> {
    let mut file = OpenOptions::new().read(true).write(true).open("text.txt")?;
    file.write(b"COVER")?;
    Ok(())
}
运行之后,text.txt文件内容将变成:
COVERis text

六、删除文件

std::fs 提供了函数 remove_file() 用于删除文件。

pub fn remove_file<P: AsRef>(path: P) -> Result<()>

注意,删除可能会失败,即使返回结果为OK,也有可能不会立即就删除。

范例

use std::fs;
fn main() {
     fs::remove_file("data.txt").expect("could not remove file");
     println!("file is removed");
}
编译运行结果如下
file is removed

打开当前目录,我们可以发现文件已经被删除了。

七、复制文件

Rust标准库没有提供任何函数用于复制一个文件为另一个新文件。
但我们可以使用上面提到的函数和方法来实现文件的复制功能。
下面的代码,我们模仿简单版本的 copy 命令

copy old_file_name new_file_name

代码如下

use std::io::Read;
use std::io::Write;
fn main() {
     let mut command_line: std::env::Args = std::env::args();
     command_line.next().unwrap();     // 跳过程序名
     // 原文件
     let source = command_line.next().unwrap();
     // 新文件
     let destination = command_line.next().unwrap();
     let mut file_in = std::fs::File::open(source).unwrap();
     let mut file_out = std::fs::File::create(destination).unwrap();
     let mut buffer = [0u8; 4096];
     loop {
         let nbytes = file_in.read(&mut buffer).unwrap();
         file_out.write(&buffer[..nbytes]).unwrap();
         if nbytes < buffer.len() { break; }
     }
}
$ ./main data.txt data_new.txt

data.txt 为我们想要复制的原文件路径
data_new.txt 为我们想要的新文件路径

到此这篇关于rust文件读写的实现示例的文章就介绍到这了,更多相关rust文件读写内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Rust 使用 dotenv 来设置环境变量的问题

    关于Rust 使用 dotenv 来设置环境变量的问题

    在项目中,我们通常需要设置一些环境变量,用来保存一些凭证或其它数据,这时我们可以使用dotenv这个crate,接下来通过本文给大家介绍Rust 使用dotenv来设置环境变量的问题,感兴趣的朋友一起看看吧
    2022-01-01
  • Rust use关键字妙用及模块内容拆分方法

    Rust use关键字妙用及模块内容拆分方法

    这篇文章主要介绍了Rust use关键字妙用|模块内容拆分,文中还给大家介绍use关键字的习惯用法,快速引用自定义模块内容或标准库,以此优化代码书写,需要的朋友可以参考下
    2022-09-09
  • rust交叉编译问题及报错解析

    rust交叉编译问题及报错解析

    这篇文章主要为大家介绍了rust交叉编译问题及报错解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Rust中的Option枚举快速入门教程

    Rust中的Option枚举快速入门教程

    Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事项,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • Rust动态数组Vec基本概念及用法

    Rust动态数组Vec基本概念及用法

    Rust中的Vec是一种动态数组,它可以在运行时自动调整大小,本文主要介绍了Rust动态数组Vec基本概念及用法,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Rust中的Drop特性之解读自动化资源清理的魔法

    Rust中的Drop特性之解读自动化资源清理的魔法

    Rust通过Drop特性实现了自动清理机制,确保资源在对象超出作用域时自动释放,避免了手动管理资源时可能出现的内存泄漏或双重释放问题,智能指针如Box、Rc和RefCell都依赖于Drop来管理资源,提供了灵活且安全的资源管理方案
    2025-02-02
  • 为什么要选Rust?学习Rust从零开始配置和实现第一个简单项目

    为什么要选Rust?学习Rust从零开始配置和实现第一个简单项目

    本文介绍了Rust语言的核心价值、应用场景、开发环境搭建、第一个Rust项目的创建与扩展、调试、发布流程,以及新手常见陷阱与避坑方法,通过学习Rust,开发者可以实现高效且安全的系统级开发、网络编程和工具开发
    2026-01-01
  • Rust中字符串类型String的46种常用方法分享

    Rust中字符串类型String的46种常用方法分享

    Rust主要有两种类型的字符串:&str和String,本文主要为大家介绍的是String类型的字符串以及它常用的46种方法,感兴趣的小伙伴可以了解一下
    2023-06-06
  • Rust中的Iterator和IntoIterator介绍及应用小结

    Rust中的Iterator和IntoIterator介绍及应用小结

    Iterator即迭代器,它可以用于对数据结构进行迭代,被迭代的数据结构是可迭代的(iterable),所谓的可迭代就是这个数据结构有返回迭代器的方法,这篇文章主要介绍了Rust中的Iterator和IntoIterator介绍及应用,需要的朋友可以参考下
    2023-07-07
  • Rust中的Enum与Struct示例详解

    Rust中的Enum与Struct示例详解

    在 Rust 中,struct(结构体)和enum(枚举)是两种核心的自定义类型,分别用于组合相关数据和表示互斥的可能性,这篇文章主要介绍了Rust中的Enum与Struct示例,需要的朋友可以参考下
    2025-10-10

最新评论