Rust: Path等

一、基本點
1、“/a”和“./a”的區別
/a是起始目錄是指當前工作文件夾的父目錄,a爲子目錄;./a是指:起始目錄爲當前工作文件夾,a爲子目錄。

2、 a/ba//b 相同,都由 a and b 組成.

3、 a/./b, a/b/, a/b/. anda/b 都有 a and b 組成;但是 ./a/b 的起始目錄是當前目錄。
4、 /a/b and /a/b/ 相同
5、a/ca/b/../c 完全不同
6、“/”和 “ \\ ”: 等價

二、join、with_file_name

   // 注意with_file_name,會覆蓋前面的join.但前面join中,有“.,/”結尾部分,不會補覆蓋。
    let path0_0 = Path::new("./history_md_data").join("stock/").with_file_name("510050.XSHG.csv");
    //path0_0 => "./history_md_data\\510050.XSHG.csv"

    let path0_1 = Path::new("./history_md_data").join("stock").with_file_name("510050.XSHG.csv");
    //path0_1 => "./history_md_data\\510050.XSHG.csv"

    let path0_2 = Path::new("./history_md_data").join("/stock/").with_file_name("510050.XSHG.csv");
  //path0_2 => "/510050.XSHG.csv"

    let path0_3 = Path::new("/history_md_data").join("stock/").with_file_name("510050.XSHG.csv");
    //path0_3 => "/history_md_data\\510050.XSHG.csv"

    let path0_4 = Path::new("/history_md_data").join("/stock").with_file_name("510050.XSHG.csv");
    //path0_4 => "/510050.XSHG.csv"

    let path0_5 = Path::new("/history_md_data").join("/stock/").with_file_name("510050.XSHG.csv");
   //path0_5 => "/510050.XSHG.csv"
    println!("path0_0 => {:?}",path0_0);
    println!("path0_1 => {:?}",path0_1);
    println!("path0_2 => {:?}",path0_2);
    println!("path0_3 => {:?}",path0_3);
    println!("path0_4 => {:?}",path0_4);
    println!("path0_5 => {:?}",path0_5);
    // join:
    let path1_0 = Path::new("./history_md_data").join("stock/").join("510050.XSHG.csv");
    let path1_1 = Path::new("./history_md_data").join("stock").join("510050.XSHG.csv");
    let path1_2 = Path::new("./history_md_data").join("/stock/").join("510050.XSHG.csv");
    //path1_2 => "/stock/510050.XSHG.csv",注意有覆蓋
    let path1_3 = Path::new("/history_md_data").join("stock/").join("510050.XSHG.csv");
    let path1_4 = Path::new("/history_md_data").join("/stock").join("510050.XSHG.csv");
    let path1_5 = Path::new("/history_md_data").join("/stock/").join("510050.XSHG.csv");
    println!("------------------");
    println!("path1_0 => {:?}",path1_0);
    println!("path1_1 => {:?}",path1_1);
    println!("path1_2 => {:?}",path1_2);
    println!("path1_3 => {:?}",path1_3);
    println!("path1_4 => {:?}",path1_4);
    println!("path1_5 => {:?}",path1_5);
    println!("------------------");
    
    let path3_1 = Path::new("/history_md_data").with_file_name("510050.XSHG.csv");
    println!("path3_1:=>{:?}",path3_1);

    let path3_2 = Path::new("/history_md_data/stock/510050.XSHG.csv");
    println!("path3_2:=>{:?}",path3_2);

    let path2 = Path::new("./history_md_data/stock/510050.XSHG.csv");
    println!("path2:=>{:?}",path2);
    let parents = path2.parent().unwrap();
    println!("path2 parent:{:?}",parents);
    println!("path2 相關信息");
    let is_ex = parents.exists() ;
    println!("path2 的parents是否存在:{:?}",is_ex);
    let is_f  = path2.is_file();
    println!("path2 是否是文件:{:?}",is_f);
    let is_r = path2.is_relative();
    println!("path2是相對路徑:{:?}",is_r);
    let is_a = path2.is_absolute();
    println!("path2是絕對路徑:{:?}",is_a);
    let is_d = parents.is_dir();
    println!("path2的parents 是目錄文件:{:?}",is_d);
    let home_path = env::current_dir().unwrap();
    println!("當前目錄是:{:?}",home_path);

   //列出相關目錄下文件 
    let paths = fs::read_dir("./").unwrap();
    for path in paths {
        println!("Name: {}", path.unwrap().path().display())
    }

輸出:

path0_0 => "./history_md_data\\510050.XSHG.csv"
path0_1 => "./history_md_data\\510050.XSHG.csv"
path0_2 => "/510050.XSHG.csv"
path0_3 => "/history_md_data\\510050.XSHG.csv"
path0_4 => "/510050.XSHG.csv"
path0_5 => "/510050.XSHG.csv"

------------------
path1_0 => "./history_md_data\\stock/510050.XSHG.csv"
path1_1 => "./history_md_data\\stock\\510050.XSHG.csv"
path1_2 => "/stock/510050.XSHG.csv"
path1_3 => "/history_md_data\\stock/510050.XSHG.csv"
path1_4 => "/stock\\510050.XSHG.csv"
path1_5 => "/stock/510050.XSHG.csv"
------------------

path3_1:=>"/510050.XSHG.csv"
path3_2:=>"/history_md_data/stock/510050.XSHG.csv"
path2:=>"./history_md_data/stock/510050.XSHG.csv"
path2 parent:"./history_md_data/stock"
path2 相關信息
path2 的parents是否存在:true
path2 是否是文件:true
path2是相對路徑:true
path2是絕對路徑:false
path2的parents 是目錄文件:true
當前目錄是:"D:\\my_test"
use std::path::{Component, Path};

let path = Path::new("/tmp/foo/bar.txt");
let components = path.components().collect::<Vec<_>>();
assert_eq!(&components, &[
    Component::RootDir,
    Component::Normal("tmp".as_ref()),
    Component::Normal("foo".as_ref()),
    Component::Normal("bar.txt".as_ref()),
]);

列出home_dir下所有的文件和目錄,但不會列出目錄下的目錄,不會進行遞歸操作。

在這裏插入圖片描述
三、幾個不同點

1、 "/"和“\”是否等同?

    {
        println!("/和\\是否相同?");
        let path2   = Path::new("./history_md_data/stock/510050.XSHG.csv");
        println!("path2: {:?} ",path2);
        let path1_0 = Path::new("./history_md_data").join("stock/").join("510050.XSHG.csv");
        println!("path_1_0 : {:?} ",path1_0);
        println!("path2 ==path_1_0 :{:?}" ,path2 == path1_0);
    }

輸出:

/和\是否相同?
path2: "./history_md_data/stock/510050.XSHG.csv"
path_1_0 : "./history_md_data\\stock/510050.XSHG.csv"
path2 ==path_1_0 :true

2、關於create_dir_all 和create_dir

create_dir_all:適用於不管/a/b/c/d這一個目錄路徑在不在,都 可以,缺少,就創建;
create_dir: 只適用於當且僅當父目錄存在的情況,如果父目錄不存在,就會報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章