GoLang OS包以及File类型详细讲解

 更新时间:2023年03月17日 09:07:01   作者:鲲鹏飞九万里  
go中对文件和目录的操作主要集中在os包中,下面对go中用到的对文件和目录的操作,做一个总结笔记。在go中的文件和目录涉及到两种类型,一个是type File struct,另一个是type Fileinfo interface

一、OS包的作用

os包中的API主要可以帮助我们使用操作系统中的文件系统、权限系统、环境变量、系统进程,以及系统信号。

对于类Unix的操作系统,其中的一切都可以被看作文件。因此可以利用os.File类型操作的东西很多。

本篇文章把os.File 类型应用于常规的文件。

二、os.File类型实现了哪些io包的接口

os.File拥有的都是指针方法,所以除了空接口以外,它本身没有实现任何接口。而它的指针类型则实现了很多io代码包中的接口。

  • *os.File实现了io包中三个最核心的简单接口:io.Readerio.Writerio.Closer
  • *os.File还实现了另外三个简单接口:io.ReaderAtio.Seekerio.WriterAt
  • 由于*os.File实现了上面六个简单接口,所以它顺便实现了io包中9个扩展接口中的7个:io.ReadWriterio.ReadCloserio.ReadSeekerio.ReadWriteCloserio.ReadWriteSeekerio.WriteCloserio.WriteSeeker

由于·*os.File没有实现简单接口io.ByteReaderio.RuneReader,所以它没有实现它没有实现作为它两者的扩展接口:io.ByteScannerio.RuneScanner

所以,os.File可以读写文件,并读取和设定下一次读写的起始索引位置。还可以对文件进行关闭。但是,并不能专门地读取文件的下一个字节,或者写一个Unicode字符,也不能进行任何的读回退操作。

三、创建os.File类型的指针类型

在os包中,有这样几个函数:Create、NewFile、Open和OpenFile。

3.1 os.Create

os.Create函数用于根据指定的路径创建一个新的文件。

使用这个函数创建的文件,对于操作系统中的所有用户来说,都是可以读和写的。

  • 如果在我们给予os.Create函数的路径之上,已经存在一个文件,那么该函数会清空现有文件中的全部内容,然后再把它作为第一个结果值返回;
  • 如果给定的路径的某一级父目录并不存在,该函数就会返回一个*os.PathError类型的错误值,以表示“不存在的文件或目录“。

3.2 os.NewFile

该函数在被调用的时候,需要接受一个代表文件描述符的uintptr类型的值,以及一个用于表示文件名的字符值。

  • 如果给定的文件描述符不是有效的,那么函数将返回nil。否则,它将会返回一个代表了相应文件的File值;

这个函数的功能并不是创建一个新的文件,而是依据一个已经存在的文件描述符,来新建一个包装了该文件的File值。

3.3 os.Open

os.Open函数会打开一个文件并返回包装了该文件的File值。然而,该函数只能以只读模式打开文件。

换句话说,我们只能从该函数返回的File值中读取内容,而不能向它写入任何内容。

如果调用它的任何一个写入方法,都会得到一个表示“坏的文件描述符”的错误值。

os.File类型有一个指针方法Fd,它在被调用之后将会返回一个uintptr 类型的值,这个值就代表了当前的File值所持有的那个文件描述符。

3.4 os.OpenFile

os.OpenFile其实是os.Openos.Create函数的底层支持,它最为灵活。

这个函数有3个参数:

  • name:文件路径;
  • flag:需要施加在文件描述符之上的模式;比如,只读模式(由os.O_RDONLY)。操作模式
  • perm:代表的也是模式,类型是os.FileMode,是一个基于uint32类型的再定义类型。权限模式。

操作模式限定了文件的方式,权限模式控制文件的访问权限。

四、os.File值的操作模式有哪些

针对File值的操作模式主要有:只读模式、只写模式和读写模式。

  • 只读模式:os.O_RDONLY
  • 只写模式:os.O_WRONLY
  • 读写模式:os.O_RDWR

更多的操作模式:

  • os.O_APPEDN :写内容是,追加在现有内容的后面;
  • os.O_CREATE :当给定路径上的文件不存在时,创建一个新文件;
  • os.O_EXCL:需要和os.O_CREATE一同使用,表示给定的路径上不能有存在的文件。
  • os.O_SYNC :在打开文件之上实施同步I/O。它会保证读写的内容总会与硬盘上的数据保持同步。
  • os.O_TRUNC:如果文件已存在,并且是常规的文件,那么就先清空其中已存在的任何内容。

