Golang 学习笔记10-文件操作

文件读取

一次性读取

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

分片读取

一般用来读二进制文件

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)
}
fmt.Println(string(byteData[:n]))

带缓冲读

按行

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

按分隔符

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
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"))

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

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))

完整的模式

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参数值,它的每一个数字都是一个八进制数字,代表三个比特位的权限组合

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

一次性写入

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

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

文件复制

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)

目录操作

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()) //文件名 是否是目录 文件大小
}