【Rust每周一库】tempfile – 基础实用的临时文件库

  • 2019 年 12 月 30 日
  • 筆記

Rust作为一个效率极高且内存相对安全的系统级语言,不但会吸引大量的C/C++开发者;同时因为相对现代的语言设计、完善的包管理,也引起了不少高级语言、比如Java, C#, JavaScript, Python开发者的兴趣。所以小编觉得介绍一些非常基础实用的库有益于让已经正在使用Rust的开发者能更高效的使用Rust、避免重新造轮子;而对于听过Rust、正在犹豫是不是应该试一试的开发者,搬运一些基础库的信息也能减少他们使用Rust的阻力。

本期每周一库介绍一个非常基础实用的库——tempfile。相信每一个写过完整的程序的工程师,从相对底层的重新造轮子、到桌面应用、游戏、手机app、乃至后端服务器业务逻辑,大概率都会遇到需要在硬盘上建立临时文件和文件夹的情况。

Tempfile

此库的特性极其简单粗暴,但是非常实用。两个功能:

  • 使用tempfile()来创建临时文件
  • 使用tempder()来创建临时文件夹

设计理念:

这个库提供了几种不同的方式来创建临时文件和文件夹。tempfile()依赖于操作系统、在文件句柄被关闭后删除临时文件。TempDirNamedTempFile则依赖于Rust的析构函数来进行清理工作。

在进行选择的时候,大多数情况推荐使用tempfile,除非程序中需要指定临时文件的路径或者需要在程序退出后仍保存文件。

资源溢出:

使用tempfile几乎永远不会出现文件/文件夹未被清理的问题,但在使用TempDirNamedTempFile的时候则需要注意,如果析构函数没有运行,临时文件会出现未被清理的情况。

例子:

创建临时文件并写入数据:

use tempfile::tempfile;  use std::io::{self, Write};    // 在 `std::env::temp_dir()` 里创建一个临时文件.  let mut file = tempfile()?;    writeln!(file, "Brian was here. Briefly.")?;  

Create a named temporary file and open an independent file handle:

创建一个自定义命名的临时文件,并且开启一个独立的文件句柄:

use tempfile::NamedTempFile;  use std::io::{self, Write, Read};    let text = "Brian was here. Briefly.";    // 在 `std::env::temp_dir()` 里创建一个自定义命名的临时文件并开启第一个文件句柄.  let mut file1 = NamedTempFile::new()?;    // 打开第二个文件句柄.  let mut file2 = file1.reopen()?;    // 向第一个句柄中写入数据.  file1.write_all(text.as_bytes())?;    // 从第二个句柄中读取测试数据.  let mut buf = String::new();  file2.read_to_string(&mut buf)?;  assert_eq!(buf, text);  

创建临时文件夹并且在其中添加一个文件:

use tempfile::tempdir;  use std::fs::File;  use std::io::{self, Write};    // 在 `std::env::temp_dir()` 中创建一个临时文件夹.  let dir = tempdir()?;    let file_path = dir.path().join("my-temporary-note.txt");  let mut file = File::create(file_path)?;  writeln!(file, "Brian was here. Briefly.")?;    // 通过特意关闭 `TempDir`,我们可以确认临时文件夹是否被成功删除  // 在不特意指定关闭时,文件夹会在 `dir` 会在离开作用域后被删除,  // 但是无法在程序中确认删除是否成功  drop(file);  dir.close()?;  

这次的库非常基础,但是实用性却很强,希望能帮到遇到要处理临时文件但又没有时间去重新造轮子的童鞋。

Happy Coding, Rustacean!!