Golang的os包提供了与操作系统交互的基础能力,其中文件和目录操作是最常用的功能之一,覆盖了从基础的文件读写到复杂的目录遍历等多种场景,能够满足日常开发中的大部分文件处理需求。

os包基础说明
os包是Golang的标准库,无需额外安装即可直接使用,它封装了操作系统底层的文件操作接口,在不同操作系统上能够保持一致的调用方式。常用的文件目录操作函数都集中在os包中,部分辅助类型如os.File、os.FileInfo也提供了更丰富的操作能力。
文件基础操作
创建文件
使用os.Create函数可以创建一个新文件,如果文件已经存在则会清空原有内容,函数返回*os.File对象和可能的错误。
package main
import (
"os"
)
func main() {
// 创建名为test.txt的文件
file, err := os.Create("test.txt")
if err != nil {
// 处理创建失败的错误
panic(err)
}
// 操作完成后关闭文件
defer file.Close()
}
打开文件
os.Open函数用于以只读方式打开文件,os.OpenFile可以指定更灵活的文件打开模式,比如读写模式、追加模式等。
package main
import (
"os"
)
func main() {
// 只读方式打开文件
file1, err := os.Open("test.txt")
if err != nil {
panic(err)
}
defer file1.Close()
// 以读写、追加模式打开文件,文件不存在则创建,权限设置为0644
file2, err := os.OpenFile("test.txt", os.O_RDWR|os.O_APPEND|os.O_CREATE, 0644)
if err != nil {
panic(err)
}
defer file2.Close()
}
读取文件内容
打开文件后可以通过Read方法读取内容,也可以使用os.ReadFile一次性读取整个文件的内容,适合小文件场景。
package main
import (
"fmt"
"os"
)
func main() {
// 一次性读取文件全部内容
content, err := os.ReadFile("test.txt")
if err != nil {
panic(err)
}
fmt.Println("文件内容:", string(content))
// 通过Read方法分块读取
file, err := os.Open("test.txt")
if err != nil {
panic(err)
}
defer file.Close()
buf := make([]byte, 1024)
for {
n, err := file.Read(buf)
if n == 0 || err != nil {
break
}
fmt.Println("读取块内容:", string(buf[:n]))
}
}
写入文件内容
可以通过Write或WriteString方法向文件写入内容,也可以使用os.WriteFile一次性写入全部内容。
package main
import (
"os"
)
func main() {
// 一次性写入内容到文件,文件不存在则创建,权限0644
err := os.WriteFile("test.txt", []byte("hello golang"), 0644)
if err != nil {
panic(err)
}
// 打开文件后追加写入内容
file, err := os.OpenFile("test.txt", os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
panic(err)
}
defer file.Close()
_, err = file.WriteString("nadd new line")
if err != nil {
panic(err)
}
}
删除文件
使用os.Remove可以删除单个文件,如果文件不存在会返回错误。
package main
import (
"os"
)
func main() {
err := os.Remove("test.txt")
if err != nil {
panic(err)
}
}
目录操作
创建目录
os.Mkdir用于创建单个目录,要求父目录必须存在;os.MkdirAll可以递归创建多层目录。
package main
import (
"os"
)
func main() {
// 创建单个目录,父目录必须存在
err := os.Mkdir("test_dir", 0755)
if err != nil {
panic(err)
}
// 递归创建多层目录
err = os.MkdirAll("a/b/c", 0755)
if err != nil {
panic(err)
}
}
读取目录内容
os.ReadDir可以读取目录下的所有文件和子目录信息,返回[]os.DirEntry切片。
package main
import (
"fmt"
"os"
)
func main() {
entries, err := os.ReadDir(".")
if err != nil {
panic(err)
}
for _, entry := range entries {
// 判断是否为目录
if entry.IsDir() {
fmt.Printf("目录: %sn", entry.Name())
} else {
fmt.Printf("文件: %sn", entry.Name())
}
}
}
删除目录
os.Remove可以删除空目录,os.RemoveAll可以删除目录及其下的所有文件和子目录,无论是否为空。
package main
import (
"os"
)
func main() {
// 删除空目录
err := os.Remove("test_dir")
if err != nil {
panic(err)
}
// 递归删除目录及所有内容
err = os.RemoveAll("a")
if err != nil {
panic(err)
}
}
常用辅助操作
判断路径是否存在
可以通过os.Stat获取路径信息,结合错误判断路径是否存在。
package main
import (
"fmt"
"os"
)
func main() {
_, err := os.Stat("test.txt")
if os.IsNotExist(err) {
fmt.Println("文件不存在")
} else {
fmt.Println("文件存在")
}
}
获取文件信息
os.Stat返回的os.FileInfo接口包含了文件的大小、修改时间、权限等信息。
package main
import (
"fmt"
"os"
)
func main() {
info, err := os.Stat("test.txt")
if err != nil {
panic(err)
}
fmt.Printf("文件名: %sn", info.Name())
fmt.Printf("文件大小: %d字节n", info.Size())
fmt.Printf("是否为目录: %vn", info.IsDir())
fmt.Printf("修改时间: %vn", info.ModTime())
}
重命名或移动文件/目录
使用os.Rename可以重命名文件或目录,也可以实现移动文件的效果。
package main
import (
"os"
)
func main() {
// 重命名文件
err := os.Rename("test.txt", "new_test.txt")
if err != nil {
panic(err)
}
// 移动文件到目录中
err = os.Rename("new_test.txt", "test_dir/new_test.txt")
if err != nil {
panic(err)
}
}