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