脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Go语言文件读写操作案例详解

Go语言文件读写操作案例详解

2022-11-22 10:51山与路 Golang

这篇文章主要为大家介绍了Go语言文件读写操作案例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

基本介绍

文件,对我们并不陌生,文件是数据源(保存数据的地方)的 一种

输入流和输出流 文件在程序中是以流的形式来操作的

Go语言文件读写操作案例详解

:数据在数据源(文件)和程序(内存)之间经历的路径 输入流:数据从文件到内存的路径 输出流:数据从内存到文件的路径

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

文件基本操作

读操作

Go语言文件读写操作案例详解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package main
import (
    "bufio"
    "fmt"
    "io"
    "io/ioutil"
    "mahonia"
    "os"
)
func main() {
    //防止控制台中文乱码 如果是Golang编译则需要安装第三方转码包git clone https://github.com/axgle/mahonia.git
    var enc mahonia.Decoder
    enc = mahonia.NewDecoder("gbk")
    //读取文件的内容并显示在终端,使用os.Open, file.Close, bufio.NewReader(), reader.ReadString
    //打开文件 file,err:=os.Open(文件的绝对路径)
    file,err:=os.Open("F:/test.txt")
    if err !=nil{
        fmt.Println("open file err=",err)
    }
    //关闭文件
    defer file.Close()  //要及时关闭文件,否则会有内存泄露
    //创建一个"Reader",带缓存 默认缓存大小为4096 reader:=bufio.NewReader(file)
    reader:=bufio.NewReader(file)
    //读取文件的内容
    for{
        str,err:=reader.ReadString('\n')
        fmt.Print(enc.ConvertString(str))
        /*
            你好啊
            真的很好asdb
            123
        */
        if err ==io.EOF{// 文件末尾
            break
        }
    }
    //一次性读取文件内容,适用于文件较小的    无需开启和关闭文件
    // 使用 ioutil.ReadFile content为byte[]
    content,err:=ioutil.ReadFile("f:/test.txt")
    if err!=nil{
        fmt.Println("read file err=",err)
    }
    fmt.Print(enc.ConvertString(string(content)))
    /*
    你好啊
    真的很好asdb
    123
    */
}

写操作

文件打开函数 func OpenFile(name string,flag int,perm FileMode)(file *File,err error)

Go语言文件读写操作案例详解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
package main
import (
    "bufio"
    "fmt"
    "io"
    "io/ioutil"
    "mahonia"
    "os"
)
func main() {
    //Read1()
    //Read2("f:/test.txt",'gbk')
    /*
    你好啊
    真的很好asdb
    123
    你好啊
    真的很好asdb
    123
    */
    //创建一个新文件,写入内容 5句 "hello,Gardon"
    //Write()
    //打开一个存在的文件中,将原来的内容覆盖成新的内容10句,"你好,世界!!"
    //Write2()
    //打开一个存在的 文件,将原来的内容追加内容"ABC! ENGLISH!"
    //Write3()
    //打开一个存在的文件,将原来的内容读出显示在终端,并追加5句"hello,北京"
    Write4()
}
func Read1(){
    //防止控制台中文乱码 如果是Golang编译则需要安装第三方转码包git clone https://github.com/axgle/mahonia.git
    var enc mahonia.Decoder
    enc = mahonia.NewDecoder("gbk")
    //读取文件的内容并显示在终端,使用os.Open, file.Close, bufio.NewReader(), reader.ReadString
    //打开文件 file,err:=os.Open(文件的绝对路径)
    file,err:=os.Open("F:/test.txt")
    if err !=nil{
        fmt.Println("open file err=",err)
    }
    //关闭文件
    defer file.Close()  //要及时关闭文件,否则会有内存泄露
    //创建一个"Reader",带缓存 默认缓存大小为4096 reader:=bufio.NewReader(file)
    reader:=bufio.NewReader(file)
    //读取文件的内容
    for{
        str,err:=reader.ReadString('\n')
        fmt.Print(enc.ConvertString(str))
        /*
            你好啊
            真的很好asdb
            123
        */
        if err ==io.EOF{// 文件末尾
            break
        }
    }
}
func Read2(filename string,encode string){
    var enc mahonia.Decoder
    enc = mahonia.NewDecoder(encode)
    //一次性读取文件内容,适用于文件较小的    无需开启和开启文件
    // 使用 ioutil.ReadFile content为byte[]
    content,err:=ioutil.ReadFile(filename)
    if err!=nil{
        fmt.Println("read file err=",err)
    }
    fmt.Print(enc.ConvertString(string(content)))
}
func Write(){
    filename:="f:/test2.txt"
    //创建文件,并以只写形式打开
    file,err:=os.OpenFile(filename,os.O_CREATE |os.O_WRONLY,0666)
    if err !=nil{
        fmt.Println("open file err=",err)
        return
    }
    defer file.Close()
    //写入内容
    str:="hello,Gardon\r\n"
    //写入时,带有缓存的*Writer
    writer:=bufio.NewWriter(file)
    for i:=0;i<5 ;i++  {
        writer.WriteString(str)
    }
    //刷新缓存
    writer.Flush()
    //读取文件
    Read2(filename,"gbk")
    /*
    hello,Gardon
    hello,Gardon
    hello,Gardon
    hello,Gardon
    hello,Gardon
    */
}
func Write2(){
    filename:="f:/test2.txt"
    //创建文件,并以只写形式打开
    file,err:=os.OpenFile(filename,os.O_CREATE |os.O_TRUNC,0666)
    if err !=nil{
        fmt.Println("open file err=",err)
        return
    }
    defer file.Close()
    //写入内容
    str:="你好,世界!!\r\n"
    //写入时,带有缓存的*Writer
    writer:=bufio.NewWriter(file)
    for i:=0;i<10 ;i++  {
        writer.WriteString(str)
    }
    //刷新缓存
    writer.Flush()
    //读取文件
    Read2(filename,"utf-8")
    /*
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
    */
}
func Write3(){
    filename:="f:/test2.txt"
    //创建文件,并以只写形式打开
    file,err:=os.OpenFile(filename,os.O_CREATE |os.O_APPEND,0666)
    if err !=nil{
        fmt.Println("open file err=",err)
        return
    }
    defer file.Close()
    //写入内容
    str:="ABC! ENGLISH!\r\n"
    //写入时,带有缓存的*Writer
    writer:=bufio.NewWriter(file)
    writer.WriteString(str)
    //刷新缓存
    writer.Flush()
    //读取文件
    Read2(filename,"utf-8")
    /*
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        ABC! ENGLISH!
    */
}
func Write4(){
    filename:="f:/test2.txt"
    //创建文件,并以只写形式打开
    file,err:=os.OpenFile(filename,os.O_RDWR |os.O_APPEND,0666)
    if err !=nil{
        fmt.Println("open file err=",err)
        return
    }
    defer file.Close()
    //追加内容
    Read2(filename,"utf-8")
    /*
    你好,世界!!
    你好,世界!!
    你好,世界!!
    你好,世界!!
    你好,世界!!
    你好,世界!!
    你好,世界!!
    你好,世界!!
    你好,世界!!
    你好,世界!!
    ABC! ENGLISH!
    */
    str:="hello,北京\r\n"
    //写入时,带有缓存的*Writer
    writer:=bufio.NewWriter(file)
    writer.WriteString(str)
    //刷新缓存
    writer.Flush()
    //读取文件
    Read2(filename,"utf-8")
    /*
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        你好,世界!!
        ABC! ENGLISH!
        hello,北京
    */
}

