Go语言的标准库提供了os、io/ioutil、bufio等包用于文件操作,其中os包是核心,涵盖了文件创建、打开、删除等基础功能;io/ioutil提供了便捷的读写函数;bufio则用于缓冲读写,提升性能。
import (
"fmt"
"io/ioutil"
"os"
"bufio"
)
使用os.Create函数创建文件,若文件已存在则会清空内容(相当于截断)。需检查错误(如路径不存在、权限不足)。
func createFile() {
file, err := os.Create("test.txt")
if err != nil {
fmt.Println("创建文件失败:", err)
return
}
defer file.Close() // 确保文件关闭,避免资源泄漏
fmt.Println("文件创建成功")
}
os.Create创建文件后,通过WriteString或Write方法写入内容(会覆盖原有内容)。os.OpenFile并指定os.O_APPEND标志,在文件末尾追加内容。func writeFile() {
// 覆盖写入
file, err := os.Create("test.txt")
if err != nil {
fmt.Println("打开文件失败:", err)
return
}
defer file.Close()
_, err = file.WriteString("Hello, Go!\n")
if err != nil {
fmt.Println("写入失败:", err)
return
}
// 追加写入
appendFile, err := os.OpenFile("test.txt", os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
fmt.Println("追加打开文件失败:", err)
return
}
defer appendFile.Close()
_, err = appendFile.WriteString("Appended line\n")
if err != nil {
fmt.Println("追加写入失败:", err)
return
}
}
ioutil.ReadFile函数,直接返回字节切片(需转换为字符串)。bufio.NewReader,通过ReadString('\n')逐行读取(适合大文件)。func readFile() {
// 读取全部内容
content, err := ioutil.ReadFile("test.txt")
if err != nil {
fmt.Println("读取文件失败:", err)
return
}
fmt.Println("文件内容:\n", string(content))
// 逐行读取
file, err := os.Open("test.txt")
if err != nil {
fmt.Println("打开文件失败:", err)
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Println("读取行失败:", err)
}
}
使用os.Remove函数删除文件,若文件不存在会返回错误(可通过os.IsNotExist判断)。
func deleteFile() {
err := os.Remove("test.txt")
if err != nil {
if os.IsNotExist(err) {
fmt.Println("文件不存在")
} else {
fmt.Println("删除失败:", err)
}
return
}
fmt.Println("文件删除成功")
}
使用os.Rename函数,第一个参数是原路径,第二个参数是新路径。若目标路径已存在,会覆盖(Linux下需注意权限)。
func renameFile() {
err := os.Rename("test.txt", "new_test.txt")
if err != nil {
fmt.Println("重命名失败:", err)
return
}
fmt.Println("文件重命名成功")
}
使用os.Stat函数获取文件信息(如名称、大小、权限、修改时间等),返回os.FileInfo结构体。
func getFileInfo() {
fileInfo, err := os.Stat("test.txt")
if err != nil {
fmt.Println("获取文件信息失败:", err)
return
}
fmt.Println("文件名:", fileInfo.Name())
fmt.Println("文件大小:", fileInfo.Size(), "字节")
fmt.Println("文件权限:", fileInfo.Mode())
fmt.Println("修改时间:", fileInfo.ModTime())
fmt.Println("是否是目录:", fileInfo.IsDir())
}
Go语言要求显式处理错误,文件操作中的常见错误类型及解决方法:
os.IsNotExist(err)判断,提示用户检查路径。os.IsPermission(err)判断,提示用户检查文件权限(如chmod命令修改权限)。os.MkdirAll创建多级目录)。err,提示用户清理磁盘空间。示例:
func handleError() {
_, err := os.Open("/nonexistent/file.txt")
if err != nil {
if os.IsNotExist(err) {
fmt.Println("文件不存在,请检查路径")
} else if os.IsPermission(err) {
fmt.Println("权限不足,请使用sudo或修改文件权限")
} else {
fmt.Println("其他错误:", err)
}
}
}
/作为路径分隔符,Windows使用\,但Go的os包会自动处理跨平台路径,建议统一使用/。0644)决定了用户对文件的读写权限,创建或修改文件时需确保程序有足够的权限(如使用chmod命令修改权限,或以sudo运行程序)。os.Lstat获取链接本身的信息(而非目标文件),使用os.Readlink读取链接目标。bufio缓冲读写或io.Copy函数,避免一次性读取全部内容导致内存溢出。以上是Go语言在Linux下的基本文件操作指南,涵盖了常见场景及注意事项。实际开发中,可根据需求组合使用这些函数,实现复杂的文件处理逻辑。