Golang学习之文件操作
文件操作是程序最基本的操作了,也是语言的基本模块

Golang学习之文件操作,文件操作在我们写程序中是非常常见的操作,比如持久化数据,比如读取json配置文件等。

创建文件

函数

  • func Create(name string) (file *File, err Error)
    • 接收一个文件名字符串,返回一个*File类型文件,默认权限0666

示例

package main

import ("os")

func main() {
	fn := "testFile.txt"
	file, _ := os.Create(fn)
	defer file.Close()
}

打开和关闭文件

函数

  • 打开文件
    • func Open(name string) (file *File, err Error)
      • 接收字符串,返回*File对象和err(注意返回的nil和io.EOF)
    • func OpenFile(name string, flag int, perm uint32) (file *File, err Error)
      • 接收字符串,打开方式和权限。返回*File对象和err
      • 打开方式
        • os.O_WRONLY 只写
        • os.O_CREATE 创建文件
        • os.O_RDONLY 只读
        • os.O_RDWR 读写
        • os.O_TRUNC 清空
        • os.O_APPEND 追加
  • 关闭文件
    • defer file.Close()
      • 文件打开后必须关闭

示例

package main

import (
    "os"
    "fmt"
    "io"
)

func main() {
    // 打开只读文件
    //file, err := os.Open("testFile.txt")
    
    // 以只读模式文件,如果不存在,则创建文件,权限为0666
	file, err := os.OpenFile("testFile01.txt", os.O_CREATE|os.O_RDONLY, 0666)
	// nil表示打开没有出错,io.EOF表示已经全部读取完毕
    if err != nil && err != io.EOF {
		fmt.Println("Open file failed, err:", err)
	} else {
		fmt.Println("Open file success.")
	}
	defer file.Close()
}

读取文件

函数

  • func (file *File) Read(b []byte) (n int, err Error)
    • File对象自带的读取函数,我一般不用
    • 接收字节类型,返回字节长度和err
  • func ReadAll(r Reader) ([]byte, error)
    • io包的ReadAll方法可以读取所有的文件内容
    • 返回文件内容的字节切片
  • func ReadFile(filename string)([]byte, error)
    • os包的ReadFile方法,封装了打开和读取,可以直接从文件名读取文件。
    • 返回文件内容的字节切片
  • bufio包:带有缓冲的读写包,封装了上面的方法。

示例

package main

import (
    "os"
    "io"
    "fmt"
    "bufio"
)

//File对象的读取
func fileRead() {
    file, err := os.OpenFile("testFile.txt", os.O_CREATE|os.O_RDONLY, 0666)
	if err != nil && err != io.EOF {
		fmt.Println("Open file failed, err:", err)
	} else {
		fmt.Println("Open file success.")
	}
    
    var buf [128]byte
	var content []byte
	
	for {
		n, err := file.Read(buf[:])
		if err == io.EOF {
			// 读取结束
			break
		}
		if err != nil {
			fmt.Println("Read file error ", err)
			return
		}
		content = append(content, buf[:n]...)
	}
	fmt.Println(string(content))
}

//io.ReadAll 替换掉ioutl.ReadAll
func fileIORead() {
    file, err := os.OpenFile("testFile.txt", os.O_CREATE|os.O_RDONLY, 0666)
	if err != nil && err != io.EOF {
		fmt.Println("Open file failed, err:", err)
	} else {
		fmt.Println("Open file success.")
	}
    
    f, _ := io.ReadAll(file)
    fmt.Println(string(f))
}

//os.ReadFile 替换到ioutl.ReadFile
func fileOSRead() {
    f, _ := os.ReadFile("testFile.txt")
    fmt.Println(string(f))
}

