51、Go语言基础 - 文件系统 - 目录操作
hi,我是温新
本篇文章学习文件的相关操作,如创建目录、删除目录等。关于文件操作,都是在 os 这个包中。
创建目录
os.Mkdir
函数用于在指定的路径上创建一个目录。其格式如下:
func Mkdir(name string, perm FileMode) error
参数解释:
-
name
是要创建的目录的路径。 -
perm
是创建的目录的权限模式,通常使用八进制表示(例如0755
)。
os.Mkdir
将创建一个具有指定名称和权限的目录。以下是一个示例:
package main
import (
"fmt"
"os"
)
func main() {
// 使用 os.Mkdir 创建一个目录名为 "mydir",并赋予它权限 0775
err := os.Mkdir("mydir", 0775)
if err != nil {
// 如果创建目录时出现错误,将错误信息打印并触发 panic
panic(err)
}
// 如果成功创建目录,打印 "mkdir successful"
fmt.Println("mkdir successful")
}
创建多级目录
MkdirAll
函数用于创建多级目录,包括父目录和子目录。其格下如下:
func MkdirAll(path string, perm FileMode) error
参数解释:
-
path
是要创建的目录的路径,可以是多级目录的路径。 -
perm
是创建的目录的权限模式,通常使用八进制表示。
以下是一个示例代码,演示如何使用 MkdirAll
创建多级目录:
package main
import (
"fmt"
"os"
)
func main() {
// 使用 os.MkdirAll 创建多级目录结构,并赋予它权限 0755
err := os.MkdirAll("mydir1/mychid/son", 0775)
if err != nil {
// 如果创建目录时出现错误,将错误信息打印
fmt.Println("Error:", err)
} else {
// 如果成功创建目录,打印 "Directories created successfully"
fmt.Println("Directories created successfully")
}
}
列出目录内容
ReadDir
函数用于读取目录中的文件和子目录列表。其格式如下:
func ReadDir(name string) ([]DirEntry, error)
参数解释:
-
name
是要读取的目录的路径。
ReadDir
返回一个 []DirEntry
切片,其中每个元素代表目录中的一个条目(文件或子目录),以及一个 error
,用于指示是否出现任何错误。
以下是一个使用 ReadDir
的简单示例:
package main
import (
"fmt"
"os"
)
func main() {
// 使用 os.ReadDir 读取 mydir1 目录中的文件和子目录列表
entries, err := os.ReadDir("mydir1")
if err != nil {
// 如果读取目录时出现错误,将错误信息打印
fmt.Println("Error:", err)
} else {
// 遍历目录中的条目并打印它们的名称
for _, entry := range entries {
if !entry.IsDir() {
fmt.Println("文件名", entry.Name())
} else {
fmt.Println("目录名", entry.Name())
}
}
}
}
输出结果:
文件名 a.txt
目录名 mychid
目录名 test
这个示例使用 os.ReadDir
读取 mydir1 目录中的文件和子目录列表。
递归遍历目录及目录下的文件
os.Readdir
函数通常用于读取指定目录中的文件和子目录,但它不会递归遍历子目录。利用递归来实现遍历目录下的所有文件和目录
package main
import (
"fmt"
"os"
"path/filepath"
)
func visitDir(path string) {
// 打开目录
dir, err := os.Open(path)
if err != nil {
fmt.Println("Error opening directory:", err)
return
}
defer dir.Close() // 确保在函数退出时关闭目录
// 读取目录下的所有文件和子目录
entries, err := dir.Readdir(-1) // -1 表示读取所有文件和子目录
if err != nil {
fmt.Println("Error reading directory:", err)
return
}
// 遍历目录下的文件和子目录
for _, entry := range entries {
if entry.IsDir() {
// 如果是子目录,打印并递归遍历
fmt.Println("目录:", filepath.Join(path, entry.Name()))
visitDir(filepath.Join(path, entry.Name()))
} else {
// 如果是文件,打印文件路径
fmt.Println("文件:", filepath.Join(path, entry.Name()))
}
}
}
func main() {
root := "mydir1" // 要遍历的根目录
visitDir(root) // 调用递归遍历函数
}
输出结果
目录: mydir1\mychid
文件: mydir1\mychid\redme.txt
目录: mydir1\mychid\son
删除空目录
os.Remove
函数用于删除指定的文件或目录。其格式如下:
func Remove(name string) error
参数解释:
-
name
是要删除的文件或目录的路径。
os.Remove
将删除指定的文件或目录。如果成功,它返回 nil
,如果出现错误,则返回一个 error
。
package main
import (
"fmt"
"os"
)
func main() {
// 删除 mydir 目录
err := os.Remove("mydir")
if err != nil {
// 如果删除文件时出现错误,将错误信息打印
fmt.Println("Error:", err)
} else {
// 如果成功删除文件,打印 "File deleted successfully"
fmt.Println("File deleted successfully")
}
}
若是删除文件夹,Remove
只能用于删除一个空文件,若文件夹不为空会报错:Error: remove mydir: The directory is not empty.
。
递归删除目录
os.RemoveAll
函数用于递归删除指定的目录及其所有子目录和文件。其格式如下:
func RemoveAll(path string) error
参数解释:
-
path
是要删除的目录的路径。
os.RemoveAll
将删除指定的目录及其所有内容。如果成功,它返回 nil
,如果出现错误,则返回一个 error
。
以下是一个使用 os.RemoveAll
的简单示例
package main
import (
"fmt"
"os"
)
func main() {
// 使用 os.RemoveAll 递归删除名为 "mydir1" 的目录及其所有内容
err := os.RemoveAll("mydir1")
if err != nil {
// 如果删除目录时出现错误,将错误信息打印
fmt.Println("Error:", err)
} else {
// 如果成功删除目录,打印 "Directory and its contents deleted successfully"
fmt.Println("Directory and its contents deleted successfully")
}
}
这个示例使用 os.RemoveAll
递归删除了名为 "mydir" 的目录以及其所有子目录和文件。
这是一个非常危险的方法,使用时一定要注意!!!