文章目录

  • golang常用库之-文件操作🔥
  • 一、os代码包
  • 二、os.File类型 操作模式都有哪些?(os.O_RDONLY、os.O_WRONLY和os.O_RDWR)
  • 三、常用使用demo
  • go语言递归创建目录
  • os.Mkdir、os.MkdirAll区别
  • go创建文件带目录,并写入特定内容
  • Go语言创建文件并写入内容
  • go创建指定大小的文件,获取文件大小
  • 获取当前程序路径
  • 四、Go 读文件
  • 1. 整个文件读取
  • 五、Go 写文件
  • 1. 字节数据直接写到一个新文件中
  • 参考


golang常用库之-文件操作🔥

Go官方提供的文件操作标准库分散在os、ioutil等多个包中,里面有非常多的方法涵盖了文件操作的所有场景。

文件和路径相关的功能包含了:os、path、filepath、ioutil包

一、os代码包

os代码包中的 API。这个代码包可以让我们拥有操控计算机操作系统的能力。

os 包中的 API这个代码包提供的都是平台不相关的 API。

os包中的 API 主要可以帮助我们使用操作系统中的文件系统、权限系统、环境变量、系统进程以及系统信号。

其中,操纵文件系统的 API 最为丰富。我们不但可以利用这些 API 创建和删除文件以及目录,还可以获取到它们的各种信息、修改它们的内容、改变它们的访问权限,等等。

二、os.File类型 操作模式都有哪些?(os.O_RDONLY、os.O_WRONLY和os.O_RDWR)

这些模式分别由常量os.O_RDONLY、os.O_WRONLY和os.O_RDWR代表。在我们新建或打开一个文件的时候,必须把这三个模式中的一个设定为此文件的操作模式。

  • os.O_APPEND:当向文件中写入内容时,把新内容追加到现有内容的后边。
  • os.O_CREATE:当给定路径上的文件不存在时,创建一个新文件。
  • os.O_EXCL:需要与os.O_CREATE一同使用,表示在给定的路径上不能有已存在的文件。
  • os.O_SYNC:在打开的文件之上实施同步 I/O。它会保证读写的内容总会与硬盘上的数据保持同步。
  • os.O_TRUNC:如果文件已存在,并且是常规的文件,那么就先清空其中已经存在的任何内容。

os.Create函数:

func Create(name string) (*File, error) {
 return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)
}

os.Create函数在调用os.OpenFile函数的时候,给予的操作模式是os.O_RDWR、os.O_CREATE和os.O_TRUNC的组合。这就基本上决定了前者的行为,即:如果参数name代表路径之上的文件不存在,那么就新建一个,否则,先清空现存文件中的全部内容。

并且,它返回的File值的读取方法和写入方法都是可用的。这里需要注意,多个操作模式是通过按位或操作符|组合起来的

**os.Open函数的功能是:以只读模式打开已经存在的文件。**其根源就是它在调用os.OpenFile函数的时候,只提供了一个单一的操作模式os.O_RDONLY。

三、常用使用demo

go语言递归创建目录

import (
	"fmt"
	"os"
)

func main() {
	//在当前文件夹创建文件夹
	err := os.MkdirAll("./temp/log", 0777)
	if err != nil {
		fmt.Printf("%s", err)
	} else {
		fmt.Print("创建目录成功!")
	}
}
os.Mkdir、os.MkdirAll区别
os.Mkdir("abc", os.ModePerm) //创建目录
os.MkdirAll("dir1/dir2/dir3", os.ModePerm) //创建多级目录
  • Mkdir 用于创建单个目录。创建多级目录会报错失败。
err:=os.Mkdir(“dir1/dir2/dir3”,os.ModePerm)
if err!=nil{
 fmt.Println(err) 
}

报错结果如下:

result:mkdir ./dir1/dir2/dir3: The system cannot find the path specified.
  • MkdirAll会创建一个名为path的目录以及任何必要的父项,并返回nil,否则返回错误。如果path已经是一个目录,MkdirAll什么也不做,并返回nil。
