rust文件讀寫的實現(xiàn)示例
std::fs模塊提供了結構體File,它表示一個文件。
一、打開文件
結構體File提供了open()函數
open()以只讀模式打開文件,如果文件不存在,則會拋出一個錯誤。如果文件不可讀,那么也會拋出一個錯誤。
范例
fn main() { let file = std::fs::File::open("data.txt").unwrap(); println!("文件打開成功:{:?}", file); }
std::fs::File的open函數沒有配套的close函數,因為Rust編譯器可以在文件不再被使用時自動關閉文件。
二、創(chuàng)建文件
結構體File提供了create() 函數
以只寫模式打開文件。如果文件存在則清空舊內容;如果文件不存在則新建
范例
fn main() { let file = std::fs::File::create("data.txt").expect("create failed"); println!("文件創(chuàng)建成功:{:?}",file); }
三、讀取文件
(一)結構體File實現(xiàn)了Read特性
Read特性提供了如下方法
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
讀取一些字節(jié)到指定的緩沖區(qū)中,返回讀取的字節(jié)數。讀取的字節(jié)數等于緩沖區(qū)的長度
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
讀取所有字節(jié),直到此源中的 EOF 為止,然后將它們追加到 buf
fn read_to_string(&mut self, buf: &mut String) -> Result<usize>
讀取所有字節(jié),直到 EOF 為止,然后將它們追加到 buf。如果讀取成功則返回讀取的字節(jié)數,如果讀取失敗則拋出錯誤。
實例
use std::io::prelude::*; use std::fs; fn main() { let mut buffer = [0u8; 5]; let mut file = fs::File::open("text.txt").unwrap(); file.read(&mut buffer).unwrap(); println!("{:?}", buffer); file.read(&mut buffer).unwrap(); println!("{:?}", buffer); } 運行結果: [84, 104, 105, 115, 32] [105, 115, 32, 97, 32]
范例
data.txt內容如下
簡單教程
簡單編程
代碼如下
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(); println!("{}", contents); }
運行結果如下
簡單教程
簡單編程
(二)快捷函數
std::fs::read_to_string
pub fn read_to_string<P: AsRef<Path>>(path: P) -> Result<String>
將文件的全部內容讀取為字符串。這是使用File::open和File::read_to_string 的便捷函數
實例
use std::fs; fn main() { let text = fs::read_to_string("text.txt").unwrap(); println!("{}", text); } 運行結果: This is a text file.
std::fs::read
pub fn read<P: AsRef<Path>>(path: P) -> Result<Vec<u8>>
將文件的全部內容讀取為字節(jié) vector。這是使用 File::open 和 read_to_end 的便捷函數
實例
use std::fs; fn main() { let content = fs::read("D:\\text.txt").unwrap(); println!("{:?}", content); } 運行結果: [84, 104, 105, 115, 32, 105, 115, 32, 97, 32, 116, 101, 120, 116, 32, 102, 105, 108, 101, 46]
以上兩種方式是一次性讀取,十分適合Web應用的開發(fā)。但是更多情況下文件的大小可能遠超內存容量。所以不常使用。
四、寫入文件
(一)結構體File實現(xiàn)了Write特性
Write特性提供了如下方法
fn write(&mut self, buf: &[u8]) -> Result<usize>
寫入一個緩沖區(qū),返回寫入的字節(jié)數。這個函數會嘗試寫入 buf 的全部內容,但是整個寫入可能不會成功,或者寫入也會產生錯誤。
fn write_all(&mut self, buf: &[u8]) -> Result<()>
將整個緩沖區(qū)寫入File。此方法將連續(xù)調用 write,直到沒有更多數據要寫入或返回非 ErrorKind::Interrupted 類型的錯誤為止。 在成功寫入整個緩沖區(qū)或發(fā)生此類錯誤之前,此方法將不會返回
實例
use std::io::prelude::*; use std::fs::File; fn main() { let mut file = File::create("text.txt").unwrap(); file.write(b"FROM RUST PROGRAM").unwrap(); }
范例
use std::io::Write; fn main() { let mut file = std::fs::File::create("data.txt").expect("create failed"); file.write_all("簡單教程".as_bytes()).expect("write failed"); file.write_all("\n簡單編程".as_bytes()).expect("write failed"); println!("data written to file" ); } 編譯運行,則data.txt的內容如下 簡單教程 簡單編程
(二)快捷函數
std::fs::write
pub fn write<P: AsRef<Path>, C: AsRef<[u8]>>(path: P, contents: C) -> Result<()>
把一個切片寫入文件,如果文件不存在就會創(chuàng)建文件,如果文件存在就替換其內容。
這是使用 File::create 和 write_all 的便捷函數
實例
use std::fs; fn main() { fs::write("text.txt", "FROM RUST PROGRAM").unwrap(); }
執(zhí)行程序之后,text.txt文件的內容將會被重寫為FROM RUST PROGRAM。
五、追加內容到文件末尾
Write特性并沒有提供函數用于追加內容
但std::fs::OpenOptions結構體,可以配置文件打開方式。
OpenOptions提供了append()用于設置追加模式
pub fn append(&mut self, append: bool) -> &mut Self
當文件的模式設置為 追加 之后,寫入文件的內容就不會代替原先的舊內容而是放在舊內容的后面。
范例
data.txt內容如下 簡單教程 簡單編程 代碼如下 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("www.twle.cn".as_bytes()).expect("write failed"); file.write_all("\n簡單教程".as_bytes()).expect("write failed"); file.write_all("\n簡單編程".as_bytes()).expect("write failed"); println!("數據追加成功"); } 運行結果如下 數據追加成功 打開 data.txt 文件,可以看到內容如下 簡單教程 簡單編程www.twle.cn 簡單教程 簡單編程
OpenOptions除append權限以外還有read權限和write權限,如果我們想以讀寫權限打開一個文件可以這樣寫
實例
text.txt內容如下 this is text 代碼如下 use std::io::prelude::*; use std::fs::OpenOptions; fn main() -> std::io::Result<()> { let mut file = OpenOptions::new().read(true).write(true).open("text.txt")?; file.write(b"COVER")?; Ok(()) } 運行之后,text.txt文件內容將變成: COVERis text
六、刪除文件
std::fs 提供了函數 remove_file() 用于刪除文件。
pub fn remove_file<P: AsRef>(path: P) -> Result<()>
注意,刪除可能會失敗,即使返回結果為OK,也有可能不會立即就刪除。
范例
use std::fs; fn main() { fs::remove_file("data.txt").expect("could not remove file"); println!("file is removed"); } 編譯運行結果如下 file is removed
打開當前目錄,我們可以發(fā)現(xiàn)文件已經被刪除了。
七、復制文件
Rust標準庫沒有提供任何函數用于復制一個文件為另一個新文件。
但我們可以使用上面提到的函數和方法來實現(xiàn)文件的復制功能。
下面的代碼,我們模仿簡單版本的 copy 命令
copy old_file_name new_file_name
代碼如下
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 data.txt data_new.txt
data.txt 為我們想要復制的原文件路徑
data_new.txt 為我們想要的新文件路徑
到此這篇關于rust文件讀寫的實現(xiàn)示例的文章就介紹到這了,更多相關rust文件讀寫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!