目标:
- 文件系统,遍历目录
- 路径的使用
- 权限和文件属性
- 时间time
use std::{env, fmt::Debug, os::unix::fs::{MetadataExt, PermissionsExt}, path::{Path, PathBuf}, time::SystemTime};
fn main() {
// 时间处理
// 除Duration和SystemTime外,标准库没有时间处理模块,需要借助chrono 或 time模块
let t1 = Duration::from_secs(10);
_ = t1.saturating_add(Duration::new(8, 200));
println!("{}", t1.as_secs());
path_test();
fs_test();
}
fn path_test(){
// 在Linux下好用
let p1 = Path::new("/home/xin/Download");
println!("{:?}, is dir? {}, is sym? {}, parent: {:?}", p1, p1.is_dir(), p1.is_symlink(), p1.parent().unwrap());
// 在windows下才好用
let p1 = Path::new("C:\\Windows\\System32");
println!("{:?}, is dir? {}, is sym? {}, parent: {:?}", p1, p1.is_dir(), p1.is_symlink(), p1.parent().unwrap());
// 构建一个路径, Windows下使用
// Linux下这么使用会出现路径分隔符混乱
let mut p2 = PathBuf::from("C:\\");
p2.push("Windows\\System32");
p2.push("tmp\\");
println!("{}", p2.display()); // C:\/Windows\System32/tmp\ 异常
// linux
let mut p3 = PathBuf::from("/home");
p3.push("xin");
p3 = p3.join("Download/");
println!("{}", p3.display()); // /home/xin/Download/
// 便利方法
let p4 : PathBuf = ["/etc", "nginx", "nginx.conf"].iter().collect();
println!("{}", p4.display());
// 路径
// 如果路径不存在,会报错,依赖系统文件系统
println!("{:?}", PathBuf::from("/home/xin/a/../c/./d/1.txt").canonicalize());
}
fn fs_test(){
// 下载目录
let p1 = env::home_dir().unwrap().join("Download");
println!("{}", p1.display());
if p1.exists() {
// 查看文件夹属性
let m = p1.metadata().unwrap();
println!("accessed: {}, create {}, dir {}, sym {}, perm {:o}, size {}",
m.accessed().unwrap().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs(), // unix timestramp
m.created().unwrap().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs(),
m.is_dir(), m.is_symlink(),
m.permissions().mode(), // unix 权限
m.size());
// 是目录,就继续读取子文件
if p1.is_dir() {
for sub in p1.read_dir().unwrap() {
if let Ok(entry) = sub { // DirEntry
let ft = entry.file_type().unwrap(); // FileType
let fp = entry.path();
println!("name: {},\t dir? {},\t file? {},\t sym? {},\t Path: {}", entry.file_name().into_string().unwrap(),
ft.is_dir(), ft.is_file(), ft.is_symlink(),fp.display());
// 对于符号链接,读取链接指向的地址
if ft.is_symlink() {
println!("\tsymlink: {} => {}", fp.display(), fp.read_link().unwrap().display());
}
}
}
}
}
}