iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Rust 中的文件操作示例详解
  • 176
分享到

Rust 中的文件操作示例详解

2024-04-02 19:04:59 176人浏览 薄情痞子
摘要

目录文件路径文件创建和删除目录创建和删除文件创建和删除文件读取和写入文件打开文件读取文件写入相关资料文件路径 想要打开或者创建一个文件,首先要指定文件的路径。 Rust 中的路径操作

文件路径

想要打开或者创建一个文件,首先要指定文件的路径。

Rust 中的路径操作是跨平台的,std::path 模块提供的了两个用于描述路径的类型:

  1. PathBuf – 具有所有权并且可被修改,类似于 String
  2. Path – 路径切片,类似于 str

示例


use std::path::Path;
use std::path::PathBuf;
fn main() {
    // 直接将一个字符串切片包装成一个路径切片
    let path = Path::new("./foo/bar.txt");

    // 返回上级路径,若无上级路径则返回 `None`
    let parent = path.parent().unwrap();

    // 返回文件名(不包含文件扩展名)
    let file_stem = path.file_stem().unwrap();

    println!(
        "path: {:?}, parent: {:?}, file_stem: {:?}",
        path, parent, file_stem
    );

    // 创建一个空的 `PathBuf`
    let mut empty_path = PathBuf::new();
    println!("empty_path: {:?}", empty_path);

    // 根据字符串切片创建 `PathBuf`
    let path = PathBuf::from(r"C:\windows\system32.dll");

    // 添加路径
    empty_path.push(r"C:\");

    println!("empty_path: {:?}, path: {:?}", empty_path, path);
}

文件创建和删除

Rust 的 std::fs 模块提供了一系列文件系统操作的功能。

目录创建和删除

创建目录的函数:

  • create_dir<P: AsRef<Path>>(path: P) -> Result<()> – 创建一个空目录,若指定路径不存在则会返回错误
  • create_dir_all<P: AsRef<Path>>(path: P) -> Result<()> – 级联创建目录。

示例


use std::fs;
// 由于字符串切片实现了 `AsRef<Path>` Trait,因此函数中的参数可以直接使用字符串字面量
fn main() -> std::io::Result<()> {
    // 创建一个空目录
    fs::create_dir("./empty")?;

    // 创建一个目录,若其上级目录不存在,则一同创建
    fs::create_dir_all("./some/dir")?;

    Ok(())
}

删除目录的函数:

  • remove_dir<P: AsRef<Path>>(path: P) -> Result<()> – 删除指定空目录。
  • remove_dir_all<P: AsRef<Path>>(path: P) -> Result<()> – 删除指定目录及其目录下的内容。

示例


use std::fs;

fn main() -> std::io::Result<()> {
    // 删除一个空目录
    fs::remove_dir("./empty")?;

    // 删除指定目录及其目录下的内容,但不会删除其上级目录
    fs::remove_dir_all("./some/dir")?;

    Ok(())
}

文件创建和删除

Rust 使用 std::fs::File 结构体与文件系统中的文件相关联,通过 std::fs::File 实例可以对文件进行读取和写入。

文件创建和删除的函数:

  • create<P: AsRef<Path>>(path: P) -> Result<File>
  • std::fs::remove_file<P: AsRef<Path>>(path: P) -> Result<()>

示例


use std::fs;
use std::fs::File;

fn main() -> std::io::Result<()> {
    // 以只写模式打开指定文件,若文件存在则清空文件内容,若文件不存在则新建一个
    let mut f = File::create("foo.txt")?;

    // 删除文件
    fs::remove_file("foo.txt")?;

    Ok(())
}

文件读取和写入

std::fs::File 本身实现了 ReadWrite Trait,所以文件的读写非常简单。

文件打开

在读写文件之前,首先应该得到一个 File 类型实例。除了可以在创建文件时获取 File 实例,还可以使用 Fileopen 函数:

  • open<P: AsRef<Path>>(path: P) -> Result<File>

示例


use std::fs::File;

fn main() -> std::io::Result<()> {
    // 以只读模式打开指定文件,若文件不存在则返回错误
    let _file = File::open("foo.txt")?;

    Ok(())
}

使用 createopen 函数获取的 File 实例是只读或者只写的,如果想要控制更多的读写选项,则需要使用 std::fs::OpenOptions。它是一个 Builder,createopen 函数的底层也是这个 Builder。

使用 std::fs::OpenOptions 时,首先调用 OpenOptions::new,然后通过链式调用来设置读写选项,最后调用 OpenOptions::open 打开指定的文件。

示例


use std::fs::OpenOptions;

fn main() -> std::io::Result<()> {
    let _file = OpenOptions::new()
        .read(true)
        .write(true)
        .create(true) // 新建,若文件存在则打开这个文件
        .open("foo.txt")?;

    let _file = OpenOptions::new()
        .append(true) // 追加内容
        .open("foo.txt")?;

    let _file = OpenOptions::new()
        .write(true)
        .truncate(true) // 清空文件
        .open("foo.txt");

    Ok(())
}

文件读取

读取文件主要用的是 std::io::Read Trait 中的函数。比如:

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

示例


use std::fs::File;
use std::io;
// `prelude` 模块包含通常使用的 IO Trait: `BufRead`, `Read`, `Write`, `Seek`
use std::io::prelude::*;

fn main() -> io::Result<()> {
    let mut f = File::open("foo.txt")?;
    let mut buffer = [0; 10];
    // 读取文件中的前10个字节
    let n = f.read(&mut buffer[..])?;
    println!("The bytes: {:?}", &buffer[..n]);

    // 接着读取10个字节
    let n = f.read(&mut buffer[..])?;
    println!("The bytes: {:?}", &buffer[..n]);

    let mut f = File::open("foo.txt")?;
    let mut buffer = String::new();
    // 读取文件所有内容并转为字符字符串,若文件非 UTF-8 格式,则会报错
    f.read_to_string(&mut buffer)?;
    println!("The string: {}", buffer);

    Ok(())
}

另外,File 类型还实现了 std::io::Seek Trait,Seek 主要提供了一个 seek 函数,可以控制文件读取和写入的起始位置。

  • seek(&mut self, pos: SeekFrom) -> Result<u64>

示例


use std::fs::File;
use std::io;
use std::io::prelude::*;
use std::io::SeekFrom;

fn main() -> io::Result<()> {
    let mut f = File::open("foo.txt")?;

    // 将游标前移 10 个字节(游标的默认位置是 0)
    f.seek(SeekFrom::Start(10))?;

    // 将前 10 个字节之后的内容读取到 Buf 中
    let mut buffer = String::new();
    f.read_to_string(&mut buffer)?;
    println!("The string: {}", buffer);

    Ok(())
}

除了可以设置文件读取的起点,还可以限制文件读取的长度。std::io::Read 提供了 take 函数来限制文件读取的长度。

  • take(self, limit: u64) -> Take<Self>

示例


use std::fs::File;
use std::io;
use std::io::prelude::\*;

fn main() -> io::Result<()> {
let f = File::open("foo.txt")?;
let mut buffer = [0; 10];

    // 限制读取长度最多为 5 字节
    let mut handle = f.take(5);

    handle.read(&mut buffer)?;
    println!("buffer: {:?}", buffer);

    Ok(())

}

文件写入

读取文件主要用的是 std::io::Write Trait 中的函数。比如:

  • fn write(&mut self, buf: &[u8]) -> Result<usize> – 尝试将 Buf 中的全部内容写入文件,有可能不成功。
  • fn flush(&mut self) -> Result<()>
  • fn write_all(&mut self, buf: &[u8]) -> Result<()> – 持续调用 write,将 Buf 中的所有内容都写入文件。

示例


use std::fs::File;
use std::io::prelude::*;

fn main() -> std::io::Result<()> {
    let mut buffer = File::create("foo.txt")?;

    buffer.write(b"some bytes")?;

    buffer.write_all(b"more bytes")?;

    buffer.flush()?;

    Ok(())
}

相关资料

The Rust Standard Library

Rust By Example

RustPrimer

到此这篇关于Rust 中的文件操作的文章就介绍到这了,更多相关Rust 文件操作内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Rust 中的文件操作示例详解

本文链接: https://www.lsjlt.com/news/157024.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Rust 中的文件操作示例详解
    目录文件路径文件创建和删除目录创建和删除文件创建和删除文件读取和写入文件打开文件读取文件写入相关资料文件路径 想要打开或者创建一个文件,首先要指定文件的路径。 Rust 中的路径操作...
    99+
    2024-04-02
  • Python常见文件操作的示例详解
    目录从文件中读取数据为什么要提供文件路径逐行读取创建一个包含文件各行内容的列表使用文件中的内容包含千位以上的大型文件圆周率中包含你的生日吗写入文件附加到文件从文件中读取数据 1:读取...
    99+
    2024-04-02
  • Python文件的操作示例的详细讲解
    目录1. 文件的读写原理:2. 常用的文件打开模式3. 文件对象的常用方法4. 目录的相关操作1. 文件的读写原理: 文件的读写称为I/O操作。 操作原理: .py文件是用解释器...
    99+
    2024-04-02
  • Rust中的derive属性示例详解
    目录1. Rust中的derive是什么?2. derive的出现解决了什么问题?3. derive如何使用?4. 有哪些常用的derive属性?1. Rust中的derive是什么...
    99+
    2023-05-16
    Rust中derive属性 Rust derive属性
  • Python操作word文档的示例详解
    目录写在前面创建一个文档先实现第一步,写入一个标题添加文字段落列表的添加图片的添加表格添加相关样式设置页眉和页脚写在前面 python-docx 不支持 doc 文档,一定要注意该点...
    99+
    2024-04-02
  • Java文件操作实例详解
    本文实例为大家分享了Java文件操作的具体代码,供大家参考,具体内容如下 简介 本程序主要采用了FileInputStream和FileOutputStream两类对文件进行操作。具...
    99+
    2024-04-02
  • PHP文件的操作示例
    小编给大家分享一下PHP文件的操作示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!fopen() 函数用于在 PHP 中打开文件。 打开文件 fopen() 函...
    99+
    2023-06-15
  • GO文件创建及读写操作示例详解
    目录三种文件操作比较ioutilioutil.ReadFile读ioutil.WriteFile 写ioutil.ReadAll 读ioutil.ReadDir 查看路径下目录信息i...
    99+
    2024-04-02
  • C++文件的操作及小实验示例代码详解
    目录写文件:读文件:实验介绍代码部分:查看文件操作:对于文件,它是一个流对象,对文件的操作无非是读和写,我先来介绍一下写文件: 写文件: 写文件有五步: 1.包含头文件 #inclu...
    99+
    2024-04-02
  • Matlab操作HDF5文件示例
    目录HDF5文件使用Matlab操作HDF5文件使用Matlab创建HDF5文件使用Matlab写入HDF5使用Matlab查看HDF5文件信息使用Matlab读取HDF5中的数据集...
    99+
    2024-04-02
  • Python操作HDF5文件示例
    目录引言创建文件和数据集写数据集读数据集引言 在Matlab操作HDF5文件中已经详细介绍了HDF5文件已经利用Matlab对其进行操作的方法。这篇文章总结一下如何在Python下使...
    99+
    2024-04-02
  • Java操作Excel的示例详解
    目录使用场景excel 03 和 07的区别POIeasyExcel解析excel表中的对象POI使用步骤POI 写数据POI 读数据计算公式easyExcel读写数据写数据读数据j...
    99+
    2023-01-10
    Java操作Excel方法 Java操作Excel Java Excel
  • Scala文件操作示例代码讲解
    目录1. 读取数据1.1 按行读取1.2 按字符读取Scala使用source.buffered方法按字符读取文件一个示例1.3 读取词法单元和数字1.4 从URL或者其他源读取数据...
    99+
    2023-05-14
    Scala文件操作 Scala写入文件
  • C语言实现对文件进行操作的示例详解
    目录前言文件指针文件的打开和关闭文件的打开方式文件读写函数二进制方式存储文件对文件进行拷贝文件随机读写函数文件缓冲区前言 文件操作 在运行程序的时候,此时数据是存放在内存中,当程序退...
    99+
    2023-05-15
    C语言实现文件操作 C语言文件操作 C语言文件
  • Node文件操作汇总实例详解
    目录前言文件系统目录处理读写文件文件描述监控文件异步文件删除文件总结前言 前两天我们介绍了 Nodejs 中 I/O 的重要组成部分:Buffer对象 和 Stream流,今天我们介...
    99+
    2022-11-13
    Node文件操作汇总 Node 文件操作
  • Rust模式匹配示例详解
    目录函数斐波那契数列函数小结函数 今天学习的内容是 Rust 中的函数。 函数,和 if 条件控制,while、loop、for 循环控制,在底层都是使用跳转实现的,所以函数也属于流...
    99+
    2022-11-13
    Rust 模式匹配 Rust 模式
  • java文件读写操作实例详解
    目录File类File类的构造方法创建功能判断获取删除IO流字节流写数据小问题总结File类 它是文件和目录路径名的抽象表示。 文件和目录是可以通过File封装成对象的。 对于Fil...
    99+
    2024-04-02
  • C语言中炫酷的文件操作实例详解
    目录什么是文件程序文件数据文件 (本文重点)文件名文件的打开和关闭文件指针文件函数相对路径与绝对路径输入输出流二进制读写fwirtefread总结什么是文件 磁盘上的文件是文件 但是...
    99+
    2024-04-02
  • python之PyPDF2:操作PDF文档示例详解
    PyPDF2是一个用于处理PDF文档的Python库。它提供了一系列的功能,使我们能够读取、修改和创建PDF文件。本文将详细介绍PyPDF2库的使用示例,包括读取文档信息、提取文本内容、合并和拆分文档以及添加水印等操作。 首先,我们需要安装...
    99+
    2023-09-02
    python 数据库 开发语言 pip
  • C语言中的文件操作详解
    目录1.为什么使用文件2.什么是文件2.1程序文件2.2数据文件2.3文件名3.文件的打开和关闭3.1文件指针3.2文件的打开和关闭4.文件的顺序读写5.文件的随机读写5.1fsee...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作