
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/OO_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域socketModeSetuid // u: 表示文件具有其创建者用户id权限ModeSetgid // g: 表示文件具有其创建者组id的权限ModeCharDevice // c: 字符设备,需已设置ModeDeviceModeSticky // t: 只有root/创建者能删除/移动文件// 覆盖所有类型位(用于通过&获取类型位),对普通文件,所有这些位都不应被设置ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDeviceModePerm 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}
