2022/02/10
//主要讲了文件操作,看看几个包就熟悉了
package main
import (
"fmt"
"os"
)
//os.File 封装所有文件相关的操作,File是一个结构体
func main() {
//1.
/*
打开和关闭文件
*/
//打开文件
file, err := os.Open("e:/go.txt")
if err != nil {
fmt.Println("打开文件失败", err)
}
fmt.Println(file)
//关闭文件
file.Close()
//如果文件存在就打开成功,文件不存在就打开失败
}
package main
import (
"bufio"
"fmt"
"io"
"os"
)
//os.File 封装所有文件相关的操作,File是一个结构体
func main() {
//1.
/*
打开和关闭文件
*/
//打开文件
file, err := os.Open("e:/go.txt")
if err != nil {
fmt.Println("打开文件失败", err)
}
fmt.Println(file)
//defer 在函数运行结束后运行
defer file.Close()
/*
NewReader 带缓冲,不是一次性读取完,读一部分处理一部分
适合读取文件数据比较大的文件
*/
reader := bufio.NewReader(file)
for { //str是具体的读取的内容, err是读取产生的错误信息
str, err := reader.ReadString('\n') //读到一个换行就结束一次
if err == io.EOF { //表示读到文件末尾,就结束读取
return
}
fmt.Print(str) //默认会读取换行符
}
}
package main
import (
"fmt"
"io/ioutil"
)
func main() {
/*
ReadFile 一次性读取
适合读取文件数据比较小的文件
方法内部会自己打开和关闭文件,直接读取即可
open 和 close 已经被封装在ReadFile内部
*/
file := "e:/go.txt"
content, err := ioutil.ReadFile(file)
if err != nil {
fmt.Println("读取失败", err)
return
}
fmt.Println(string(content))
}
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
/*
写文件操作应用实例
使用 OpenFile函数
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
//FileMode只有在Linux下面有用
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.创建一个新文件,写入内容,五句"hello,world"
filePath := "e:/go.txt"
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println("打开文件错误")
}
defer file.Close() //!!!一定要记得关闭文件
str := "hello, world\n"
//写入时,使用带缓存的 *Writer
writer := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
writer.WriteString(str)
}
//!!!!!!!重要!!!!!目前只是写入缓存,
//需要用writer.Flush()写入磁盘文件
writer.Flush()
//写文件有多重方式
}
package main
import (
"fmt"
"os"
)
/*
判断文件是否存在
*/
func PathExits(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() {
exits, err := PathExits("e:/go.txt")
if exits {
fmt.Println("存在这个文件夹")
} else {
fmt.Println("不存在这个文件夹", err)
}
}
package main
import (
"bufio"
"fmt"
"io"
"os"
)
//拷贝文件
//func Copy(dst Writer, src Reader) (written int64, err error)
//编写一个函数,接收两个文件路径,to from
func Copy(to string, from string) (written int64, err error) {
fromFile, err := os.Open(from)
if err != nil {
fmt.Println("打开文件失败")
}
defer fromFile.Close()
//获取from的reader
reader := bufio.NewReader(fromFile)
toFile, err := os.OpenFile(to, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println("打开文件错误")
}
defer toFile.Close()
writer := bufio.NewWriter(toFile)
return io.Copy(writer, reader)
}
func main() {
_, err := Copy("d:/go.txt", "e:/go.txt")
if err != nil {
fmt.Println("拷贝错误")
return
}
fmt.Println("拷贝成功")
}