开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
进行Go的目录操作时,一般会用到"path\filepath"和"os"这个包。我们先来看看filepath有哦那些方法吧
Abs: 获取绝对路径。Base: 获取文件名(不带路径)。Dir: 获取路径中的目录部分(不包含文件名)。Ext: 获取文件的扩展名。Join: 将多个路径片段合并为一个路径。Match: 匹配一个文件路径是否符合指定的模式。Split: 将一个文件路径拆分为路径和文件名两部分。Clean: 清理一个文件路径,移除多余的路径分隔符和点路径(.和..)
func Abs(path string) (string, error)
func Base(path string) string
func Dir(path string) string
func Ext(path string) string
func Join(elem ...string) string
func Match(pattern, name string) (matched bool, err error)
func Split(path string) (dir, file string)
func Clean(path string) string
那么os包中对于文件和目录操作有什么方法呢?
Create: 创建文件。Mkdir: 创建目录。MkdirAll: 创建多级目录。Open: 打开文件。OpenFile: 以指定的模式打开文件。Rename: 重命名文件或目录。Remove: 删除文件或目录。如果目录下有文件,则操作无效RemoveAll: 删除目录及其子目录。Chmod: 修改文件或目录的权限。- Getwd: 获取当前工作目录
- IsNotExist: 接受错误信息,判断该错误信息是否是”文件\路径不存在“
- Stat: 获取文件或目录的信息,返回一个
os.FileInfo类型的值,包含了文件或目录的详细 信息,比如大小、权限、修改时间等。 - Readdir: 遍历目录,返回一个
fs.DirEntry类型的切片
func Create(name string) (File, error)
func Mkdir(name string, perm FileMode) error
func MkdirAll(path string, perm FileMode) error
func Open(name string) (File, error)
func OpenFile(name string, flag int, perm FileMode
func Rename(oldpath, newpath string) error
func Remove(name string) error
func RemoveAll(path string) error
func Chmod(name string, mode FileMode) error
func Getwd() (dir string, err error)
func IsNotExist(err error) bool
func Stat(name string) (FileInfo, error)
func os.ReadDir(name string) ([]fs.DirEntry, error)
简单演示下Mkdir和MkdirAll的区别
// 使用 Mkdir 创建一级目录
err := os.Mkdir("test", 0755)
if err != nil {
fmt.Println(err)
}
// 使用 MkdirAll 创建多级目录
err = os.MkdirAll("test/dir1/dir2", 0755) //如果将多级目录用在Mkdir中会报错
if err != nil {
fmt.Println(err)
}
目录操作示例
package main
import (
"fmt"
"log"
"os"
"path/filepath"
)
func CreateDir(path string) string {
// folderName := time.Now().Format("20220202")
folderName := "测试目录"
folderPath := filepath.Join(path, folderName)
if _, err := os.Stat(folderPath); os.IsNotExist(err) {
os.MkdirAll(folderPath, os.ModePerm)
os.Chmod(folderPath, 0777)
}
return folderPath
}
func main() {
//获取当前路径
path, err := os.Getwd()
if err != nil {
log.Fatal("路径获取失败", err)
}
newpath := CreateDir(path) //在当前路径下创建子目录
fmt.Println("创建的目录名称为:\n", newpath)
absPath, _ := filepath.Abs(newpath)
fmt.Println("绝对路径为:\n", absPath)
os.MkdirAll((filepath.Join(newpath, "新建文件夹/dic")), os.ModePerm)
//修改文件夹名称
os.Rename(filepath.Join(newpath, "新建文件夹"), filepath.Join(newpath, "newfolder"))
os.Remove(filepath.Join(newpath, "newfolder")) //如果目录下有文件则不会删除
}
目录中文件的遍历
文件遍历有多种方法,这里使用os.ReadDir(path)方法遍历
package main
import (
"fmt"
"log"
"os"
)
func main() {
path, err := os.Getwd()
if err != nil {
log.Fatal("路径操作失败", err)
}
files, _ := os.ReadDir(path)
for _, file := range files {
fmt.Println(file.Name())
}
}
运行结果:会输出该目录下面的所有文件名和子目录名,子目录下的文件不会展示。 如果我们只想要目录名称,可通过FileInfo的信息来判断,os.Stat会返回文件的FileInfo。 代码如下所示:
package main
import (
"fmt"
"log"
"os"
)
func main() {
path, err := os.Getwd()
if err != nil {
log.Fatal("路径操作失败", err)
}
files, _ := os.ReadDir(path)
for _, file := range files {
// fmt.Println(file.Name())
fileInfo, err := os.Stat(file.Name())
if err != nil {
log.Fatal("路径遍历失败", err)
}
if fileInfo.IsDir() {
fmt.Println(file.Name())
}
}
}