目录
在go中要操作文件需要使用 os 包
//打开文件的常量,可以使用 | 拼接使用多个 const ( O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件 O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件 O_RDWR int = syscall.O_RDWR // 读写模式打开文件 O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部 O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件 O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在 O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件 )
【1】读取文件内容
创建了一个test.txt文件
【1.1】ReadFile直接读取文件
可以使用 os.ReadFile() 方法直接获取文件的内容,适用于打开一个小型文件
package main
import (
"fmt"
"os"
)
func main() {
fileName := "./test.txt"
content, err := os.ReadFile(fileName) //[]byte
if err != nil {
fmt.Println("read file err=", err)
}
//返回的是个[]byte切片,所以要用string转换一下
fmt.Println(string(content))
}
【1.2】NewReader获取一个带缓冲的文件指针
当打开一个大文件时使用 bufio.NewReader() 方法
带缓冲的好处:读取大文件时先读取一部分存入内存中,类似懒加载模式,性能更好
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
//打开文件
//概念说明: file 的叫法
//1.file 叫 file对象
//2.file 叫 file指针
//3.file 叫 file 文件句柄
file, err := os.Open("./test.txt")
if err != nil {
fmt.Println("open file err=", err)
}
//当函数退出时,要及时的关闭file
defer file.Close() //要及时关闭file句柄,否则会有内存泄漏
//创建一个 *Reader ,是带缓冲的
//缓冲的好处:读取大文件时先读取一部分存入内存中,类似懒加载模式,性能更好
/*
const (
defaultBufSize = 4096//默认的缓冲区为4096
)
*/
reader := bufio.NewReader(file)
//循环读取文件内容
for {
str, err := reader.ReadString('\n') //读到一个换行时就结束
//输出内容
fmt.Print(str)
if err == io.EOF { //io.EOF 表示文件的末尾
fmt.Println()
break
}
}
fmt.Println("文件读取结束")
}
【2】写文件
【2.1】OpenFile 打开文件
参数一:name 文件路径 参数二:flag 文件打开模式 ,可以使用 | 拼接组合使用 const ( O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件 O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件 O_RDWR int = syscall.O_RDWR // 读写模式打开文件 O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部 O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件 O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在 O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件 )参数三:perm FileMode 权限控制(linux/unix下可以使用,windows不能用)const ( // 单字符是被String方法用于格式化的属性缩写。 ModeDir FileMode = 1 << (32 - 1 - iota) // d: 目录 ModeAppend // a: 只能写入,且只能写入到末尾 ModeExclusive // l: 用于执行 ModeTemporary // T: 临时文件(非备份文件) ModeSymlink // L: 符号链接(不是快捷方式文件) ModeDevice // D: 设备 ModeNamedPipe // p: 命名管道(FIFO) ModeSocket // S: Unix域socket ModeSetuid // u: 表示文件具有其创建者用户id权限 ModeSetgid // g: 表示文件具有其创建者组id的权限 ModeCharDevice // c: 字符设备,需已设置ModeDevice ModeSticky // t: 只有root/创建者能删除/移动文件 // 覆盖所有类型位(用于通过&获取类型位),对普通文件,所有这些位都不应被设置 ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice ModePerm FileMode = 0777 // 覆盖所有Unix权限位(用于通过&获取类型位) )
【2.2】写入内容
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
//创建一个文件,写入五句 hello world!
filePath := "../abc.txt"
//打开一个只写的文件,如果不存在则创建,新写的内容追加到文件尾部
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Println("open file err=", err)
return
}
defer file.Close()
str := "hello world!你好\n"
//写入时,使用带缓存的 *Writer
writer := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
writer.WriteString(str)
}
/*
因为writer是带缓存的,所以在调用WriteString方法时,
其实内容是先写入到缓存的
要调用Flush方法,将缓存的数据真正写入到文件中,
否则文件中会没有数据
*/
writer.Flush()
}
【3】判断文件是否存在
golang判断文件或文件夹是否存在的方法为使用 os.Stat() 函数返回的错误值进行判断:
1.如果返回的错误为nil,说明文件或文件夹存在
2.如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
3.如果返回的错误为其它类型,则不确定是否存在
package main
import (
"fmt"
"os"
)
func PathExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil { //文件或目录存在
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
func main() {
filePath := "../demo3"
if isExists, err := PathExists(filePath); isExists {
fmt.Println("文件存在")
} else {
fmt.Println("文件不存在 err = ", err)
}
}
【4】拷贝文件
要拷贝一个文件的话要用到 io.Copy() 函数
创建一个源文件,是一张图片,将这张图片拷贝到demoCopy1文件夹中
代码如下:
package main
import (
"bufio"
"fmt"
"io"
"os"
)
// 编写一个函数,接收两个文件路径
// srcFileName:源文件 dstFileName
func CopyFile(srcFileName string, dstFileName string) (written int64, err error) {
srcFile, err := os.Open(srcFileName)
if err != nil {
fmt.Println("open src file err = ", err)
}
defer srcFile.Close()
reader := bufio.NewReader(srcFile)
//打开dstFileName 要拷贝至的文件
dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println("open dst file err = ", err)
}
defer dstFile.Close()
writer := bufio.NewWriter(dstFile)
return io.Copy(writer, reader)
}
func main() {
srcFile := "../winter.jpeg"
dstFile := "../demoCopy1/winterTest.jpeg"
_, err := CopyFile(srcFile, dstFile)
if err != nil {
fmt.Println("copy file err = ", err)
}
fmt.Println("copy success")
}
执行成功