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: 只适用于当且仅当父目录存在的情况,如果父目录不存在,就会报错。

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