本人从事Go语言开发多年,目前主要从事云计算相关开发。
写本公众号的目的主要是对自己的过往知识进行梳理,也希望可以帮助大家学习~
后续会推出Go语言源码学习系列和web开发系列等,欢迎大家关注。
由于在计算机中文件非常多,为了便于管理,所以出现了目录,因此,我们在介绍文件操作时,必定会涉及到目录的操作;除此之外,对于一些特殊的文件格式的内容处理,我们也做一定程度的介绍,比如json文件
思维逻辑图如下:
下面我们从以上三个方面对 文件操作 进行相应的介绍
对于目录操作,一般来说,我们肯定想知道目录下面有什么文件?怎么改一下目录名字
?还希望创建一个新的目录,或者删除目录
查
可以看出,ReadDir通过调用操作系统标准库os包的open函数打开指定的目录,然后对查询的内容通过一定的顺序显示出来。ReadDir的返回值为:FileInfo,我们可以看一下FileInfo是如何定义的
由上图可知,在源码中FileInfo是一个接口,该接口描述了文件的一些信息:比如名字,大小,模式,修改时间,是否是文件夹,数据源信息等相关内容
此时,再回过头来看我们的程序打印结果,发现我们并不能像在windows界面打开的目录一样显示是文件夹还是文件,那么怎么做呢?相信大家已经知道怎么做了,正如我们打印名字一样,可以通过接口提供的方法进行判断。如下:
结果如下:
改
下面我们通过示例介绍如何修改文件夹的目录,我们将上面的plugins目录名修改为516test
再次遍历,结果如下:
增
增是指我们新创建目录,我们在D:\Software\516test下分别创建一级目录test和多级目录test00\516\16,示例如下:
结果如下:
分析:上例中0777是什么意思呢?在linux文件中,文件是有权限的,分为:读,写和执行,字母表示为:r,w,x,而它们用数字表示分别为:4,2,1;同时,文件的权限又是相对于文件的所属者、所属组以及其他组的来讲的。所以0777代表该文件对于所属者、所属组以及其他组的权限均为:可读可写可执行。其中0代表八进制
删
结果如下:
分析:Remove函数只能删除空目录,否则会报”The directory is not empty “错误,要想删除有子目录或者有其他内容的目录需要使用RemoveAll函数
结果如下:
我们可以顺便看一下Create的源码
分析:由源码可知,Create函数创建文件时如果文件已存在并不会报错,而是将文件清空。我们继续看一下OpenFile函数
分析:就像标准库注释掉的内容所说明的,我们主要使用它的9bit表示所属者、所属组以及其他组。这里OpenFile用的是默认0666
分析:ReaderAt示例中我们将byte数组的长度改为100(小于176),是因为ReaderAt接口当读取数据的实际长度小于byte数组的长度时,会一直报错。也就是说,ReaderAt接口读取的数据的长度必须等于byte数组的长度
关于json的详细内容,大家可以通过官网或者类似的网站进行针对性的学习。我们这里只需简单的知道:json是一种数据交换格式,由于其良好的特性在编程中得到了广泛的应用。json文件的操作主要涉及两个方面:一个是将数据转换为json格式,可以称之为编码的过程,另外一个是将json格式的数据转换为目标格式,可以称之为解码的过程。
将数据编码成json格式,使用Marshal函数,由标准库encoding/json提供
Marshal的输入是一个接口类型,输出为转换后的字节数组和可能遇到的错误。我们以结构体为例
结果如下:
我们用工具将格式调整一下
分析:如上所示,我们就将一个结构体数据编码为json格式,在本例中定义Student结构体时后面新增的`json:" "`是对结构体的编码进行控制,我们可以将结构体的字段转换为json里的其他的名字或者不同的大小写方式
将json格式的数据转换为目标格式,使用encoding/json包的Unmarshal函数
结果如下:
到此关于Golang文件操作相关内容的分享就结束了~
此篇为Go语言基础系列分享第十一篇,欢迎大家关注本公众号《Go开发与计算机技术》,Go语言基础系列学习不迷路。