Rust 文件输入/输出
除了在控制台上读写外,Rust还允许读写文件。
File结构表示一个文件。它允许程序在文件上执行读写操作。File结构中的所有方法都返回io::Result枚举的变体。
File结构的常用方法列在下表中−
序号 | 模块 | 方法 | 签名 | 描述 |
---|---|---|---|---|
1 | std::fs::File | open() | pub fn open |
open静态方法可用于以只读模式打开文件。 |
2 | std::fs::File | create() | pub fn create |
静态方法以只写模式打开文件。如果文件已经存在,则删除原有内容。否则,创建新文件。 |
3 | std::fs::remove_file | remove_file() | pub fn remove_file |
从文件系统中删除文件。不能保证立即删除文件。 |
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("\nTutorialsPoint".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
TutorialsPoint
删除文件
以下示例使用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("\nTutorialsPoint".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
。在执行文件时,传递了两个命令行参数:
- 源文件路径
- 目标文件