# golang文件路径
# 标准库 filepath
# 拼接路径 Join
p = filepath.Join("a", "b", "c", "d")
1
# 上一级目录
p = filepath.Dir("a/b/c/d") // "a/b/c"
1
# 最后一级目录
p := filepath.Base("a/b/c/d") // "d"
1
# Split 获取目录和文件
dir, name := filepath.Split("a/b/c/d") // "a/b/c" , "d"
1
# 判断是否为绝对路径
bool_val := filepath.IsAbs("/a/b/c") // true
1
# 获取后缀命名
fmt.Print(filepath.Ext("hello.txt")) // ".txt"
1
# 获取文件名(不包含后缀)
fmt.print(strings.TrimSuffix("hello.txt", ".txt"))
1
# 获取相对路径
baseP := "/a/b"
P := "a/b/c/d/e"
p, err = filepath.Rel(baseP, P) // "c/d/e"
if err ...
1
2
3
4
2
3
4
# 目录相关
# 创建删除子目录
// 不能创建多层级目录
err := os.Mkdir("dir", 0755)
// 创建支持多层级目录, 类似 shell mkdir -p
err := os.MkdirAll("a/b/c/d", 0755)
// 如果临时使用这个目录建议使用defer删除
defer os.RemoveAll("dir")
1
2
3
4
5
6
2
3
4
5
6
# 列出目录的所有内容
// c 为 制定目录的 []os.FileInfo 类型
c, err := ioutil.ReadDir("/etc")
for _, entry := range c {
fmt.Println(" ", entry.Name(), entry.IsDir())
}
1
2
3
4
5
2
3
4
5
# 更换当前工作目录
err := os.Chdir("/") // 更改当前工作目录
1
# 递归遍历子目录 walk
// 对于walk函数的callback函数
func callback(p string, info os.FileInfo, err error) error {
if err != nil {
return err
}
fmt.Println(" ", p, info.IsDir())
return nil
}
// walk遍历所有目录
func main() {
filepath.Walk("a/b", callback)
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 临时文件
- 临时文件在运行时用到,程序结束就不再使用的情况
- 临时文件意味着不会随着时间推移污染文件系统
# 使用ioutil创建临时文件
// 创建并打开文件, 可以对文件读写
// 第一个参数 "", 会在操作系统默认位置创建文件 unix系统一般使用 "/tmp"
// 历史文件会以 "sample" 为前缀, 后缀会随机给并保证不重复
// 全名可以通过, f.Name() 获得
f, err := ioutil.TempFile("", "sample")
fmt.Print(f.Name())
// 创建的是临时文件,系统会在适合的时间删除
// 但是手动删除是个好习惯
defer os.Remove(f.Name())
// 这个文件可以跟正常文件对象一样操作
_, err := f.Write([]byte{1, 2, 3})
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 临时文件夹
- 在多个文件的时候,最好创建一临时文件夹
- 历史文件夹创建函数
ioutil.TempDir() - 参数同
iotil.TempFile(),但名字为文件夹的名字
dirName, err := ioutil.TempDir("", "sampledir")
fmt.Println("Temp dir name :", dname)
defer os.RemoveAll(dirName)
fname := filepath.Join(dirName, "file1")
err := ioutil.WriteFile(fname, []byte{1, 2}, 0666)
if err != nil {...}
1
2
3
4
5
6
2
3
4
5
6