Go语言文件操作

基本介绍

  1. 输入流和输出流
    文件IO流

  2. os.File 封装所有文件相关操作,File是一个结构体

官方文档

文件操作

打开文件和关闭文件

打开文件使用的是os包下的Open,OpenFile函数

func Open(name string) (file *File, err error)

Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError。

func OpenFile(name string, flag int, perm FileMode) (file *File, err error)

OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。

import "os"

func OpenFileTest() {
	file, err := os.Open("D:\GoWorkplace\src\project01\resources\test.txt") // 用open函数直接打开
	if err != nil {
		fmt.Println("open file err: ", err)
		return
	}

	fmt.Println("file: %v", file)

	err = file.Close()
	if err != nil {
		fmt.Println("close file err: ", err)
	}
}

func OpenFileTest2() {
	file, err := os.OpenFile("D:\GoWorkplace\src\project01\resources\test.txt", os.O_WRONLY | os.O_CREATE, 0666) // 用openFile函数直接打开
	if err != nil {
		fmt.Println("open file err: ", err)
		return
	}

	fmt.Println("file: %v", file)

	err = file.Close()
	if err != nil {
		fmt.Println("close file err: ", err)
	}
}

关闭文件用Close函数,一般会结合defer,在函数执行完毕后自动释放文件句柄

读取文件内容

读取文件内容可以用bufio,ioutil两个包

func FileReaderTest() {

	file, err := os.Open("D:\GoWorkplace\src\project01\resources\test.txt")
	if err != nil {
		fmt.Println("open file err: ", err)
		return
	}

	defer file.Close()

	reader := bufio.NewReader(file)

	for {

		str, err := reader.ReadString('
')
		fmt.Print(str)
		if err == io.EOF {
			break
		}
	}

	fmt.Println("read finish...")
}

func IOUtilTest() {

	file := "../resources/test.txt"
	content, err := ioutil.ReadFile(file)
	if err != nil {
		fmt.Printf("read file err = %v 
", err)
	}
	fmt.Println(string(content))
}

修改文件内容

可以用bufio包下的write函数,也可以使用ioutil包下的write函数


func WriteFileTest3() {
	filePath := "../resources/test.txt"
	file, err := os.OpenFile(filePath, os.O_WRONLY | os.O_APPEND, 0666) // 需要选择模式
	if err != nil {
		fmt.Printf("oped file err = %v 
", err)
		return
	}
	defer file.Close()

	str := "ABC! ENGLISH 
"
	writer := bufio.NewWriter(file)

	for i := 0; i < 5; i++ {
		writer.WriteString(str)
    }
    
    // bufio.writer 是缓存写入,所以需要Flush才能真正写入到文件
	writer.Flush()

}


func ReadAndWriteFileTest() {

	a := "../resources/a.txt"
	test := "../resources/test.txt"

	content, _ := ioutil.ReadFile(test)

	ioutil.WriteFile(a, content, 0666) // 一次性创建清空写入文件
}

判断文件或文件夹是否存在

可以使用os.Stat()函数返回单额错误值进行判断

func Exists(path string) (bool error) {
    _, err := os.Stat(path)
    iif err == nil {
        return true, nil
    } 
    if os.IsNotExist(err) {
        return false, nil
    }
    return false, err
}

拷贝文件

缺少很多err的判断

func CopyFileTest(){
	a := "../resources/a.txt"
	b := "../resources/b.txt"

	fa, _ := os.Open(a)
	fb, _ := os.OpenFile(b, os.O_WRONLY | os.O_CREATE, 0666)

	defer fa.Close()
	defer fb.Close()

	reader := bufio.NewReader(fa)
	writer := bufio.NewWriter(fb)

	io.Copy(writer, reader)
}
原文地址:https://www.cnblogs.com/lxlhelloworld/p/14286045.html