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()
}