Skip to content

文件操作

简介

在 Go 中,文件操作主要依赖以下几个标准库:

  • os 包:提供了底层的文件操作接口,比如打开、创建、读取、写入、删除文件等。
  • io 包:提供了基本的 I/O 接口,通常与 os 配合使用。
  • ioutil 包(Go 1.16 之后推荐使用 osio):之前用于简化文件操作,现在功能被分散到其他包中。
  • bufio 包:提供缓冲读写功能,适合处理大文件或需要高效读写的场景。

文件操作的核心是 os.File 类型,它代表一个打开的文件对象,通过它可以执行读取、写入等操作。

创建文件

  • func Create(name string) (*File, error)
    • 作用:创建一个新文件,如果文件已存在,会清空原有内容。
    • 参数
      • name 表示文件名称,也可以是文件路径,可以是相对路径,也可以是绝对路径。(例如:example.txt 或者 /path/example.txt)
    • 返回值
      • *File:返回一个文件对象,用于后续的文件读写操作。
      • error:如果创建文件时发生错误,则返回错误信息;否则返回 nil

示例:

go
package main

import (
	"fmt"
	"os"
)

func main() {
	// 使用 os 包的 Create 函数创建文件
	file, err := os.Create("file.txt")
	if err != nil {
		fmt.Println("创建文件失败, Error:", err)
		return
	}

	// 打印信息
	fmt.Println(file.Name(), "文件创建成功!")
}

打开文件

  • func Open(name string) (*File, error)
    • 作用:打开文件
    • 参数
      • name:文件路径
    • 返回值
      • *File:返回一个文件对象,用于后续的文件读写操作。
      • error:如果打开文件时发生错误,则返回错误信息;否则返回 nil

示例:

go
package main

import (
	"fmt"
	"os"
)

func main() {
	// 使用 os 包的 Open 函数打开文件
	file, err := os.Open("example.txt")
	if err != nil {
		fmt.Println("文件打开失败, Error:", err)
		return
	}
	
	// 打印信息
	fmt.Println(file.Name(), "文件打开成功!")
}
  • func OpenFile(name string, flag int, perm os.FileMode) (*File, error)
    • 作用:打开文件
    • 参数
      • name:文件路径
      • flag:打开文件的模式(os.O_RDONLY是只读|os.O_WRONLY是只写|os.O_RDWR是读写|os.O_CREATE是创建|os.O_APPEND是追加|os.O_TRUNC是清空)
      • perm:文件权限,通常用八进制表示(如 066607770755 等)
        • 0 表示无权限
        • 1 表示执行权限
        • 2 表示写权限
        • 4 表示读权限
        • 7 表示所有权限
        • 这些值的组合(如 6 = 4+2 表示读写权限)分别适用于文件拥有者、组成员和其他用户。
    • 返回值
      • *File:返回一个文件对象,用于后续的文件读写操作。
      • error:如果打开文件时发生错误,则返回错误信息;否则返回 nil

示例:

go
package main

import (
	"fmt"
	"os"
)

func main() {
	// 以只读方式打开文件
	file1, err := os.Open("file.txt")
	if err != nil {
		fmt.Println("打开文件失败, Error:", err)
		return
	}

	// 关闭文件
	defer file1.Close()

	// 打印信息
	fmt.Println(file1.Name(), "文件打开成功!")

	// 以读写方式打开文件
	file2, err := os.OpenFile("file.txt", os.O_RDWR, 0666)
	if err != nil {
		fmt.Println("打开文件失败, Error:", err)
		return
	}

	// 关闭文件
	defer file2.Close()

	// 打印信息
	fmt.Println(file2.Name(), "文件打开成功!")
}

关闭文件

  • func (f *File) Close() error
    • 作用:关闭文件
    • 参数:无。
    • 返回值
      • error:如果关闭文件时发生错误,则返回错误信息;否则返回 nil

示例:

go
package main

import (
	"fmt"
	"os"
)

func main() {
	// 使用 os 包的 Open 函数打开文件
	file, err := os.Open("example.txt")
	if err != nil {
		fmt.Println("文件打开失败, Error:", err)
		return
	}

	// 关闭文件
	defer file.Close()

	// 打印信息
	fmt.Println(file.Name(), "文件打开成功!")
}

