GO 文件操作

简介

常见的文件操作:读、写、追加、复制,在go语言中标准库os提供了Openfile函数来进行此类操作,其原型如下:

func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
  • name 是文件的文件名,如果不是在当前路径下运行需要加上具体路径;
  • flag 是文件的处理参数,为 int 类型,根据系统的不同具体值可能有所不同,但是作用是相同的;
  • perm 是文件的操作权限, 一般是0开头 后跟 权限777 ,同linux中的 文件权限一样, 1 为执行、 2为写、4为读。

详细文档参考:

https://www.topgoer.cn/docs/golangstandard/golangstandard-1cmkt0g1jv29k

http://doc.golang.ltd/

关于文件权限

参考:https://www.runoob.com/linux/linux-file-attr-permission.html

文件的权限:
    r 表示可读取,w 表示可写入,x 表示可执行,
    分别表示为数字为r=4,w=2,x=1;
第一位:0 表示是文件

权限又按用户的不同分为三类:
	(第二位)User(该文件拥有者的权限)、
	(第三位)Group(该文件拥有者所在组的其他成员对该文件的操作权限)
	(第四位Other(其他用户组的成员对该文件的操作权限)

如:
	对于User用户,若拥有rw权限,则为4+2=6,
	所以0666中的666代表User、Group、及Other的权限分别是6,6,6,即均为rw权限。
	而0666中的0代表这是个文件

image-20230205172800385

flag参数

常用的 flag 文件处理参数:

  • O_RDONLY:只读模式打开文件;
  • O_WRONLY:只写模式打开文件;
  • O_RDWR:读写模式打开文件;
  • O_APPEND:写操作时将数据附加到文件尾部(追加);
  • O_CREATE:如果不存在将创建一个新文件;
  • O_EXCL:和 O_CREATE 配合使用,文件必须不存在,否则返回一个错误;
  • O_SYNC:当进行一系列写操作时,每次都要等待上次的 I/O 操作完成再进行;
  • O_TRUNC:如果可能,在打开时清空文件。

文件创建并写入

创建一个新文件 golang.txt,并在其中写入 5 句“hello makalo”。

package main

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

func main() {
	//创建一个新文件,写入内容 5 句 “hello makalo”
	// 绝对路径
	// filePath := "E:/GoCode/hello/test.txt"
	// 相对路径
	filePath := "./test.txt"
	file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
		fmt.Println("文件打开失败", err)
	}
	//及时关闭file句柄
	defer file.Close()

	//写入文件时,使用带缓存的 *Writer
	write := bufio.NewWriter(file)
	for i := 0; i < 5; i++ {
		write.WriteString("hello makalo \n")
	}
	//Flush将缓存的文件真正写入到文件中
	write.Flush()
}

执行成功之后在当前目录下创建一个test.txt,并写入
image-20230205174717672

打开文件并追加

打开一个存在的文件,在原来的内容追加内容“好帅”

// 主要内容
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_APPEND, 0666)

完整代码

package main

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

func main() {
	//创建一个新文件,写入内容 5 句 “hello makalo”
	// 绝对路径
	// filePath := "E:/GoCode/hello/test.txt"
	// 相对路径
	filePath := "./test.txt"
	file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		fmt.Println("文件打开失败", err)
	}
	//及时关闭file句柄
	defer file.Close()

	//写入文件时,使用带缓存的 *Writer
	write := bufio.NewWriter(file)
	for i := 0; i < 5; i++ {
		write.WriteString("好帅 \n")
	}
	//Flush将缓存的文件真正写入到文件中
	write.Flush()
}

文件内容

image-20230205175210771

读取追加文件并输出

打开一个存在的文件,将原来的内容读出来,显示在终端,并且追加 5 句“玉树临风”。

注意:当追加和读取同时存在,同时存在,会先读再写

// 主要内容
file, err := os.OpenFile(filePath, os.O_RDWR|os.O_APPEND, 0666)

完整代码

package main

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

func main() {
	//创建一个新文件,写入内容 5 句 “hello makalo”
	// 绝对路径
	// filePath := "E:/GoCode/hello/test.txt"
	// 相对路径
	filePath := "./test.txt"
	file, err := os.OpenFile(filePath, os.O_RDWR|os.O_APPEND, 0666)
	if err != nil {
		fmt.Println("文件打开失败", err)
	}
	//及时关闭file句柄
	defer file.Close()

	//读原来文件的内容,并且显示在终端
	reader := bufio.NewReader(file)
	for {
		str, err := reader.ReadString('\n')
		if err == io.EOF {
			break
		}
		fmt.Print(str)
	}

	//写入文件时,使用带缓存的 *Writer
	write := bufio.NewWriter(file)
	for i := 0; i < 5; i++ {
		write.WriteString("玉树临风 \n")
	}
	//Flush将缓存的文件真正写入到文件中
	write.Flush()
}

执行结果

image-20230205180737016

image-20230205180800432

创建文件并复制文件内容

创建一个新文件 ,将原文件的内容复制到新文件

package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func main() {
	// 文件1 已存在
	file1Path := "./test.txt"
	// 文件2 不存在
	file2Path := "./test2.txt"

	// 创建文件2
	file, err := os.OpenFile(file2Path, os.O_CREATE, 0666)
	if err != nil {
		fmt.Println("文件创建失败", err)
	}
	//关闭file句柄
	file.Close()

	// 内容复制
	data, err := ioutil.ReadFile(file1Path)
	if err != nil {
		fmt.Printf("文件打开失败=%v\n", err)
		return
	}
	err = ioutil.WriteFile(file2Path, data, 0666)
	if err != nil {
		fmt.Printf("文件打开失败=%v\n", err)
	}
}

执行成功后

image-20230205181713621

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章