Rust - 文件输入/输出

  • 简述

    除了读写控制台之外,Rust 还允许读写文件。
    File 结构代表一个文件。它允许程序对文件执行读写操作。File 结构中的所有方法都返回 io::Result 枚举的变体。
    File 结构的常用方法列在下表中 -
    序号 模块 方法 签名 描述
    1 std::fs::File open() pub fn open<P: AsRef>(path: P) -> Result open 静态方法可用于以只读模式打开文件。
    2 std::fs::File create() pub fn create<P: AsRef>(path: P) -> Result 静态方法以只写模式打开文件。如果文件已经存在,则旧内容将被销毁。否则,将创建一个新文件。
    3 std::fs::remove_file remove_file() pub fn remove_file<P: AsRef>(path: P) -> Result<()> 从文件系统中删除文件。无法保证立即删除该文件。
    4 std::fs::OpenOptions append() pub fn append(&mut self, append: bool) -> &mut OpenOptions 设置文件追加模式的选项。
    5 std::io::Writes write_all() fn write_all(&mut self, buf: &[u8]) -> Result<()> 尝试将整个缓冲区写入此写入。
    6 std::io::Read read_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("\nCAINIAOYA".as_bytes()).expect("write failed");
       println!("data written to file" );
    }
    

    输出

    
    data written to file
    
  • 从文件中读取

    以下程序读取文件 data.txt 中的内容并将其打印到控制台。“打开”功能用于打开现有文件。文件的绝对或相对路径作为参数传递给 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
    CAINIAOYA
    
  • 删除文件

    以下示例使用 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("\nCAINIAOYA".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();
       // skip the executable file name
       // accept the source file
       let source = command_line.next().unwrap();
       // accept the destination file
       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 执行。执行文件时传递两个命令行参数 -
    • 源文件的路径
    • 目标文件