引言
下面通过一个例子,说明如何实现创建、递归遍历和删除临时目录。用到标准库的包主要有:“os”、“path/filepath”、“io/ioutil”、“fmt”。
流程图
创建临时目录
- ioutil.TempDir()用来创建临时目录,该方法接收两个参数。第一个参数表示需要在哪里创建新目录。若是空值,则会自动调用os.TempDir()方法获取系统的默认临时目录;第二个参数是匹配的模式,比如是“*_nginx.log”,生成目录时会用随机字符串将“*”替换掉。
- fmt.Errorf()会格式化输出错误信息,返回error。但error是接口类型,可用error.Error()方法将错误信息转换为字符串表示。
- filepath.Join()用来拼接路径。
- os.MkdirAll()会递归创建目录,权限位适用于新创建的所有目录。类似linux命令“mkdir -p /foo/bar”。
遍历和删除临时目录
- os.Chdir()用来更改当前的工作目录,当前工作目录一般默认为环境变量“GOPATH”的值,如果使用gomod包管理,则默认为环境变量“GOMOD”的值。在命令行窗口下,可用“go env”命令查看。
- 自定义的subDirToSkip变量的作用是用来指定要跳过的目录,该操作不会报错,如果遍历时的目录名与它相等,必须返回一个固定的值“filepath.SkipDir”,专门用来返回的值,不是错误。
- filepath.Walk()用来递归遍历目录和文件,接收两个参数。第一个是设置要遍历的根路径。第二个是回调函数WalkFunc,它的用法:
type WalkFunc func(path string, info os.FileInfo, err error) error
path:表示遍历的目录前缀,假设目录foo中有两个文件a.txt和b.txt,将foo设为前缀,在遍历时就会分别用foo/a.txt和foo/b.txt作为参数调用walk函数。
info:表示文件的详细信息,比如文件名、文件大小等等。它是接口类型。
type FileInfo interface {
Name() string // 文件名
Size() int64 // 文件大小,单位是字节。
Mode() FileMode // 文件模式位
ModTime() time.Time // 修改时间
IsDir() bool // 是否是目录
Sys() interface{} // 基础数据源
}
error:表示错误信息,出现错误时会停止遍历。
运行
在windows下的运行结果: