文件读取

一次性读取

go
byteData, err := os.ReadFile("study/23.文件操作/hello.txt")
if err != nil {
fmt.Println(err)
}
fmt.Println(string(byteData))

分片读取

一般用来读二进制文件

go
file, err := os.Open("study/23.文件操作/hello.txt")
if err != nil {
fmt.Println(err)
}
//读完之后关闭协程
defer file.Close()
for {
var byteData = make([]byte, 12)
n, err := file.Read(byteData)
if err == io.EOF {
break
}
fmt.Println(string(byteData), n)
}
go
fmt.Println(string(byteData[:n]))

带缓冲读

按行

go
buf := bufio.NewReader(file)
for {
line, _, err := buf.ReadLine()
if err == io.EOF {
break
}
fmt.Println(string(line))
}
}

按分隔符

go
buf := bufio.NewScanner(file)
//行号
var index int
//指定分割符
buf.Split(bufio.ScanWords)//按照单词
for buf.Scan() {
index++
fmt.Println(index, buf.Text())
}

文件写入

os.OpenFile("文件路径", 打开标志), os.ModePerm)

// 如果文件不存在就创建
os.O_CREATE|os.O_WRONLY
// 追加写
os.O_APPEND|os.O_WRONLY
// 可读可写
os.O_RDWR
go
file, err := os.OpenFile("study/23.文件操作/w.txt", os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
panic(err)
}
defer file.Close()
file.Write([]byte("hello world"))

如果现在一样的方法读会报错

go
file, err := os.OpenFile("study/23.文件操作/w.txt", os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
panic(err)
}
defer file.Close()
//读文件
byteData, err := os.ReadFile(file)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(byteData))

完整的模式

go
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_SYNC int = syscall.O_SYNC // 同步打开
O_TRUNC int = syscall.O_TRUNC // 打开时清空文件
)

文件的权限

主要用于linux系统,在windows下这个参数会被无视,代表文件的模式和权限位,

三个占位符

第一个是文件所有者所拥有的权限

第二个是文件所在组对其拥有的权限

第三个占位符是指其他人对文件拥有的权限

根据UNIX系统的权限模型,文件或目录的权限模式由三个数字表示,分别代表 所有者(Owner) 、组(Group) 和 其他用户(Other) 的权限。每个数字由三个比特位组成,分别代表读、写和执行权限。因此,对于一个mode参数值,它的每一个数字都是一个八进制数字,代表三个比特位的权限组合

go
R:读,Read的缩写,八进制值为 4;
W:写,Write的缩写,八进制值为 2;
X:执行,Execute的缩写,八进制值为 1;
go
0444 表示三者均为只读的权限;
0666 表示三者均为“读写”的权限;
0777 表示三者均为读写执行的权限;
0764 表示所有者有读写执行(7=4+2+1)的权限,组有读写(6=4+2)的权限,其他用户则为只读(4=4);

一次性写入

go
os.WriteFile("study/23.文件操作/w.txt", []byte("你好"), 0666)

这个方法会把之前的内容清空

文件复制

go
srcFile, err := os.Open("study/23.文件操作/hello.txt")
if err != nil {
fmt.Println(err)
return
}
defer srcFile.Close()
wrFile, err := os.OpenFile("study/23.文件操作/w.txt", os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
fmt.Println(err)
return
}
defer wrFile.Close()
io.Copy(wrFile, srcFile)

目录操作

go
dir, err := os.ReadDir("study/23.文件操作")
if err != nil {
fmt.Println(err)
panic(err)
}
for _, v := range dir {
info, _ := v.Info()
fmt.Println(v.Name(), v.IsDir(), info.Size()) //文件名 是否是目录 文件大小
}