隱私權政策

搜尋此網誌

技術提供:Blogger.

關於我自己

我的相片
目前從事軟體相關行業,喜歡閱讀、健身、喝調酒。習慣把遇到的問題記下來,每天做一些整理方便自己以後查。 Python、Rust、Kotlin等程式語言皆為自學,目前比較著重在Rust語言,歡迎一起討論。

2023年12月27日 星期三

Rust File概述1 - 存取檔案


Struct std::fs::File[1]

File是一種開啟檔案後結構

可以修改或查看檔案詳細內容等等

此篇文章主要講述File常用到的method

另一篇[2]則會講述如何讀寫File


這篇中有很多地方會跟OpenOption類似

也可以看看這篇[3]


open[4]

pub fn open<P: AsRef<Path>>(path: P) -> Result<File>

凡事都有一個起點

open大概就是File的起點

open只能開啟一個唯讀的檔案

也就是開起來後不能編輯,只能讀取

open輸入一個路徑,輸出Result

Result裡面是File 所以要unwrap()

如果檔案不存在會發生Err

其他會發生Err的可以跟OpenOption的open[5]比較


假設有個檔案example.txt內容為abcdefghijklmnopqrstuvwxyz


可以用open打開後

以read_to_string讀取

use std::{fs::File, io::Read};

fn main() {
    let file_path = "example.txt";
    let mut file = File::open(file_path).unwrap();
    let mut buf = String::new();
    file.read_to_string(&mut buf).unwrap();
    println!("{}", buf);
}
abcdefghijklmnopqrstuvwxyz


create[6]

pub fn create<P: AsRef<Path>>(path: P) -> Result<File>

open是打開現有文件

create則是創建文件

如果檔案不存在會創建文件

如果檔案存在則是會截斷,也就是把現有資料去除

create打開的文件只能寫不能讀

回傳Result<File>,因此也要unwrap()


use std::{fs::File, io::{Read, Write}};

fn main() {
    let file_path = "example.txt";
    let mut file = File::create(file_path).unwrap();
    let buf = String::from("123456789");
    file.write_all(buf.as_bytes()).unwrap();
}

透過create創建文件

以write_all把資料寫進文件

最後呈現這樣結果


options[7]

pub fn options() -> OpenOptions

假設一個文件想要讀取又想要撰寫怎麼辦

可以使用options輔助

使用後會輸出OpenOptions

就可以照著這篇文章[3]使用

例如

use std::{
    fs::File,
    io::{Read, Write},
};

fn main() {
    let file_path = "example.txt";
    let mut file = File::options()
        .write(true)
        .read(true)
        .open(file_path)
        .unwrap();
    let buf_write = String::from("1234567890");
    file.write(buf_write.as_bytes()).unwrap();
}

同時開啟write和read

下面一樣可以寫入而不是只能讀取


set_len[8]

pub fn set_len(&self, size: u64) -> Result<()>

輸入一個數字

選擇要截斷的長度

例如我輸入10

use std::fs::File;

fn main() {
    let file_path = "example.txt";
    let file = File::options().write(true).open(file_path).unwrap();
    file.set_len(10).unwrap();
}

會把10以後的數字的取消

只出現abcdefghij


要注意如果write沒有設定成true則會Error

但假設我用create開啟一個只能寫的檔案

使用create的同時他會自動把裡面內容清空

因此只能以option另外打開write權限


metadata[9]

pub fn metadata(&self) -> Result<Metadata>

metadata會輸出一個Metadata[10]

Metadata也是一個結構

可以判斷檔案是否為資料夾、是否為檔案、最後修改時間等等

use std::fs::File;

fn main() {
    let file_path = "example.txt";
    let file = File::open(file_path).unwrap();
    println!("{:#?}", file.metadata().unwrap());
}
Metadata { file_type: FileType( FileType { attributes: 32, reparse_tag: 0, }, ), is_dir: false, is_file: true, permissions: Permissions( FilePermissions { attrs: 32, }, ), modified: Ok( SystemTime { intervals: 133481583167447378, }, ), accessed: Ok( SystemTime { intervals: 133481583168297370, }, ), created: Ok( SystemTime { intervals: 133480766508570384, }, ), .. }


延伸閱讀

Rust File概述2 - 撰寫讀取檔案 ~ LaGee-Blog (lageeblog.blogspot.com)

Rust OpenOptions概述 - 文件打開的權限 ~ LaGee-Blog (lageeblog.blogspot.com)

參考資料

[1] https://doc.rust-lang.org/std/fs/struct.File.html#

[2] https://lageeblog.blogspot.com/2023/12/Rust-File2.html

[3] https://lageeblog.blogspot.com/2023/12/rust-openoptions.html

[4] https://doc.rust-lang.org/std/fs/struct.File.html#method.open

[5] https://doc.rust-lang.org/std/fs/struct.OpenOptions.html#method.open

[6] https://doc.rust-lang.org/std/fs/struct.File.html#method.create

[7] https://doc.rust-lang.org/std/fs/struct.File.html#method.options

[8] https://doc.rust-lang.org/std/fs/struct.File.html#method.set_len

[9] https://doc.rust-lang.org/std/fs/struct.File.html#method.metadata

[10] https://doc.rust-lang.org/std/fs/struct.Metadata.html


0 comments:

張貼留言