【声明】
非完全原创,部分内容来自于学习其他人的理论和B站视频。如果有侵权,请联系我,可以立即删除掉。
一、文件操作
1、os
包相关的方法
1.1、创建、打开、关闭文件
func Create(name string) (file *File, err error)
//Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)。如果成功,返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。如果出错,错误底层类型是*PathError。
func NewFile(fd uintptr, name string) *File
//根据文件描述符创建相应的文件,返回一个文件对象
func Open(name string) (file *File, err error)
//Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError。内部实现其实调用了OpenFile。
func OpenFile(name string, flag int, perm uint32) (file *File, err error)
//OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。
//打开名称为name的文件,flag是打开的方式,只读、读写等,perm是权限
const (
O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
O_RDWR int = syscall.O_RDWR // 读写模式打开文件
O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
)
func (f *File) Close() error
//Close关闭文件f,使文件不能用于读写。它返回可能出现的错误。
1.2、写文件
func (file *File) Write(b []byte) (n int, err error)
//Write向文件中写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误
func (file *File) WriteAt(b []byte, off int64) (n int, err error)
//WriteAt在指定的位置(相对于文件开始位置)写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。
func (file *File) WriteString(s string) (ret int, err error)
//WriteString类似Write,但接受一个字符串参数。
1.3、读文件
func (file *File) Read(b []byte) (n int, err error)
//Read方法从f指针中读取最多len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。文件终止标志是读取0个字节且返回值err为io.EOF。
func (file *File) ReadAt(b []byte, off int64) (n int, err error)
//ReadAt从指定的位置(相对于文件开始位置)读取len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。当n<len(b)时,本方法总是会返回错误;如果是因为到达文件结尾,返回值err会是io.EOF。
1.4、删除文件
func Remove(name string) error
//Remove删除name指定的文件或目录。如果出错,会返回*PathError底层类型的错误。
func RemoveAll(path string) error
//RemoveAll删除path指定的文件,或目录及它包含的任何下级对象。它会尝试删除所有东西,除非遇到错误并返回。如果path指定的对象不存在,RemoveAll会返回nil而不返回错误。
2、其他包的方法
2.1 bufio
包相关方法
func NewReader(rd io.Reader) *Reader
//NewReader创建一个具有默认大小缓冲、从r读取的*Reader。
func (b *Reader) ReadString(delim byte) (line string, err error)
//ReadString读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的字符串。
func NewWriter(w io.Writer) *Writer
//NewWriter创建一个具有默认大小缓冲、写入w的*Writer。
func (b *Writer) Write(p []byte) (nn int, err error)
//Write将p的内容写入缓冲。返回写入的字节数。如果返回值nn < len(p),还会返回一个错误说明原因。
func (b *Writer) WriteString(s string) (int, error)
//WriteString写入一个字符串。返回写入的字节数。如果返回值nn < len(s),还会返回一个错误说明原因。
func (b *Writer) Flush() error
//Flush方法将缓冲中的数据写入下层的io.Writer接口。一般写入数据后需要调用该函数将数据刷到文件中
2.2 io.ioutil
包
func ReadAll(r io.Reader) ([]byte, error)
//ReadAll从r读取数据直到EOF或遇到error,返回读取的数据和遇到的错误。
func ReadFile(filename string) ([]byte, error)
//ReadFile 从filename指定的文件中读取数据并返回文件的内容。成功的调用返回的err为nil而非EOF。
func WriteFile(filename string, data []byte, perm os.FileMode) error
//函数向filename指定的文件中写入数据。如果文件不存在将按给出的权限创建文件,否则在写入数据之前清空文件。
3、基本使用
3.1、读写文件内容
func main() {
//以读写模式打开文件,文件不存在则创建
path := "D:/data.txt"
file, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0755)
defer file.Close()
if err != nil {
fmt.Println("文件以读写模式打开失败, err = ", err)
}
str := "Hello world\nHello ketty\nhello golang\n"
bytes, err := file.Write([]byte(str))
if err != nil {
fmt.Println("文件指针写数据失败, err = ", err)
}
fmt.Printf("文件指针写入了[%d]字节\n", bytes)
//file指针写完数据之后,指向了文件末尾
//如果不重新移位,则后面的reader第一次就读到了EOF
offset, err := file.Seek(0, io.SeekStart)
if err != nil {
fmt.Println("文件指针移位到文件头部位置失败, err = ", err)
}
fmt.Printf("文件指针移位到文件头部位置成功, offset = %d\n\n", offset)
//file, _ = os.Open(path)
//根据文件指针创建一个reader,从文件中读数据
reader := bufio.NewReader(file)
for {
line, err := reader.ReadString('\n')
if err != nil {
fmt.Println("bufio.Reader指针读取一行数据失败, err = ", err)
break
}
fmt.Printf("%s", line) //line自带换行符
}
//根据文件路径,直接一次性读取所有内容,该方法封装了Open和Close方法
content, err := ioutil.ReadFile(path)
if err != nil {
fmt.Println("ioutil.ReadFile读数据失败, err = ", err)
}
fmt.Printf("ioutil.ReadFile读取了[%d]字节: %s\n", len(content), string(content))
}
output:
文件指针写入了[37]字节
文件指针移位到文件头部位置成功, offset = 0
Hello world
Hello ketty
hello golang
bufio.Reader指针读取一行数据失败, err = EOF
ioutil.ReadFile读取了[37]字节: Hello world
Hello ketty
hello golang
3.2、写文件的三种方式
func main() {
path := "D:/data2.txt"
str := "Hello, golang\n"
err := ioutil.WriteFile(path, []byte(str), os.ModePerm)
if err != nil {
fmt.Println("ioutil.WriteFile写数据失败, err = ", err)
}
file, err := os.OpenFile(path, os.O_RDWR|os.O_APPEND, 0777)
if err != nil {
fmt.Println("文件以读写模式打开失败, err = ", err)
}
str = "Hello, world\n"
for i := 0; i < 3; i++ {
_, err