1.创建文件
- GO语言中提供了一个Create( )函数专门创建文件.
- 该函数在创建文件时,首先会判断要创建的文件是否存在,如果不存在,则创建,如果存在,会先将文件中已有的数据清空。
- 同时,当文件创建成功后,该文件会默认的打开,所以不用在执行打开操作,可以直接向该文件中写入数据。
package main
import (
"os"
"fmt"
)
func CreateFile(path string) {
f, err := os.Create(path)
if err != nil {
fmt.Println("创建文件错误:", err)
return
}
defer f.Close()
}
func main() {
path := "D:/golang/a.txt"
CreateFile(path)
}
2.写入数据
func CreateFile(path string) {
f, err := os.Create(path)
if err != nil {
fmt.Println("创建文件错误:", err)
return
}
for i := 1; i <= 10; i++ {
n, err := f.WriteString("hello world\n")
fmt.Println(n) //第一个参数返回写入数据的长度;第二个参数返回错误信息
if err != nil {
fmt.Println("写入文件错误:", err)
return
}
}
defer f.Close()
}
func main() {
path := "D:/golang/a.txt"
CreateFile(path)
}
- 使用Write( )函数写数据时,参数为字节数组,所以需要将字符串转换成字节数组。
- buff := []byte(“hello world”)
- n, err := f.Write(buff)
- 使用WriteAt( )函数,在指定的位置写入数据:
- n,_ := f.seek(0,os.SEEK_END) //查找文件末尾的偏移量
- a,err := f.WriteAt([]byte(“hello world”),n) //从文件末尾的偏移量开始写入内容
- 对已经存在的文件不能再执行Create( ),而是要执行OpenFile( ).
如下所示: - f, err := os.OpenFile(path, os.O_APPEND, 6)
- OpenFile( )这个函数有三个参数,第一个参数表示打开文件的路径
- 第二个参数表示模式,常见的模式有:
- O_RDONLY(只读模式)
- O_WRONLY(只写模式)
- O_RDWR( 可读可写模式)
- O_APPEND(追加模式)。
- 第三个参数,表示权限,取值范围(0-7)表示如下:
- 0:没有任何权限
- 1:执行权限(如果是可执行文件,是可以运行的)
- 2:写权限
- 3:写权限与执行权限
- 4:读权限
- 5:读权限与执行权限
- 6:读权限与写权限
- 7:读权限,写权限,执行权限
func AppendFile(path string) {
f, err := os.OpenFile(path, os.O_APPEND, 6)
if err != nil {
fmt.Println("打开文件错误:", err)
return
}
defer f.Close()
for i := 1; i <= 10; i++ {
_, err := f.WriteString("hello world\n")
if err != nil {
fmt.Println("写入文件错误:", err)
return
}
}
}
func main() {
path := "D:/golang/a.txt"
AppendFile(path)
}
3.读取文件
- Open( )是打开文件,与OpenFile( )的区别是,Open( )只有读的权限
- Read( )函数返回的是从文件中读取的数据的长度。最后,输出切片中存储的文件数据,注意,读取的是从最开始到整个数据长度,因为有可能存储到切片中的数据达不到切片的总长度(也是切片时2k,但是从文件中读取的数据有可能只有1k)
func ReadFile(path string) {
f, err := os.Open(path)
if err != nil {
fmt.Println("打开文件错误:", err)
return
}
defer f.Close()
buff := make([]byte, 1024*1024)
n, err := f.Read(buff)
if err != nil && err!= io.EOF {
fmt.Println("读取文件错误:", err)
return
}
fmt.Println(string(buff[:n]))
}
func main() {
path := "D:/golang/a.txt"
ReadFile(path)
}
3.1 按行读取
package main
import (
"os"
"fmt"
"bufio"
"io"
)
func ReadFile(path string) {
f, err := os.Open(path)
if err != nil {
fmt.Println("打开文件错误:", err)
return
}
defer f.Close()
i := bufio.NewReader(f)
for {
//buff, err := i.ReadBytes('\n') //遇到'\n'就结束
buff, _, err := i.ReadLine() //按行读取
if err != nil {
if err == io.EOF { //文件已经结束
break
} else {
fmt.Println("读取文件错误:", err)
}
}
fmt.Println(string(buff))
}
}
func main() {
path := "D:/golang/a.txt"
ReadFile(path)
}
4.复制文件案例
package main
import (
"os"
"fmt"
"io"
)
func main() {
//打开源文件
sf, err1 := os.Open("D:/golang/a.txt")
if err1 != nil {
fmt.Println("打开源文件错误:", err1)
return
}
//创建目标文件
tf, err2 := os.Create("D:/golang/b.txt")
if err2 != nil {
fmt.Println("创建目标文件错误:", err2)
return
}
//关闭文件
defer sf.Close()
defer tf.Close()
//复制文件
buff := make([]byte, 1024*1024)
for {
n, err3 := sf.Read(buff) //读一部分
if err3 != nil {
if err3 == io.EOF {
break //文件读取完毕
} else {
fmt.Println("读取源文件错误:", err3)
}
}
tf.Write(buff[:n]) //写一部分
}
}