//basePath是固定目录路径,不包含具体的文件名,如果你传成了 /home/xx.txt, xx.txt也会被当成目录
func CreateDateDir(basePath string) (dirPath string) {
	folderPath := filepath.Join(basePath)
	
	err :=os.MkdirAll(folderPath, os.ModePerm)

	if err!=nil{
		fmt.Println("创建目录报错")
		fmt.Println(err)
	}

	return folderPath
}

go创建文件带目录,并写入特定内容

// create file with dir if dir is not exist
// path is dir
// name is file name
func createFileWithDir(path string, name string, content string) {
 os.MkdirAll(path, os.ModePerm)
 file, _ := os.OpenFile(path + "/" + name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
 defer file.Close()
 file.WriteString(content)
}

Go语言创建文件并写入内容

package main
 
import (
	"bufio"
	"fmt"
	"os"
)
 
func main() {
	//
	filePath := "D:/goProject/src/go_demo/files/test.txt"
	file, err := os.OpenFile(filePath, os.O_WRONLY | os.O_CREATE, 0666)
	if err != nil {
		fmt.Printf("open file error=%v\n", err)
		return
	}
	defer file.Close()
	str := "hello golang\n"
	writer := bufio.NewWriter(file)
	for i := 0; i < 5; i++ {
		writer.WriteString(str)
	}
	writer.Flush()
}

go创建指定大小的文件,获取文件大小

golang 生成 指定大小 空白文件:

思路:

func (f File) Truncate(size int64) error
官方注释:Truncate改变文件的大小,对文件进行截断,它不会改变I/O的当前位置。 如果截断文件,多出的部分就会被丢弃。如果出错,错误底层类型是
PathError。

func CreateSpecSizeFile(){
	var size = int64(1024 )

	f, err := os.Create("foobar1.bin")
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	//单位是字节
	if err := f.Truncate(size); err != nil {
		log.Fatal(err)
	}
	// Output:
	//
	finfo, _ := os.Stat("./foobar1.bin")
	log.Println(finfo.Size())

	fi, _ := f.Stat()
	log.Println("f Stat:", fi.Size())
}

获取当前程序路径

package main

import (
	"fmt"
	"os"
)

func main() {
	str, _ := os.Getwd()
	fmt.Println("当前程序路径: ", str)

}

四、Go 读文件

超全总结:Go 读文件的 10 种方法
参考URL:

1. 整个文件读取

package main

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

func main() {
	str, _ := os.Getwd()
	fmt.Println("当前程序路径: ", str)
	content, err := ioutil.ReadFile("a.txt")
	if err != nil {
		panic(err)
	}
	fmt.Println(string(content))
}

五、Go 写文件

1. 字节数据直接写到一个新文件中

思路:ioutil.WriteFile写文件

func WriteFile(filename string, data []byte, perm os.FileMode) error

使用 WriteFile 方法写文件,接受的第一个 参数 是一个 string 类型 的文件名,第二个参数是一个要写入的文件内容的 byte 数组,最后一个参数是文件的权限。

如果写入成功,返回空的 error 信息,如果写入失败,返回 error 信息,使用 ioutil.WriteFile写文件,在写入文件之前,我们不需要判断文件是否存在,如果文件不存在,会自动创建文件,如果文件存在,则会覆盖原来的内容。

package main
 
import (
	"fmt"
	"io/ioutil"
	"os"
)
 
const strs = "hello"
func main(){

	str, _ := os.Getwd()
	fmt.Println("当前程序路径: ", str)
	
	var(
		fileName = "test.txt"
		content = strs
		err error
		//file *os.File
	)
    //写入文件
	if err = ioutil.WriteFile(fileName,[]byte(content),0666);err !=nil{
		fmt.Println("写入错误:",err)
	}
 
	//读取文件
	fileContent,err:=ioutil.ReadFile(fileName)
	if err!= nil{
		fmt.Println("读取错误:",err)
		return
	}
	fmt.Println("读取成功,文件内容:",string(fileContent))
 
}

参考

Go语言的30个常用文件操作,总有一个你会用到
参考URL: https://zhuanlan.zhihu.com/p/260661233
golang中文件以及文件夹路径相关操作
参考URL: https://studygolang.com/articles/24817