文件状态信息

  • func (f *File) Stat() (FileInfo, error)
    • 作用:获取文件信息
    • 参数:无。
    • 返回值
      • FileInfo:文件信息
      • error:如果获取文件信息时发生错误,则返回错误信息;否则返回 nil

示例:

go
package main

import (
	"fmt"
	"os"
)

func main() {
	// 使用 os 包的 Open 函数打开文件
	file, err := os.Open("example.txt")
	if err != nil {
		fmt.Println("文件打开失败, Error:", err)
		return
	}

	// 关闭文件
	defer file.Close()

	// 获取文件信息
	fileInfo, err := file.Stat()
	if err != nil {
		fmt.Println("获取文件信息失败, Error:", err)
		return
	}

	// 打印文件信息
	fmt.Println("文件名:", fileInfo.Name())
	fmt.Println("文件大小:", fileInfo.Size())
	fmt.Println("修改时间:", fileInfo.ModTime())
	fmt.Println("文件权限:", fileInfo.Mode())
}

写入文件

在 Go 中,写入文件通常通过 os.File 的方法完成,比如 WriteWriteString 等,或者借助 bufio 包实现高效写入。

  • func (f *File) Write(b []byte) (n int, err error)
    • 作用:将字节切片 b 写入文件。
    • 参数
      • b:要写入的字节切片。
    • 返回值
      • n:成功写入的字节数。
      • error:如果写入文件过程中发生错误,则返回错误信息;否则返回 nil

示例:

go
package main

import (
	"fmt"
	"os"
)

func main() {
	// 这里不能使用 os.Open 函数打开文件,只有读取文件权限
	// 所以这里使用 os.OpenFile 函数打开文件,指定文件的开模式
	// os.O_RDONLY:只读| os.O_WRONLY:只写| os.O_RDWR:读写| os.O_CREATE:创建| os.O_APPEND:追加| os.O_TRUNC:清空
	file, err := os.OpenFile("example.txt", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
	if err != nil {
		fmt.Println("文件打开失败, Error:", err)
		return
	}

	// 关闭文件
	defer file.Close()

	// 写入文件
	n, err := file.Write([]byte("Hello, Go!"))
	if err != nil {
		fmt.Println("写入失败, Error:", err)
		return
	}
	fmt.Printf("成功写入 %d 个字节\n", n)
}
  • func (f *File) WriteString(s string) (n int, err error)
    • 作用:将字符串 s 写入文件。
    • 参数
      • s:要写入的字符串。
    • 返回值
      • n:成功写入的字节数。
      • error:如果写入文件过程中发生错误,则返回错误信息;否则返回 nil

示例:

go
package main

import (
	"fmt"
	"os"
)

func main() {
	// 打开文件,并指定文件的模式为只写、创建、清空
	file, err := os.OpenFile("example.txt", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
	if err != nil {
		fmt.Println("文件打开失败, Error:", err)
		return
	}

	// 关闭文件
	defer file.Close()

	// 写入文件
	n, err := file.WriteString("Hello, Go!")
	if err != nil {
		fmt.Println("写入失败, Error:", err)
		return
	}
	fmt.Printf("成功写入 %d 个字节\n", n)
}
  • func (f *File) WriteAt(b []byte, off int64) (n int, err error)
    • 作用:在文件中指定位置 off 写入字节切片 b
    • 参数
      • b:要写入的字节切片。
      • off:要写入的位置。
    • 返回值
      • n:成功写入的字节数。
      • error:如果写入文件过程中发生错误,则返回错误信息;否则返回 nil

示例:

go
package main

import (
	"fmt"
	"os"
)

func main() {
	// 打开文件,并指定文件的模式为只写、创建
	file, err := os.OpenFile("example.txt", os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
		fmt.Println("文件打开失败, Error:", err)
		return
	}
	// 关闭文件
	defer file.Close()
	// 写入文件
	n, err := file.WriteAt([]byte("Go"), 7) // 从第7字节开始写入
	if err != nil {
		fmt.Println("写入失败, Error:", err)
		return
	}
	fmt.Printf("成功写入 %d 个字节\n", n)
}

读取文件

文件复制

文件移动和重命名

文件删除

提示

文档正在更新中...

根据 MIT 许可证发布