GO语言-文件IO处理1

294 阅读2分钟

文件IO处理

网络IO面向的是网络设备,本地IO面向的是笨的磁盘设备,我们经常看到的屏幕输出其实操作的是终端设备。

文件描述符

文件描述符是一个非常抽象的概念,它是一个描述文件的符号,我们不必去关注它到底是什么,我们只需要知道它的功能是操控文件。操控文件指的是读文件、写文件、调整文件读写位置等功能。

graph TD
.txt文件描述符 --> 读缓冲区/写缓冲区 -->通过设备驱动 -->输出

通过文件描述符,程序可以将数据写入缓冲区,缓冲区的刷新机制会将内容通过设备驱动(不同的设备驱动各异)保存到磁盘,在读取文件时,只需程序逆向,原理相同。

os操作相关API

源码以及相关参数含义

func OpenFile(name string, flag int, perm FileMode) (*File, error) {
   testlog.Open(name)
   f, err := openFileNolog(name, flag, perm)
   if err != nil {
      return nil, err
   }
   f.appendMode = flag&O_APPEND != 0

   return f, nil
}
  • name: 要打开的文件名
  • flag:要打开的文件权限,采取位指示器的方式
  • O_RDONLY:只读,必选项,与只写、读写三选一
  • O_WRONLY:只写
  • O_RDWR:读写
  • O_CREATE:创建文件
  • O_TRUNC:截断文件

perm:8进制文件权限位,与umask共同作用,决定最终文件权限位。

OpenFile返回的结果操作文件

// 读取文件内容到b(b为自建缓冲区)
func (f *File) Read(b []byte) (n int, err error) {
   if err := f.checkValid("read"); err != nil {
      return 0, err
   }
   n, e := f.read(b)
   return n, f.wrapErr("read", e)
}
//将缓冲区b的内容写入文件
func (f *File) Write(b []byte) (n int, err error) {
   if err := f.checkValid("write"); err != nil {
      return 0, err
   }
   n, e := f.write(b)
   if n < 0 {
      n = 0
   }
   if n != len(b) {
      err = io.ErrShortWrite
   }

注:还有函数WriteString它是以另一种形式写入文件,传递的参数为string类型。 Seek函数用来调整读写位置,返回调整的距离和错误信息。

本文正在参加技术专题18期-聊聊Go语言框架