代码改变世界

golang 标准库 目录操作

  dribs  阅读(69)  评论(0编辑  收藏  举报
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package main
 
import (
    "fmt"
    "io/fs"
    "io/ioutil"
    "os"
    "path/filepath"
)
 
//路径拼接
func example1() {
    p1 := "a/b" + "/" + "c/d" + "/" + "f"
    p2 := filepath.Join("a/b", "c/d", "f")
    dir := filepath.Dir(p1)  //  a\b\c\d
    dir2 := filepath.Dir(p2) //  a\b\c\d
    fmt.Println(dir)
    fmt.Println(dir2)
}
 
//路径分解
func example2() {
    p1 := "a/b/c/d/f/main.ini"
    dir, file := filepath.Split(p1) //  a/b/c/d/f/ main.ini
    fmt.Println(dir, file)
    fmt.Println(filepath.Dir(p1))  //  a\b\c\d\f
    fmt.Println(filepath.Base(p1)) //  main.ini
    fmt.Println(filepath.Ext(p1))  //.ini
 
    fmt.Println(os.Getwd())       //当前路径
    fmt.Println(os.UserHomeDir()) //家目录
 
}
 
//文件存在性
func example3() {
    p1 := "e:/test.txt" //真实存在
    _, err := os.Stat(p1)
    fmt.Println(err)
    //用os.IsExist(err)容易让人疑惑,建议使用os.IsNotExist(err)。
    //true false false false
    fmt.Println(err == nil, os.IsExist(err), err != nil, os.IsNotExist(err))
    p1 = "a/b/c/d/e"
    _, err = os.Stat(p1)
    fmt.Println(err)
    //用os.IsExist(err)容易让人疑惑,建议使用os.IsNotExist(err)。
    //false false true tru
    fmt.Println(err == nil, os.IsExist(err), err != nil, os.IsNotExist(err))
}
 
//stat和绝对路
func example4() {
    p1 := "/a/b/c/d/f/main.ini"
    dir := filepath.Dir(p1)
    err := os.MkdirAll(dir, os.ModePerm) //创建所有父目录
    if err != nil {
        fmt.Println(err)
        return
    }
    f, err := os.Create(p1)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer f.Close()
    //文件stat
    info, err := os.Stat(p1)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(
        info.Name(),
        info.IsDir(),
        info.Mode(),
        info.ModTime(),
        info.Size(),
    )
 
    //绝对路径
    fmt.Println("=========绝对路径===========")
    fmt.Println(filepath.Abs(p1))                 //E:\a\b\c\d\f\main.ini
    fmt.Println(filepath.IsAbs(p1))               //是否是绝对路径 false
    fmt.Println(filepath.Abs("a/b"))              //取绝对路径
    fmt.Println(os.Getwd())                       //当前工作路径
    fmt.Println(filepath.Rel("/a/b", "/a/b/c/d")) //计算相对路径 c/d
 
}
 
//遍历
//filepath.WalkDir 和 filepath.Walk
//遍历递归目录树 每遍历到一个节点,都会执行回调函数,只不过返回的参数略有不同
//都不跟踪软连接 内部都是按照字典序输出 深度优先
//ioutil.ReadDir(path) 不递归遍历当前目录
func example5() {
    p1 := "/a"
    //walkdir和walk遍历递归遍历 包含自身
    filepath.WalkDir(p1, func(path string, d fs.DirEntry, err error) error {
        fmt.Println(path, d.IsDir(), d.Name(), err) //递归读出目录和文件
        return err
    })
    fmt.Println("===Walk======")
    filepath.Walk(p1, func(path string, info fs.FileInfo, err error) error {
        fmt.Println(path, info.Name(), info.IsDir(), err) //递归读出目录和文件
        return err
    })
    fmt.Println("=====ioutil.ReadDir=====")
    fi, err := ioutil.ReadDir(p1)
    if err != nil {
        fmt.Println(err)
        return
    }
    //fmt.Println(fi)
    for i, v := range fi {
        fmt.Println(i, v.Name(), v.IsDir())      // 0 b true    1 e true
        fmt.Println(filepath.Join(p1, v.Name())) // /a/b    /a/e
    }
}
func main() {
    //example1()
    //example2()
    //example3()
    //example4()
    example5()
 
}

  

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示