多个操作模式是通过按位操作符|组合起来的。

func Create(name string) (*File, error) {
	return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)
}
func Open(name string) (*File, error) {
	return OpenFile(name, O_RDONLY, 0)
}

五、os.OpenFile的第三个表示模式的参数

os.OpenFile函数的第三个参数perm代表的是权限模式,它的类型是os.FileMode。实际上,os.FileMode能够代表的不仅是权限模式,还可以代表文件模式(也可以称为文件种类)。

os.FileMode是基于uint32类型的再定义类型,包含23个比特位,在这23个比特位,每个比特位都有特定的含义。

  • 如果在最高比特位的二进制数是1,该文件模式就等同于os.ModeDir,也就是说相应的文件是一个目录。
  • 如果在第26位比特位的二进制数是1,该文件模式就等同于os.ModeNamedPipe,也就是说该文件是一个命名管道。

os.FileMode只有最低9个比特位才用于表示文件的权限。

os.FileMode类型的值与os.ModePerm常量(值为0777)做按位与操作,得到的值就表示对应的权限模式。

这9个比特位,3个为一组,共3组。从高到低,分别表示:文件所有者(创建文件的那个用户)、文件所属的用户组、用户对该文件的访问权限。而对于每个组,其中的3个比特位从高到低分别表示:读权限、写权限、执行权限。

某个比特位上是1,表示相应的权限开启,否则,就表示相应的权限关闭。

  • 八进制整数0777就表示:操作系统中的所有用户都对当前的文件有读、写和执行的权限;
  • 而八进制整数0666则表示:所有用户都对当前文件有读和写的权限,但都没有执行的权限。

但要注意,只有在新建文件的时候,这里的第三个参数值才是有效的。在其他情况下,即使我们设置了此参数,也不会对目标文件产生任何的影响。

到此这篇关于GoLang OS包以及File类型详细讲解的文章就介绍到这了,更多相关Go os包的File内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang中包无法引入问题解决

    golang中包无法引入问题解决

    本文主要介绍了golang中包无法引入问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • golang判断两个事件是否存在冲突的方法示例

    golang判断两个事件是否存在冲突的方法示例

    这篇文章主要为大家详细介绍了golang判断两个事件是否存在冲突的方法示例,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • Golang实现JWT身份验证的示例详解

    Golang实现JWT身份验证的示例详解

    JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用间安全地传输声明,本文主要为大家详细介绍了Golang实现JWT身份验证的相关方法,希望对大家有所帮助
    2024-03-03
  • GO语言实现列出目录和遍历目录的方法

    GO语言实现列出目录和遍历目录的方法

    这篇文章主要介绍了GO语言实现列出目录和遍历目录的方法,涉及ioutil.ReadDir()与filepath.Walk()的应用,是非常实用的技巧,需要的朋友可以参考下
    2014-12-12
  • 从零封装Gin框架实现日志初始化及切割归档功能

    从零封装Gin框架实现日志初始化及切割归档功能

    这篇文章主要为大家介绍了从零封装Gin框架实现日志初始化及切割归档功能示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • go for range遍历二维数组的示例

    go for range遍历二维数组的示例

    今天小编就为大家分享一篇关于go for range遍历二维数组的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • 一篇文章搞懂Go语言中的Context

    一篇文章搞懂Go语言中的Context

    这篇文章主要介绍了一篇文章搞懂Go语言中的Context,Context携带一个截止日期、一个取消信号和其他跨越API边界的值。上下文的方法可以被多个gor例程同时调用
    2022-07-07
  • Ruby序列化和持久化存储(Marshal、Pstore)操作方法详解

    Ruby序列化和持久化存储(Marshal、Pstore)操作方法详解

    这篇文章主要介绍了Ruby序列化和持久化存储(Marshal、Pstore)操作方法详解,包括Ruby Marshal序列化,Ruby Pstore存储,需要的朋友可以参考下
    2022-04-04
  • Go语言实现遗传算法的实例代码

    Go语言实现遗传算法的实例代码

    Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文将重点介绍如何用Go语言实现遗传算法。如果你还没有参加过GoLang Tour,我还建议你快速看一下这门语言的介绍
    2017-11-11
  • Go语言实现常见限流算法的示例代码

    Go语言实现常见限流算法的示例代码

    计数器、滑动窗口、漏斗算法、令牌桶算法是我们常见的几个限流算法,本文将依次用Go语言实现这几个限流算法,感兴趣的可以了解一下
    2023-05-05

最新评论