Rust对文件的操作

2023-11-19

一、文件IO操作

在类unix系统中,一切都是文件,所以说广义的文件操作,其实包括很多:Socket、管道、内存映射等等。其实文件操作无论怎么变化,主流仍然是对外设的访问。计算机本身的组成,是一系列的硬件整合在一起的,单纯的只有CPU和内存是搞不动事情的。所以,一谈到文件操作,一定要清晰的看穿是哪类文件操作。
文件操作,其实就是对IO操作的一种的抽象。这种抽象隔离开了不同设备的不同之处,由具体的设备驱动来解决这种抽象的不同。所以,读写文件的API,有read,write,也有send和recv,其实就是演进的一个过程。这篇文章只是分析对存储文件,也就是说常见的数据存储文件的操作的分析,是一种狭义的文件操作的文章。

二、Rust对文件的操作

一般来说,计算机语言对文件的操作都有比较好的更上层的抽象接口。但是C/C++有点例外,他们基本上是使用了原始的API,搞得操作文件各种异常的问题都需要自己处理。如果有人写过用C处理读取一个大文件就明白这句话的意思。而Java、go等语言处理起文件的操作来,就相对要省心许多。c++标准库过了这么多年,包括c++11迭代到c++17才有一部分对文件操作的API。但是作为后起的Rust,这方面的顾虑就要少很多,对文件的操作的支持要相对好很多。
在文件操作中,一般来说,可以按字符串来操作也可以按流来操作。既可以一次性读写,也可以按指定条件读写。文件的操作一般是四个过程:
1、创建
//路径创建
create_dir<P: AsRef >(path: P) -> Result<()> :创建一个空目录,指定路径不存在则返回错误。
create_dir_all<P: AsRef >(path: P) -> Result<()> : 创建级联目录。
//文件创建
create<P: AsRef >(path: P) -> Result
std::fs::remove_file<P: AsRef >(path: P) -> Result<()>

2、打开
open<P: AsRef >(path: P) -> Result:只读打开文件
3、读或者写
read(&mut self, buf: &mut [u8]) -> Result
read_to_string(&mut self, buf: &mut String) -> Result
seek(&mut self, pos: SeekFrom) -> Result
take(self, limit: u64) -> Take
fn write(&mut self, buf: &[u8]) -> Result :将缓冲区数据写入文件,有可能失败。
fn flush(&mut self) -> Result<()>
fn write_all(&mut self, buf: &[u8]) -> Result<()> : 连续调用 write,将 缓冲区数据写入文件。

4、关闭:Rust会自动处理
也就是说,在c/c++中相关的文件操作和其它语言中的相关的动作,都可以在Rust中找到相关的接口。

下面先看一个创建文件例子:

use std::fs;

fn main() -> std::io::Result<()> {
    // 创建空目录
    fs::create_dir("./mydir")?;

    // 创建级联目录
    fs::create_dir_all("./mydir/test")?;

    // 创建路径
    let path = Path::new("./mypath/a.txt");

    // 返回路径
    let parent = path.parent().unwrap();

    // 得到文件名,无扩展名
    let fname = path.file_stem().unwrap();

    Ok(())
}

再看一个读文件的:

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

fn main() -> io::Result<()> {
    let mut f = File::open("a.txt")?;
    let mut buf = [0; 12];
    // 读取文件12 byte
    let n = f.read(&mut buf[..])?;

    // read 12
    let n = f.read(&mut buf[..])?;


    let mut f = File::open("a.txt")?;
    let mut buf = String::new();

    f.read_to_string(&mut buf)?;

    Ok(())
}

再看一个写文件的:

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

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

    buf.write(b"example---")?;

    buf.write_all(b"all txt write test!")?;

    buf.flush()?;

    Ok(())
}

如果想实现类似C/C++中API的读写方式可以使用fs::OpenOptions:

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

fn main() -> std::io::Result<()> {
   
    let mut f = OpenOptions::new()
            .append(true).open("e:\\mytxt.txt")?;

    f.write(b" append data")?;

    Ok(())
}

Rust中还有一些操作文件的小细节,这里就不再一一赘述。

三、总结

其实,很多的细节可以决定一个语言的成败。例如c++这种语言如果现在才推出来(指的是最初版本的),估计基本上没人用。但很多事情都是时也运也。在那个时代,没有这么大把的语言出现,也没有这么多上层的应用出现,更多的还是一种接近于研究向普及转化的过程的时代。c++承上启下,其实有很大的现实意义的。
作为Rust,看到了c++的情况,应该认真的吸取经验教训,站好自己的位置,管好自己的一亩三分地的同时,该出手时还是要出手的。
努力吧,归来的少年!
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust对文件的操作 的相关文章

