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


