Go 读写文件
1. 读取文件
1.1 读出整个文件
func FileRead() {
file, err := os.Open("Sakura.txt")
if err != nil {
log.Fatal("打开文件失败", err)
}
defer file.Close()
content := make([]byte, 10)
// n表示读取的字节数
n, err := file.Read(content)
if err != nil {
log.Fatalln("读取文件失败")
return
}
// 输出读取的内容
fmt.Println(string(content[:n]))
fmt.Println(string(content))
}
1.2 带缓冲读出文件
func FileReadBuf() {
file, err := os.Open("Sakura.txt")
if err != nil {
log.Fatal("打开文件失败", err)
}
defer file.Close()
// 创建一个缓冲读取器
reader := bufio.NewReader(file)
// 循环读出文件内容
for {
// 每次循环读一行
line, err := reader.ReadString('\n')
if err != nil {
if err == io.EOF {
fmt.Println(line)
break
} else {
fmt.Println("其他错误:", err)
return
}
} else {
fmt.Println(line)
}
}
}
2. 写入文件
// 参数分别表示文件的路径,文件打开模式,权限
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
// 文件打开模式
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 // 如果可能,打开时清空文件
)
// 权限控制
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 权限位(用于通过 & 获取类型位)
)
权限在 Linux / Unix 设置下生效 , Window下设置无效
2.1 正常写入文件
func FileWrite() {
// os.CREATE表示文件不存在创建
// os.O_APPEND表示写入时追加到原来的文件后面
file, err := os.OpenFile("Sakurasss.txt", os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatalln("打开文件失败", err)
}
defer file.Close()
// 要写入的文件
content := "内容"
n, err := file.Write([]byte(content))
if err != nil {
log.Fatalln("写入文件失败", err)
} else {
fmt.Println("写入了 ", n, " 个字节")
}
}
2.2 缓存写入文件
func main() {
// 写入文件
// 1.打开文件
// 第二个参数分别表示 读写模式打开文件,追加写入,文件不存在创建一个新文件
file, err := os.OpenFile("Sakurasss.txt", os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)
if err != nil {
fmt.Println("打开文件失败")
return
}
// 2.及时关闭文件
defer file.Close()
// 写入文件操作 --> IO流 --> 缓冲输出流
writer := bufio.NewWriter(file)
writer.WriteString("Sakura")
// 流带缓冲区,所以写的数据都在缓冲区,所以要刷新数据
writer.Flush() //刷新完数据之后 -->文件真正写入
fmt.Println("文件写入成功")
}
3.2 文件复制
func main() {
//定义源文件
SourceFile := "d://PutPassword.txt"
//定义目标文件
TargetFile := "d://Test.txt"
//对文件进行读取
content, err := os.ReadFile(SourceFile)
if err != nil {
fmt.Println("文件读取失败")
} else {
//写出文件
err := os.WriteFile(TargetFile, content, 0666)
if err != nil {
fmt.Println("文件写出失败")
}
}
}
评论区