随机推荐

  • 如何判断代码的好坏

    对于代码好坏的判断 是需要一定的标准来衡量 比如可读性 可维护性 可拓展性 简洁性等等 好的代码 无论是对于代码开发者来说 还是对于设备维护者来说都是赏心悦目的 而坏的代码则是让人一头雾水 心生胆怯 甚至在开发和维护阶段 因为修改或者重构代
  • MATLAB指纹识别系统[GUI,预警]

    一 课题介绍 随着生物识别技术的不断发展 人们发现每个人的指纹具有唯一性和不变性 因此指纹识别技术逐步发展为一种新的身份识别方式 并且凭借其良好的安全可靠性 大有取代传统身份识别方式的趋势 本文简要介绍了指纹识别的基本步骤 分别是指纹图像预
  • scala扁平化

    扁平化 将嵌套列表中的所有元素单独放到一个新列表中 嵌套列表 列表中元素均为列表的列表称之为嵌套列表 object 扁平化 def main args Array String Unit 嵌套列表 val list1 List List 1
  • 字节跳动(今日头条)小程序支付、支付宝、微信支付完整版

    字节跳动 今日头条 小程序支付 开通支付 官方参数组装 小程序代码 服务端 支付宝支付 微信H5支付 支付宝回调 微信H5支付回调 开通支付 开通支付就不做说明了 请直接查看官方文档 https microapp bytedance com
  • Maven pom.xml报错Multiple annotations found at this line: - Missing artifact log4j:log4j:jar:1.2.15:co

    Maven pom xml 报错 Multiple annotationsfound at this line Missing artifactlog4j log4j jar 1 2 15 compile Missing artifacto
  • jsp+Echarts实现图表可视化,连接数据库,从数据库拿数据

    实现可视化的图表 jsp mysql eclipse 从数据库拿数据改变表格的数据算是echarts的初始入门案例的升级版 想了解Echarts的各位大大 传送门 https echarts apache org examples zh e
  • Netty 4.0 实现心跳检测和断线重连

    一 实现心跳检测 原理 当服务端每隔一段时间就会向客户端发送心跳包 客户端收到心跳包后同样也会回一个心跳包给服务端 一般情况下 客户端与服务端在指定时间内没有任何读写请求 就会认为连接是idle 空闲的 的 此时 客户端需要向服务端发送心跳
  • python安装robotframework报错_荐Win10+python3.8+robot framework安装及遇见的问题

    前提 自己已经下载装好了Python3 x 下面是我逐步尝试搜索后出现的各类爆粗信息和截图 现在已经最后正确的方法汇总到文章前面 方便自取 Windows10系统 操作均在cmd命令行窗口内进行 1 装pip python m pip in
  • 【转】protoc-go-inject-tag 作用

    时间 2022 03 01 本文章向大家介绍 转 protoc go inject tag 作用 主要包括 转 protoc go inject tag 作用使用实例 应用技巧 基本知识点总结和需要注意事项 具有一定的参考价值 需要的朋友可
  • window10在vscode中配置conda出错解决办法

    Windows 10 VSCode激活conda虚拟环境失败解决方案 CommandNotFoundError Your shell has not been 码农家园
  • VS 2022使用报错(一)

    1 NET框架不兼容 发生背景 博主最近打开同事的源代码发现许多引用都无效了 中间我尝试删除了这些引用 在重新添加引用的时候都找不到这些了 最后发现是解决方案里面没有配置 NET框架 问题解决 配置 NET框架 右键项目属性 在目标框架里面
  • python搭建ip池(多线程)

    之前有讲过怎么搭建ip池 但由于单线程的效率太低 于是我们升级改造一下 将单线程变成多线程来搭建ip池 之前的方法可以参考一下 python搭建ip池 如果会简单的request和提取文字就可以直接不看 本文将会重点放在多线程的部分 过程分
  • 微软个人云端服务器在哪里找,云端的服务器在哪里

    云端的服务器在哪里 内容精选 换一换 智能边缘平台 Intelligent EdgeFabric 通过纳管用户的边缘节点 提供将云上应用延伸到边缘的能力 联动边缘和云端的数据 同时 在云端提供统一的边缘节点 应用监控 日志采集等运维能力 为
  • python基础:面向对象一些简单案例:计算圆的面积和周长,烤羊肉串

    1 计算圆的面积和周长 from math import pi class Circle def init self r self r r def zhouchang self return 2 pi self r def area sel
  • shell编程计算1-1000中所有3或5的倍数之和

    bin bash sum 0 int 1 while int lt 1000 do if int 3 0 int 5 0 then sum sum int fi let int done echo sum bin bash sum 0 fo
  • Spring Security 自定义用户认证

    一 PasswordEncoder 在 Configuration注解的类下注入bean import org springframework security crypto bcrypt BCryptPasswordEncoder imp
  • C++ 数据类型

    使用编程语言进行编程时 需要用到各种变量来存储各种信息 变量保留的是它所存储的值的内存位置 这意味着 当创建一个变量时 就会在内存中保留一些空间 可能需要存储各种数据类型 比如字符型 宽字符型 整型 浮点型 双浮点型 布尔型等 的信息 操作
  • AI绘图实战(六):制作一张庆祝五一劳动节的海报

    S AI能取代设计师么 I 至少在设计行业 目前AI扮演的主要角色还是超级工具 要顶替 除非甲方对设计效果无所畏惧 预先学习 安装及其问题解决参考 Windows安装Stable Diffusion WebUI及问题解决记录 运行使用时问题
  • JUMPSERVER+ZABBIX二次开发

    未完待续 1 apps assets models assets py 添加字段 zabbix group id models IntegerField null True blank True verbose name Zabbix Gr
  • Rust对文件的操作

    一 文件IO操作 在类unix系统中 一切都是文件 所以说广义的文件操作 其实包括很多 Socket 管道 内存映射等等 其实文件操作无论怎么变化 主流仍然是对外设的访问 计算机本身的组成 是一系列的硬件整合在一起的 单纯的只有CPU和内存