非零基础自学Golang
文章目录
- 非零基础自学Golang
- 第11章 文件操作
- 11.1 目录基本操作
- 11.1.2 创建目录
- 11.1.3 删除目录
第11章 文件操作
11.1 目录基本操作
11.1.2 创建目录
Go标准库中的os库提供了平台无关性的操作系统功能接口。
创建目录时可以使用os库的如下接口:
func Mkdir(name string, perm FileMode) error
Mkdir接口函数使用指定的权限和名称创建一个目录。如果出错,会返回*PathError底层类型(即语言自带的类型)的错误。
[ 动手写11.1.4]
package main
import (
"fmt"
"os"
)
func createDir(path string, dirName string) {
dirPath := path + "\\" + dirName
fmt.Println("Create Dir => " + dirPath)
//0777 也可以写成os.ModePerm
err := os.Mkdir(dirPath, 07777)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("Create Success!")
}
os.Chmod(dirPath, 0777)
}
func main() {
createDir("C:\\Users", "test")
createDir("C:\\Windows\\Temp", "test")
}
运行结果
可以发现,当没有足够的权限去创建一个文件夹时,会报出“Access is denied”的错误,提示我们权限不足,导致文件夹创建失败。
我们再次运行这段代码后,运行结果如下:
当“C:\Windows\Temp\test”文件夹存在时,再次调用Mkdir接口函数会抛出“文件夹已存在”的错误。
Mkdir一次只能创建一级目录,如果使用此函数创建多级目录则会报“The system cannot find the path specified.”的错误。
这时只能使用另一个创建目录的接口函数:
func MkdirAll(path string, perm FileMode) error
MkdirAll使用指定的权限和名称创建一个目录,包括任何必要的上级目录,并返回nil,否则返回错误。
例如在目录“C:\Windows\Temp\”创建目录“C:\Windows\Temp\dir1\dir2\dir3”:
[ 动手写 11.1.5 ]
package main
import (
"fmt"
"os"
)
func createDirAll(path string, dirName string) {
dirPath := path + "\\" + dirName
fmt.Println("Create Dir => " + dirPath)
// 也可以写 0777
err := os.MkdirAll(dirPath, os.ModePerm)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("Create Success!")
}
os.Chmod(dirPath, 0777)
}
func main() {
createDirAll("C:\\Windows\\Temp", "dir1\\dir2\\dir3")
}
运行结果
查看目录
再次运行动手写11.1.5,运行结果如下:
使用MkdirAll创建一个目录path,当path已经存在时,不会报错,直接返回nil。这一点与Mkdir有一定的区别,需要注意。
11.1.3 删除目录
删除目录可以使用如下接口:
func Remove(name string) error
Remove删除name指定的文件或目录。此接口只能删除空文件夹,如果文件夹非空,则会删除失败,返回“文件夹非空”错误。
[ 动手写 11.1.6 ]
package main
import (
"fmt"
"os"
)
func deleteEmptyDir(dirPath string) {
fmt.Println("Delete Dir => " + dirPath)
err := os.Remove(dirPath)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("Delete Success!")
}
}
func main() {
deleteEmptyDir("C:\\Windows\\Temp\\test")
}
现在的test 目录
OK,运行结果
如果文件夹非空,运行结果如下:
毕竟我们之前创了 这么多级
对于非空文件夹,可以使用以下接口删除:
func RemoveAll(path string) error
[ 动手写 11.1.7 ]
package main
import (
"fmt"
"os"
)
func deleteNotEmptyDir(dirPath string) {
fmt.Println("Delete Dir => " + dirPath)
err := os.RemoveAll(dirPath)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("Delete Success!")
}
}
func main() {
deleteNotEmptyDir("C:\\Windows\\Temp\\dir1")
}
运行结果