//bufio包
// Read
// ReadLine
// ReadBytes
// ReadString 
func fileBufRead() {
    file, err := os.OpenFile("testFile.txt", os.O_CREATE|os.O_RDONLY, 0666)
	if err != nil && err != io.EOF {
		fmt.Println("Open file failed, err:", err)
	} else {
		fmt.Println("Open file success.")
	}
    
    reader := bufio.NewReader(file)
    for {
		line, _, err := reader.ReadLine()
		if err == io.EOF {
			break
		}
		if err != nil {
			return
		}
		fmt.Println(string(line))
	}
}

func main() {
    fileRead()
    fileIORead()
    fileOSRead()
    fileBufRead()
}

写入文件

函数

  • func (f *File) Write(b []byte) (n int, err error)
    • File对象自带的写入方法,接收一个字节切片作为了写入内容,返回写入成功的字节数和err
  • func (f *File) WriteString(s string) (n int, err error)
    • File对象自带的写入字符串的方法,接收一个字符串作为写入内容,返回写入成功的字节数和err
  • func WriteFile(filename string, data []byte, perm os.FileMode) error
    • io/ioutil包的函数,目前在1.16版本这个包已经废弃,建议用os.WriteFile代替
    • 接收文件名参数,要写入的字节切片,权限。返回err
  • bufio包的WriteWriteString方法
    • func (b *Writer) Write(p []byte) (nn int, err error)
    • func (b *Writer) WriteString(s string) (int, error)

示例

package main

import (
    "os"
    "io"
    "fmt"
    "bufio"
)

// File对象字节切片写入
func byteWrite() {
	file, _ := os.OpenFile("testFile.txt", os.O_RDWR|os.O_APPEND, 0666)
	defer file.Close()

	content := "This is a byte writer."
	n, err := file.Write([]byte(content))
	if err != nil {
		fmt.Println("Write file err =", err)
		return
	}
	fmt.Println("Write file success, n =", n)
}

// File对象字符串方式写入
func stringWrite() {
	file, _ := os.OpenFile("testFile.txt", os.O_RDWR|os.O_APPEND, 0666)
	defer file.Close()

	content := "This is a string writer."
	n, err := file.WriteString(content)
	if err != nil {
		fmt.Println("Write file err:", err)
		return
	}
	fmt.Println("Write file success, n:", n)
}

// os包的方式写入
func WB() {
	content := "This is a string writer to os."
	err := os.WriteFile("testFile01.txt", []byte(content), 0666)
	if err != nil {
		fmt.Println("Write file error, err:", err)
		return
	}
}

// bufio的包方式写入,注意最后需要Flush()写入硬盘。
func WriteBuf() {
	file, _ := os.OpenFile("testFile.txt", os.O_RDWR|os.O_APPEND, 0666)
	defer file.Close()

	content := "This is a string writer to bufio"
	writer := bufio.NewWriter(file)
	n, err := writer.Write([]byte(content))
	if err != nil {
		fmt.Println("Write file error, err:", err)
		return
	}
	writer.Flush()
	fmt.Println("Write file success, n:", n)
}

func main() {
	//byteWrite()
	//stringWrite()
	//WB()
	WriteBuf()
}

删除文件

函数

  • func Remove(name string) error
    • 接收文件名,失败返回*FilePath 错误

示例

package main

import (
    "os"
)

func main() {
	err := os.Remove("test-file.txt")
	if err != nil {
		fmt.Println("Delete file error, err:", err)
		return
	}
	fmt.Println("Delete file success.")
}

文件重命名

函数

  • func Rename(oldpath, newpath string) error
    • 接收旧的文件名,新的文件名,失败返回*FilePath的错误

示例

package main

import (
    "os"
)

func main() {
    err := os.Rename("testFile.txt", "testFileNew.txt")
    if err != nil {
        fmt.Println("Rename file error, err:", err)
        return
    }
    fmt.Println("Rename file success.")
}

判断文件是否存在

函数

  • func Lstat(name string) (FileInfo, error)

示例

package main

import (
    "os"
)

func main() {
    _, err := os.Lstat("testFile.txt")
    if !os.IsNotExist(err) {
        fmt.Println("File exist.")
    }
}

最后修改于 2022-05-31