【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!!