Rust文件I/O


除了对控制台进行读写之外,Rust还允许对文件进行读写。

File结构代表一个文件,它允许程序对文件执行读写操作。File结构体中的所有方法都返回io::Result枚举的变量。

下表列出了File结构的常用方法:

序号模块方法签名描述
1std::fs::Fileopen()pub fn open<P: AsRef>(path: P) -> Result可以使用open static方法以只读模式打开文件。
2std::fs::Filecreate()pub fn create<P: AsRef>(path: P) -> Result静态方法以只写模式打开文件。如果文件已经存在,则旧内容将被销毁。否则,将创建一个新文件。
3std::fs::remove_fileremove_file()pub fn remove_file<P: AsRef>(path: P) -> Result<()>从文件系统中删除文件。不能保证立即删除该文件。
4std::fs::OpenOptionsappend()pub fn append(&mut self, append: bool) -> &mut OpenOptions设置文件追加模式的选项。
5std::io::Writeswrite_all()fn write_all(&mut self, buf: &[u8]) -> Result<()>尝试将整个缓冲区写入此写入。
6std::io::Readread_to_string()fn read_to_string(&mut self, buf: &mut String) -> Result读取所有字节,直到该源中的EOF为止,并将它们附加到buf。

写入文件


让我们看一个示例,以了解如何编写文件。

以下程序创建文件“ data.txt”,create()方法用于创建文件。如果文件创建成功,该方法将返回文件句柄。

最后一行 write_all 函数将在新创建的文件中写入字节,如果任何操作失败,则Expect()函数将返回错误消息。

use std::io::Write;
fn main() {
    let mut file = std::fs::File::create("data.txt").expect("create failed");
    file.write_all("Hello World".as_bytes()).expect("write failed");
    file.write_all("\nnewbiego".as_bytes()).expect("write failed");
    println!("data written to file" );
}
data written to file

从文件读取


以下程序读取data.txt文件中的内容,并将其打印到控制台。 “open”函数用于打开现有文件,文件的绝对或相对路径作为参数传递给open()函数,如果文件不存在或由于某种原因无法访问,则open()函数将引发异常,如果成功,则将针对该文件的文件句柄分配给“ file”变量。

“file”句柄的“ read_to_string”函数用于将该文件的内容读入字符串变量。

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();
    print!("{}", contents);
}
Hello World
newbiego

删除文件


以下示例使用remove_file()函数删除文件。如果发生错误,expect()函数将返回自定义消息。

use std::fs;
fn main() {
    fs::remove_file("data.txt").expect("could not remove file");
    println!("file is removed");
}
file is removed

将数据附加到文件


append()函数将数据写入文件的末尾。如下例所示:

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("Hello World".as_bytes()).expect("write failed");
    file.write_all("\nnewbiego".as_bytes()).expect("write failed");
    println!("file append success");
}
file append success

复制文件


以下示例将文件中的内容复制到新文件。

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.exe data.txt datacopy.txt 。执行文件时传递了两个命令行参数:

  • 源文件的路径

  • 目标文件