Rust 实战练习 - 3. 文件系统,权限,读写,路径组合,time

目标:

  • 文件系统,遍历目录
  • 路径的使用
  • 权限和文件属性
  • 时间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());
                    }
                }
            }
        }
    }
}

相关推荐

  1. Rust csv文件

    2024-03-26 19:34:03       46 阅读
  2. Rust - 终端输入、文件

    2024-03-26 19:34:03       33 阅读
  3. opencv路径包含中文的文件

    2024-03-26 19:34:03       23 阅读
  4. 「C系列」C 文件

    2024-03-26 19:34:03       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-26 19:34:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-26 19:34:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-26 19:34:03       82 阅读
  4. Python语言-面向对象

    2024-03-26 19:34:03       91 阅读

热门阅读

  1. Rust 实战练习 - 2. OS,IO,Platform(注册表,/etc)

    2024-03-26 19:34:03       38 阅读
  2. Rust 与 C++ ,孰优孰劣?

    2024-03-26 19:34:03       37 阅读
  3. MySQL各版本间差异以及需要注意的事项

    2024-03-26 19:34:03       42 阅读
  4. c++列表初始化

    2024-03-26 19:34:03       40 阅读
  5. git commit 生成patch

    2024-03-26 19:34:03       37 阅读
  6. 0058__developer-roadmap最全的开发者技术学习路线

    2024-03-26 19:34:03       35 阅读
  7. vue的基础知识

    2024-03-26 19:34:03       44 阅读
  8. 使用alias定义命令别名

    2024-03-26 19:34:03       40 阅读
  9. C#实例:SQL如何添加数据

    2024-03-26 19:34:03       44 阅读