一、基本点
1、“/a”和“./a”的区别
/a是起始目录是指当前工作文件夹的父目录,a为子目录;./a是指:起始目录为当前工作文件夹,a为子目录。
2、 a/b
和 a//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/c
和 a/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下所有的文件和目录,但不会列出目录下的目录,不会进行递归操作。
路径的几部分:
let path = Path::new("/tmp/foo/bar.txt");
let parent = path.parent()// //tmp/foo/
let file_stem = path.file_stem(); //bar
let extension = path.extension(); // txt; 不包括点.
assert_eq!(Some(OsStr::new("bin")), Path::new("/usr/bin/").file_name());
assert_eq!(Some(OsStr::new("foo.txt")), Path::new("tmp/foo.txt").file_name());
assert_eq!(Some(OsStr::new("foo.txt")), Path::new("foo.txt/.").file_name());
assert_eq!(Some(OsStr::new("foo.txt")), Path::new("foo.txt/.//").file_name());
assert_eq!(None, Path::new("foo.txt/..").file_name());
assert_eq!(None, Path::new("/").file_name());
三、几个不同点
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: 只适用于当且仅当父目录存在的情况,如果父目录不存在,就会报错。
3、关于“.”
是指程序所在的工程。这里是指/my_test工程目录。
4、read_dir
read_dir:读出下一级的文件(目录),返回值是Result, 且是一个遍历文件入口的iterator,对其循还会产生io::Result实例。
5、DirEntry:
An instance of DirEntry represents an entry inside of a directory on the filesystem。