文件是数据源(保存数据的地方)的一种,word 文档,txt 文件,excel 文件...都是文件。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保持视频,声音...
os.file封装了所有对文件的操作,且file是一个结构体:
打开和关闭文件
1.打开文件,用于读取:
传入的是一个字符串(文件的路径),返回的是一个指针,以及是否打开成功
2.关闭文件,(方法),绑定file结构体
package main
import (
"fmt"
"os"
)
//file也叫file对象,file指针,file文件句柄
func main() {
//打开文件
file, err := os.Open("d:/Test.txt")
if err != nil {
fmt.Println("打开出错,对应错误为:", err)
}
//输出文件,看文件是什么,是一个指针*file
fmt.Println("文件=%v", file)
//.....一系列操作后
//关闭文件
err2:=file.Close()
if err2 != nil {
fmt.Println("关闭出错")
}
}
读取文件
io流对文件的操作
1.读取文件(不带缓冲区)(适用于文件较小)
读取文件的内容并显示到终端,适用于文件较小的情况
os包下的ReadFile函数(io/ioutils包已经被弃用了)且该操作不须事先打开和事后关闭文件,已经封装到函数中了
package main
import (
"fmt"
"os"
)
func main() {
//读取文件
content, err := os.ReadFile("d:/Test.txt")//io/ioutils包已经被弃用了
if err != nil {
fmt.Println("读取出错,对应错误为:", err)
}
//fmt.Printf("%v\n", content)//由于返回值是byte切片,这样的话会输出Ascll码
fmt.Println(string(content)) //转为字符串即可
}
2.读取文件(带缓冲区)(适用于文件较大)
读取文件的内容并显示在终端(带缓冲区的方式),适合读取比较大的文件,使用os.Open file.Close bufio.NewReader() reader.ReadString方法
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
file, err := os.Open("d:/Test.txt")
if err != nil {
fmt.Println(err)
}
//当函数退出时,让file关闭,防止内存泄漏
defer file.Close()
//创建一个流(带缓冲的):
reader := bufio.NewReader(file)
//读取操作
for {//思考:这样的for形式可以从一到无穷,要配合break使用
str, err := reader.ReadString('\n')// 读到一个换行就结束
//如果没有读取到文件结尾的话,就正常输出文件内容即可
fmt.Println(str)
if err == io.EOF { //io.EOF表示已经读取到文件的结尾
break
}
}
//结束:
fmt.Println("end")
}
写出文件
打开文件操作
三个参数含义
1.要打开文件的路径
2.文件打开模式
3.权限控制(Linux/unix系统下才生效,windows下无效)windows下写0666
实例1:往文件中追加文本
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
//写入文件操作
//打开文件
file, err := os.OpenFile("d:/Test.txt", os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)//分别为读写|在文本末尾追加|文件不存在则创建文件
if err != nil {
fmt.Printf("文件打开失败", err)
return
}
defer file.Close()
//开始写,缓冲输出流,以程序为中心,写到文件里为输出
writer := bufio.NewWriter(file) //io流,缓冲输出流,自带缓冲区
for i := 0; i < 10; i++ {
writer.WriteString("你好,马士兵") //一个方法
}
//由于带缓冲区,flush后才能真正写入文件中
writer.Flush()
}
实例2:覆盖原有文本
打开 一个存在的文件中,将原来的内容覆盖成新的内容 10 句 "你好,尚硅谷!"
package main
import (
"fmt"
"bufio"
"os"
)
func main() {
//打开一个存在的文件中,将原来的内容覆盖成新的内容 10 句 "你好,尚硅谷!"
//1 .打开文件已经存在文件, d:/abc.txt
filePath := "d:/abc.txt"
file, err := os.OpenFile(filePath, os.O_WRONLY | os.O_TRUNC, 0666)
if err != nil {
fmt.Printf("open file err=%v\n", err)
return
}
//及时关闭 file 句柄
defer file.Close()
//准备写入 5 句 "你好,尚硅谷!"
str := "你好,尚硅谷!\r\n" // \r\n 表示换行
//写入时,使用带缓存的 *Writer
writer := bufio.NewWriter(file)
for i := 0; i < 10; i++ {
writer.WriteString(str)
}
writer.Flush()
}
实例3:将一个文件的内容,写入到另外一个文件。
注:这两个文件已经存在了. 说明:使用 io.ReadFile / io.WriteFile 完成写文件的任务.
判断文件是否存在
文件复制操作(利用读的方式)
将源文件中内容复制到目标文件
package main
import (
"fmt"
"os"
)
func main() {
//定义源文件
file1Path := "d:/Test.txt"
//定义目标文件
flie2Path := "d:/Test1.txt"//将源文件中内容复制到目标文件中
//对文件进行读取
content, err := os.ReadFile(file1Path)
if err != nil {
fmt.Println("读取有问题")
return
}
//写出到目标文件,注意会覆盖文件
err = os.WriteFile(flie2Path, content, 0666) //err是个变量
if err != nil {
fmt.Println("写出失败")
}
}
拷贝文件(利用copy方法)
将一张图片 拷贝到另外一个文件
package main
import (
"bufio"
"fmt"
"io"
"os"
)
// 自己编写一个函数,接收两个文件路径 srcFileName dstFileName
func CopyFile(dstFileName string, srcFileName string) (written int64, err error) {
//打开源文件
srcFile, err := os.Open(srcFileName)
if err != nil {
fmt.Printf("open file err=%v\n", err)
}
defer srcFile.Close()
//通过 srcfile ,获取到Reader,因为要读该文件
reader := bufio.NewReader(srcFile)
//打开目标文件dstFileName
dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Printf("open file err=%v\n", err)
return
}
//通过 dstFile, 获取到 Writer,因为要写到该文件
writer := bufio.NewWriter(dstFile)
defer dstFile.Close()
return io.Copy(writer, reader)//将要读的copy给要写的
}
func main() {
//将 d:/flower.jpg 文件拷贝到 d:/abc.jpg
//调用 CopyFile 完成文件拷贝
srcFile := "d:/flower.jpg"
dstFile := "d:/abc.jpg"
_, err := CopyFile(dstFile, srcFile)
if err == nil {
fmt.Printf("拷贝完成\n")
} else {
fmt.Printf("拷贝错误 err=%v\n", err)
}
}
标签:文件,err,fmt,Golang,file,操作,main,os
From: https://blog.csdn.net/weixin_61080257/article/details/140012817