rust学习之dir和path操作

rust May 19, 2021

前言

对Linux文件系统来说,dir也是一个文件,只是他没有内容,有的是inode信息。指引到其他文件。下面是dir和path的操作图:

20210519111451


dir操作都在std::fs包下,path操作在std::path下面。

读取dir操作

这部分源码也比较底层,不看了。

例子:


use std::fs;
use std::path::Path;

fn main() {
    let dir = fs::read_dir(".").unwrap();

    for entry in dir {
        let entry = entry.unwrap();

        let path = entry.path();
        let file_type = entry.file_type().unwrap();
        let metadata = entry.metadata().unwrap();
        let file_name = entry.file_name();

        println!("{:?} {:?} {:?} {:?} ", path, file_type, metadata, file_name);
    }

    let new_path = Path::new("/usr/path.txt");
    println!("{:?}", new_path);


    for component in new_path.components() {
        println!("comp {:?}", component);
    }

}

例子主要是获取当前目录下所有文件和文件的信息。第二部分是用构建一个新的path,然后打印他们的各个路径。

构建dir

如何用程序构建一个目录呢?rust提供了Dirbuilder struct。

例子:


use std::fs;
use std::path::Path;
use std::fs::DirBuilder;

fn main() {
    let dir = "/tmp/dir1/dir2/dir3/";

    println!("{:?}", DirBuilder::new().recursive(true).create(dir).unwrap());    
}

构建path

例子:


use std::fs;
use std::path::{Path, PathBuf};
use std::fs::{DirBuilder, File};

fn main() {
    let mut  path_buf = PathBuf::new();

    path_buf.push("/tmp");
    path_buf.push("test");
    path_buf.push("path1");
    path_buf.push("esa");
    path_buf.set_extension("rs");
    println!("{:?}", path_buf);


    println!("{:?}", File::create(path_buf).unwrap());
}

我们可以构建一个path,然后通过这个path来创建文件或者目录。