2 个版本
0.1.3 | 2021 年 2 月 2 日 |
---|---|
0.1.2 | 2021 年 1 月 29 日 |
0.1.1 |
|
0.1.0 |
|
在 文件系统 中排名第 534
每月下载量 127 次
在 fontpm 中使用
13KB
108 行
路径计算
这是一个库,可以帮助您使用 Path
或 PathBuf
进行计算,例如获取绝对路径、获取两个路径之间的相对路径、如果存在则获取 '~'(home_dir)。
这是基于 path_absolutize 库,我用 as_absolute_path
替换了 absolutize
这一行,因为它不支持 '~',这是最近使用的,至少在 UNIX 系统中。
以下是一些示例,展示了如何使用这个库。
示例
您可以使用以下方法。
home_dir
如果您的环境中存在当前用户的 HOME,则获取它,否则返回错误(我有点懒,所以只是把这个方法放在 Calculate trait 中)。
extern crate path_calculate;
use std::path::Path;
use path_calculate::*;
let p = Path::new("/tmp");
if let Ok(home_dir) = p.home_dir() {
println!("Home path: {:?}", home_dir);
}
as_absolute_path
这几乎与 path-absolutize
中的 absolutize
相似,我只在这个方法中添加了对 ~
($HOME)的支持(Unix 或 Windows)。
extern crate path_calculate;
use std::path::Path;
use path_calculate::*;
// If u have $HOME, test `~` support
let p = Path::new("./whatever");
if let Ok(home_dir) = p.home_dir() {
let p = Path::new("~");
assert_eq!(home_dir.to_str().unwrap(), p.as_absolute_path().unwrap().to_str().unwrap());
}
let p2 = Path::new("/tmp/a/b/c/../../e/f");
assert_eq!("/tmp/a/e/f", p2.as_absolute_path().unwrap().to_str().unwrap());
relative_root_with
有时我会使用路径的相对根,它返回一个绝对相对根路径。注意,在 Windows 上,它不能在不同磁盘(C:\、D:\等)上计算相对根,当您尝试使用此方法时,它将返回一个 ioerror,例如 io::ErrorKind::InvalidInput
。
extern crate path_calculate;
use std::path::Path;
use path_calculate::*;
let p1 = Path::new("/home/gits/mkisos");
let p2 = Path::new("/home/cc/trash");
let relative_root = p1.relative_root_with(&p2);
assert_eq!("/home", relative_root.unwrap().to_str().unwrap())
extern crate path_calculate;
use std::io::ErrorKind;
use std::path::Path;
use path_calculate::*;
// Pass Test when in Unix
if cfg!(target_os = "windows") {
// Windows ok
let d1 = Path::new("D:\\Games\\Videos\\Replays");
let d2 = Path::new("D:\\Games\\Dota2");
assert_eq!("D:\\Games", d1.relative_root_with(&d2).unwrap().to_str().unwrap());
// Windows err
let c1 = Path::new("~");
assert_eq!(ErrorKind::InvalidInput, c1.relative_root_with(&d1).unwrap_err().kind());
}
related_to
此方法用于计算从 src_path 到 dst_path 的相对路径。
extern crate path_calculate;
use std::path::Path;
use path_calculate::*;
// $HOME="/home/chao"
let dst_path = Path::new("/home/chao/works/demo/src");
let src_path = Path::new("/home/chao/trash");
assert_eq!("../works/demo/src", dst_path.related_to(&src_path).unwrap().to_str().unwrap());
add_path
使用 path.join();
依赖项
~125KB