OS & bufio
OS.File是一个结构体,其绑定了文件操作的所有相关函数 通过 file = os.OpenFile() 打开文件句柄 通过 bufio.newWriter/newReader(file) 打开缓冲读写器进行读写
打开和关闭文件
// 打开关闭文件
// 1 打开文件
file, err := os.Open("./TestText/a1.txt")
if(err != nil){
fmt.Println("打开文件失败!!")
}
fmt.Println(file)
// 2 关闭文件
//err = file.Close()
//if err != nil {
// fmt.Println("关闭文件失败!!")
//}
defer file.Close()
读文件
//读文件
// 带缓冲区的读文件
reader := bufio.NewReader(file) //带缓冲区的reader , 默认缓冲区为4096个字节
for {
str , err := reader.ReadString('\n') //分割读取字符串,读取到一个分隔符为止
fmt.Print(str)
//fmt.Println("-------")
if err == io.EOF{ //读到了文件末尾 io.EOF表示文件末尾
//fmt.Println("-------")
break
}
}
//fmt.Println("文件读取结束!")
fmt.Println()
//一次性读取,适合小文件 返回byte切片 content
//不需要显式的打开和关闭文件
content,_ := ioutil.ReadFile("./TestText/b.txt")
fmt.Printf("%v",string(content))
写文件
os.OpenFile
第一个参数为文件路径
第二个参数为打开模式
第三个参数为文件的模式和权限位(Linux)(在windows操作系统中无效)
打开模式,可以通过|进行组合
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 // 如果可能,打开时清空文件
文件模式
// 单字符是被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权限位(用于通过&获取类型位)
代码演示
//写文件
//demo1 创建一个新文件写入内容5句子 "hello,Gardon"
filePath := "./TestText/c.txt"
//file3 , err := os.OpenFile(filePath,os.O_WRONLY |os.O_CREATE,0666)
//for i:=0 ;i<5 ;i++ {
// file3.WriteString("hello,Gardon\n")
//}
////demo2
//file4 , err := os.OpenFile(filePath,os.O_TRUNC | os.O_WRONLY,0666)
//for i:=0 ;i<5 ;i++ {
// file4.WriteString("大头娃娃\n")
//}
//
////demo3
//file5 , err := os.OpenFile(filePath,os.O_APPEND | os.O_CREATE,0666)
//for i:=0 ;i<5 ;i++ {
// file5.WriteString("大瓷娃娃\n")
//}
//demo4 读+写
file6 , err := os.OpenFile(filePath,os.O_RDWR,0666)
defer file6.Close()
InfoReader := bufio.NewReader(file6)
for{
str2 , err := InfoReader.ReadString('\n')
fmt.Print(str2)
if err == io.EOF{
break
}
}
for i:=0;i<5 ;i++ {
file6.WriteString("BigShot\n" )
}
InfoWriter := bufio.NewWriter(file6) //使用带缓存的writer 或 reader优化
for i:=0;i<5 ;i++ {
InfoWriter.WriteString("BigShot\n" )
}
InfoWriter.Flush() //落盘
文件拷贝
//文件拷贝(小文件)
// 写入文件不存在时会自动创建,写入文件会清空之前内容
filepath_c := "./TestText/c.txt"
filepath_d := "./TestText/d.txt"
data , err := ioutil.ReadFile(filepath_c)
if err!=nil {
//文件读取有误
fmt.Printf("读取文件错误: %v\r\n",err)
return
}
err = ioutil.WriteFile(filepath_d, data ,0666)
if err != nil {
fmt.Printf("写入文件错误:%v\r\n",err)
}
利用 os.Copy() 进行文件拷贝
// 文件拷贝,大文件
func CopyFile(dstFilePath string, srcFilePath string)(written int64,err error){
// 将文件从源路径拷贝到目标路径
srcFile, err := os.Open(srcFilePath)
if err!= nil {
fmt.Printf("打开文件错误!%v\r\n",err)
return
}
defer srcFile.Close()
reader := bufio.NewReader(srcFile)
dstFile ,err := os.OpenFile(dstFilePath , os.O_WRONLY | os.O_CREATE , 0666)
if err!= nil{
fmt.Printf("打开文件错误!%v\r\n",err)
return
}
defer dstFile.Close()
writer := bufio.NewWriter(dstFile)
return io.Copy(writer,reader)
}
判断文件是否存在
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
}