1 文件操作
1.1 简介
import "os"
1.2 常用的操作API
// File代表一个打开的文件对象
type File struct {
// 内含隐藏或非导出字段
}
// 打开文件
func Open(name string) (file *File, err error)
// 关闭文件
func (f *File) Close() error
1.3 读写操作
带缓冲的读取
func readFile() {
// [1] 打开
file, err := os.Open("E:\\ShareDir\\Code\\GoCode\\src\\go_code\\proj07_file\\test.txt")
if err != nil{
fmt.Printf("err:%s\n", err)
}
// [end] 延时关闭
defer file.Close()
// 创建一个带缓冲的*Read 默认大小:4096
reader := bufio.NewReader(file)
// 循环读取
for{
readString, err := reader.ReadString('\n') // 按换行符读取
if err == io.EOF{
break // 读取完毕
}
// 输出内容
fmt.Printf("%s", readString)
}
}
一次性读取
一次将文件内容全部读取到内存中
func readFileInOnece() {
filePath := "E:\\ShareDir\\Code\\GoCode\\src\\go_code\\proj07_file\\test.txt"
// func ReadFile(filename string) ([]byte, error)
file, _ := ioutil.ReadFile(filePath)
str := string(file)
fmt.Println(str)
}
创建文件并写内容
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 // 如果可能,打开时清空文件
)
func writeToFile() {
filePath := "E:\\ShareDir\\Code\\GoCode\\src\\go_code\\proj07_file\\newtest.txt"
// 打开创建新文件
file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0666)
if err != nil{
fmt.Printf("err:%s\n", err)
}
// 延时关闭
defer file.Close()
// 循环写入 使用带缓冲的写
writer := bufio.NewWriter(file)
for i := 0; i < 5; i++{
writer.WriteString(fmt.Sprintf("xhh[%d]\r\n", i))
fmt.Println("ok---")
}
// 需要将缓存刷入文件
writer.Flush()
}
1.4 判断文件(夹)是否存在
// Stat返回一个描述name指定的文件对象的FileInfo。
// 如果出错,返回的错误值为*PathError类型。
func Stat(name string) (fi FileInfo, err error)
type FileInfo interface {
Name() string // 文件的名字(不含扩展名)
Size() int64 // 普通文件返回值表示其大小;其他文件的返回值含义各系统不同
Mode() FileMode // 文件的模式位
ModTime() time.Time // 文件的修改时间
IsDir() bool // 等价于Mode().IsDir()
Sys() interface{
} // 底层数据来源(可以返回nil)
}
1.5 拷贝文件
- 文本
func copyFile() {
var srcPath = "E:\\ShareDir\\Code\\GoCode\\src\\go_code\\proj07_file\\test.txt"
// find 后缀位置
var pointIndex = strings.LastIndex(srcPath, ".")
var newPath = srcPath[:pointIndex] + "backup" + srcPath[pointIndex:]
fmt.Println(srcPath)
fmt.Println(newPath)
// [1] openSrc
openFile, err := os.OpenFile(srcPath, os.O_RDONLY, 0666)
if err != nil{
fmt.Println("open err : ", err)
return
}
// 延时关闭
defer openFile.Close()
reader := bufio.NewReader(openFile)
// [2] openDst
writeFile, err := os.OpenFile(newPath, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil{
fmt.Println("open err : ", err)
return
}
defer writeFile.Close()
writer := bufio.NewWriter(writeFile)
// [3] 循环读写
for{
// 读取
readString, err := reader.ReadString('\n')
if err == io.EOF{
// 读取完毕
break
}
// 写入和刷盘
_, err = writer.WriteString(readString)
if err != nil{
fmt.Println("writer err : ", err)
return
}
err = writer.Flush()
if err != nil{
fmt.Println("writer.Flush() err : ", err)
return
}
}
fmt.Printf("copy success!\n")
}
- 图片或者视频
// 从src拷贝n个字节数据到dst,直到在src上到达EOF或发生错误。
// 返回复制的字节数和遇到的第一个错误。
// 对成功的调用,返回值err为nil而非EOF,因为Copy定义为从src读取直到EOF,它不会将读取到EOF视为应报告的错误。
// 如果src实现了WriterTo接口,本函数会调用src.WriteTo(dst)进行拷贝;否则如果dst实现了ReaderFrom接口,本函数会调用dst.ReadFrom(src)进行拷贝。
func Copy(dst Writer, src Reader) (written int64, err error)
func copyImg() {
var srcPath = "E:\\ShareDir\\Code\\GoCode\\src\\go_code\\proj07_file\\src.jpg"
// find 后缀位置
var pointIndex = strings.LastIndex(srcPath, ".")
var dstPath = srcPath[:pointIndex] + "_bak" + srcPath[pointIndex:]
// func Copy(dst Writer, src Reader) (written int64, err error)
// [1] Reader
readFile, err := os.Open(srcPath)
if err != nil{
fmt.Println("Open err : ", err)
return
}
defer readFile.Close()
reader := bufio.NewReader(readFile)
// [2] Writer
writeFile, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil{
fmt.Println("OpenFile err : ", err)
return
}
defer writeFile.Close()
writer := bufio.NewWriter(writeFile)
// [3] copy
_, err = io.Copy(writer, reader)
if err !=