写操作案例

查看文件或目录是否存在

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main
import (
    "fmt"
    "os"
)
func main() {
    fmt.Println(PathExists("f:/test2.txt")) //true <nil>
    fmt.Println(PathExists("f:/test3.txt")) //false <nil>
}
func PathExists(path string) (bool, error) {
    _, err := os.Stat(path)
    //如果返回的错误为nil,说明文件或文件夹存在
    if err == nil {
        return true, nil
    }
    //如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
    if os.IsNotExist(err){
        return false, nil
    }
    //如果返回的 错误为其他类型,则不确定是否在存在
    return false,err
}

拷贝文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package main
import (
    "bufio"
    "fmt"
    "io"
    "os"
)
func main() {
    fmt.Println(PathExists("f:/test2.txt")) //true <nil>
    fmt.Println(PathExists("f:/test3.txt")) //false <nil>
    written,err:=CopyFile("f:/test3.txt","f:/test2.txt")
    if err!=nil{
        fmt.Println("拷贝失败!!")
    }else{
        fmt.Println("拷贝成功!!")
    }
    fmt.Println(written)
}
func PathExists(path string) (bool, error) {
    _, err := os.Stat(path)
    //如果返回的错误为nil,说明文件或文件夹存在
    if err == nil {
        return true, nil
    }
    //如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
    if os.IsNotExist(err){
        return false, nil
    }
    //如果返回的 错误为其他类型,则不确定是否在存在
    return false,err
}
func CopyFile(writerFileName string,readerFileName string) (written int64,err error){
    ReaderFile,err2:=os.Open(readerFileName)
    WriterFlag,_:=PathExists(writerFileName)
    var WriterFile *os.File
    if WriterFlag{
        WriterFile,err=os.OpenFile(writerFileName,os.O_WRONLY |os.O_TRUNC,0666)
    }else{
        WriterFile,err=os.OpenFile(writerFileName,os.O_WRONLY |os.O_CREATE,0666)
    }
    if err !=nil{
        fmt.Println("file open err=",err)
        return
    }
    writer:=bufio.NewWriter(WriterFile)
    defer WriterFile.Close()
    if err2 !=nil{
        fmt.Println("file open err=",err2)
        return
    }
    defer ReaderFile.Close()
    reader:=bufio.NewReader(ReaderFile)
    return io.Copy(writer,reader)
}

以上就是Go语言文件读写操作案例详解的详细内容,更多关于Go语言文件读写操作的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/7146111998802165790

延伸 · 阅读

精彩推荐