隱私權政策

搜尋此網誌

技術提供:Blogger.

關於我自己

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

2024年1月22日 星期一

Rust read_dir概述 - 對路徑內所有文件檢查


read_dir概述

read_dir被分賴在fs裡面

主要判斷路徑內有哪些文件

並且以此為基礎去操作


文件這樣解釋

read_dir[1]

pub fn read_dir<P: AsRef<Path>>(path: P) -> Result<ReadDir>

輸入一個路徑

回傳Result,Result包著一個迭代器ReadDir[2]

迭代器內部則是Result<DirEntry, error>

也就是出現兩層Result

解釋起來有點饒口

舉個例子大概長這樣

use std::fs;

fn main() {
    let dir_path = "src";
    if let Ok(entries) = fs::read_dir(dir_path) {
        for entry in entries {
            let entry_ = entry.unwrap();
            println!("{:?}", entry.path());
        }
    }
}
"src\\build.rs" "src\\handler.rs" "src\\lib.rs" "src\\main.rs"

設定路徑dir_path

使用read_dir將路徑內的文件資料放入entries迭代器中

透過for entry迭代entries裡面的東西

再把entry unwrap可以得到DirEntry[3],放入entry_裡面

此時就可以對這個文件操作

例如我想要獲得這個路徑

就是直接.path()輸出就好


DirEntry[3]

pub struct DirEntry(/* private fields */);

DirEntry為ReadDir迭代器中的元素結構

可以檢查文件的屬性

常見的例如

path[4]

pub fn path(&self) -> PathBuf

path為獲得文件路徑


file_name[5]

pub fn file_name(&self) -> OsString

file_name可以獲得檔案的名稱

fn main() {
    let dir_path = "src";
    if let Ok(entries) = fs::read_dir(dir_path) {
        for entry in entries {
            let entry = entry.unwrap();
            println!("{:?}", entry.file_name());
        }
    }
}
"build.rs" "handler.rs" "lib.rs" "main.rs"


metadata[6]

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

metadata可以知道資料的資訊

例如可以知道是否為檔案、是否為資料夾、最後修改時間等等

use std::fs;

fn main() {
    let dir_path = "src";
    if let Ok(entries) = fs::read_dir(dir_path) {
        for entry in entries {
            let entry = entry.unwrap();
            let metadata = entry.metadata().unwrap();
            println!("is dir: {:?},  last modified: {:?}",
                metadata.is_dir(), metadata.modified());
        }
    }
}
is dir: false, last modified: Ok(SystemTime { intervals: 133504035161114808 }) is dir: false, last modified: Ok(SystemTime { intervals: 133504035348568046 }) is dir: false, last modified: Ok(SystemTime { intervals: 133504035212331473 }) is dir: false, last modified: Ok(SystemTime { intervals: 133504051360968232 })


參考資料

[1] https://doc.rust-lang.org/std/fs/fn.read_dir.html

[2] https://doc.rust-lang.org/std/fs/struct.ReadDir.html

[3] https://doc.rust-lang.org/std/fs/struct.DirEntry.html

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

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

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

0 comments:

張貼留言