package main
import (
"fmt"
"io"
"os"
)
// 文件读取: file.Read()
func main() {
// 以只读的方式打开文件
// 要打开的文件名可以是相对路径,也可以是绝对路径
file, err := os.Open("D:/code/test_go/07im/07im.md")
if err != nil {
fmt.Println("文件打开失败:", err)
return
}
defer file.Close() // 文件打开了就要记得关闭
fmt.Println(file) // 这里打印的将是文件的内存地址,指针类型
tmpSlice := make([]byte, 128) // 定义一个读取文件的缓冲区,字节类型的切片
var strSlice []byte // 用于存放每次读取到的文件内容,后面用于输出
for {
// 循环读取文件内容
n, e := file.Read(tmpSlice) // n为本次读取的文件字节数,e为Error
// 当Error为EOF表示文件内容读完了,跳出循环
if e == io.EOF {
break
}
if e != nil {
fmt.Println("文件读取出错:", e)
return
}
fmt.Printf("读到的字节数:%v\n", n)
// 这里裁一下切片,是因为最后一次读取文件时,
// 读到的内容长度可能小于缓冲区的大小(上面定义的128字节)
strSlice = append(strSlice, tmpSlice[:n]...)
}
fmt.Println(string(strSlice)) // 输出时需要将字节类型转换为字符串类型
}
package main
import (
"bufio"
"fmt"
"io"
"os"
)
// 文件读取: bufio() 流式读取
func main() {
// 以只读的方式打开文件
// 要打开的文件名可以是相对路径,也可以是绝对路径
file, err := os.Open("D:/code/test_go/07im/07im.md")
if err != nil {
fmt.Println("文件打开失败:", err)
return
}
defer file.Close() // 文件打开了就要记得关闭
reader := bufio.NewReader(file)
var str string
for {
// 循环读取文件内容
line, e := reader.ReadString('\n') // 以换行作为分隔符,表示一次读取一行
// 当Error为EOF表示文件内容读完了,跳出循环
// 与file.Read() 不同的是,当遇到EOF时,也可能有读到的内容,所以还需要记录上
if e == io.EOF {
str += line
break
}
if e != nil {
fmt.Println("文件读取出错:", e)
return
}
str += line
}
fmt.Println(str)
}
直接读取文件全部内容。适合不太大的文件(小于几百MB吧)。不用手动关闭文件。
package main
import (
"fmt"
"os"
)
// 文件读取: ReadFile()
func main() {
// 一次性读取文件全部内容,不用考虑换行和结束符,也不用手动关闭文件
b, err := os.ReadFile("D:/code/test_go/07im/07im.md")
if err != nil {
fmt.Println("文件打开失败:", err)
return
}
fmt.Println(string(b)) // 读到的内容是字节切片,需要转化成字符串输出
}
使用 os.OpenFile() 可以设置所打开文件的模式:只读、只写、读写、追加写 等等,还能在文件不存在时创建文件。
使用 os.OpenFile() 打开的文件需要关闭,就像 os.Open() 一样。
Write() 方法写入的是字节切片,WriteString() 写入的直接就是字符串。
package main
import (
"fmt"
"os"
)
// 文件写入: ReadFile()
func main() {
// 打开指定文件,并设置文件打开的模式及权限
file, err := os.OpenFile("./a.txt", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
if err != nil {
fmt.Println("文件打开失败:", err)
return
}
defer file.Close()
// fmt.Println(file) // 这里将会输出文件的地址指针
str := "今天天气真好\r\n"
file.Write([]byte(str)) // 这个需要传一个字节切片
file.WriteString("你好\r\n哈哈哈\r\n") // 这个可以直接写入字符串
}
注意:写入的内容会先保存到缓冲区,需要使用Flush()才能刷到磁盘上。
package main
import (
"bufio"
"fmt"
"os"
)
// 文件写入: bufio.NewWriter()
func main() {
// 打开指定文件,并设置文件打开的模式及权限
file, err := os.OpenFile("./a.txt", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
if err != nil {
fmt.Println("文件打开失败:", err)
return
}
defer file.Close()
writer := bufio.NewWriter(file)
writer.WriteString("你好。.\r\n") // 先将数据写入缓存
writer.Flush() // 将缓存中的数据写入文件。
}
清空文件内容再写。没有该文件则创建。
package main
import (
"fmt"
"os"
)
// 文件写入: os.WriteFile
func main() {
str := "abc你我他"
// 没有当前文件就会新建,有文件就会清空内容写
err := os.WriteFile("./b.txt", []byte(str), 0666)
if err != nil {
fmt.Println("err:", err)
}
}
package main
import (
"fmt"
"os"
)
// 复制: 全部读再全部写
func main() {
b, e := os.ReadFile("E:/code/new.bak.sql")
if e != nil {
fmt.Println("读取失败:", e)
return
}
if err := os.WriteFile("E:/code/cp.sql", b, 0666); err != nil {
fmt.Println(err)
}
}
package main
import (
"fmt"
"io"
"os"
)
// 复制: 流式复制,边读边写
func main() {
// 以只读的方式打开旧文件
file, e := os.Open("E:/code/cp.sql")
if e != nil {
fmt.Println("文件打开失败:", e)
return
}
defer file.Close()
// 打开|创建一个新文件,采用只写、不存在则创建模式
file2, e2 := os.OpenFile("E:/code/cp3.sql", os.O_CREATE|os.O_WRONLY, 0666)
if e2 != nil {
fmt.Println("创建新文件失败:", e2)
return
}
tmpSlice := make([]byte, 4096) // 在复制大文件时,缓冲区的大小将直接影响复制速度
for {
n, ee := file.Read(tmpSlice) // 循环将文件内容读取到缓冲区
if ee == io.EOF {
break
}
if ee != nil {
fmt.Println("文件读取失败:", ee)
return
}
// 然后再将缓冲区内容写入到新文件内
if _, err := file2.Write(tmpSlice[:n]); err != nil {
fmt.Println("复制出错:", err)
}
}
}
package main
import (
"fmt"
"os"
)
// 重命名
func main() {
err := os.Rename("D:/定时.txt", "D:/code/定时.txt")
fmt.Println(err)
}
package main
import (
"fmt"
"os"
)
// 创建目录
func main() {
// 创建一层目录,如果目录已经存在则会报错
err := os.Mkdir("D:/abd", 0666)
fmt.Println(err)
// 递归创建多层目录,如果目录已经存在,也不报错
e2 := os.MkdirAll("D:/ab/cd/ef", 0666)
fmt.Println(e2)
}
使用 os.Remove() 可以删除存在的一个文件或者空文件夹。
使用 os.RemoveAll() 可以删除文件或者递归的删除文件夹。
package main
import (
"fmt"
"os"
)
// 删除文件及目录
func main() {
// 当删除的文件不存在时,会报错
err := os.Remove("D:/ab.txt")
fmt.Println(err)
// 当删除的文件夹不存在或者不为空时,会报错
err2 := os.Remove("D:/ab/cd")
fmt.Println(err2)
// 当删除的文件不存在时,不报错
err3 := os.RemoveAll("D:/11.txt")
fmt.Println(err3)
// 当删除的文件夹不存在或者不为空时,不报错
err4 := os.RemoveAll("D:/12/34")
fmt.Println(err4)
}