文件操作
文件是数据源(保存数据的地方),主要作用就是保存数据;我们常用的mysql数据库底层也是将数据存储到文件中的
文件在程序中是以流的形式来操作的
流: 数据在数据源(文件)和程序(内存)之间经历的路径
输入流: 数据从数据源(文件)到程序(内存)的路径
输出流: 数据从程序(内存)到数据源(文件)的路径
package main
import (
"fmt"
"os"
)
//这种方式适用于读取文件比较大的,带有缓冲
func main() {
fmt.Println("文件操作")
file, err := os.Open("/Users/go/practice/2023/file/demo1/a.text")
if err != nil {
fmt.Println("打开文件失败 error:", err)
}
//打印发现,file就是一个指针*File
fmt.Printf("file=%v", file) //file=&{0xc000056180}
err = file.Close()
if err != nil {
fmt.Println("关闭文件失败 error", err)
}
}
ioutil.ReadFile一次性将文件读取到位
package main
import (
"fmt"
"io/ioutil"
)
func main() {
//ReadFile没有open和close 所以不需要我们写,他的内部是实现了这两个方法的
file_content, err := ioutil.ReadFile("/Users/go/practice/2023/file/a.text")
if err != nil {
fmt.Println("文件读取错误,error:", err)
}
fmt.Println("文件内容是:", file_content) //这里返回的是byte切片
fmt.Println("文件内容是:", string(file_content)) //将byte切片转换成字符串
}
写文件操作实例
func OpenFile(name string,flag int,perm FileMode)(file *File,err error)
参数解释:
name:文件名
flag:文件的打开模式
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
filePath := "/Users/go/practice/2023/file/aa.text"
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println("文件打开错误:", err)
}
defer file.Close() //程序执行完需要将文件关闭
str := "hello world\n"
writer := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
res, err := writer.WriteString(str)
if err != nil {
fmt.Println("写入文件失败,err:", err)
return
}
fmt.Println(res)
}
//WriteString 是将数据写到缓存区的
//Flush方法是将缓存区的数据刷到磁盘中
writer.Flush()
}
//判断文件是否存在
func PathIsExist(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
//文件操作拷贝函数,图片、视频、mp3等
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func CopyFile(dstFileName string, srcFileName string) (written int64, err error) {
srcFile, err := os.Open(srcFileName) //将已经存在的文件打开
if err != nil {
fmt.Println("open file err=%v\n", err)
}
defer srcFile.Close() //操作结束后,close掉防止内存溢出
reader := bufio.NewReader(srcFile) //读取文件的内容
//打开新的文件,不存在的话就直接创建,参数分别是:文件名,写或者创建文件,文件权限0666
dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println("打开文件错误err:", err)
return
}
writer := bufio.NewWriter(dstFile) //获取到writer
defer dstFile.Close() //操作结束后关闭
return io.Copy(writer, reader)
}
func main() {
file := "/Users/go/practice/2023/file/a.jpg" //已经存在的文件
copy_path := "/Users/go/practice/2023/file/b.jpg" //不存在的文件
res, err := CopyFile(copy_path, file)
if err != nil {
fmt.Println("拷贝文件失败err:", err)
} else {
fmt.Println(res)
}
}