文章目录
- 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