当前位置:网站首页>Go语言学习教程(十三)
Go语言学习教程(十三)
2022-06-30 18:47:00 【小陈工】
一、os包内容介绍
* 使用os包中内容进行操作系统文件或目录
* File结构体表示操作系统文件(夹)
* 操作系统的文件都是有权限控制的,包含可读,可写等,在os包中FileMode表示文件权限,本质是uint32,可取值都以常量形式提供
* FIleInfo是一个interface表示文件的信息
* 在获取系统资源时资源路径分为相对路径和绝对路径
* 相对路径:在Go语言中相对路径用于是GOPATH,也就是项目的根目录
* 绝对路径:磁盘根目录开始表示资源详细路径的描述
* 创建文件夹
/*
如果文件夹已经存在,不报错,保留原文件夹
如果父目录不存在帮助创建
*/
error := os.MkdirAll("D:/godir/a/b", os.ModeDir)
if error != nil {
fmt.Println("文件夹创建失败",error)
return
}
fmt.Println("文件夹创建成功")
* 创建空文件
/*
创建文件时要求文件目录必须已经存在
如果文件已经存在则会创建一个空文件覆盖之前的文件
*/
file, err := os.Create("D:/godir/test.txt")
if err != nil {
fmt.Println("文件创建失败,", err)
return
}
fmt.Println("文件创建成功",file.Name())
* 重命名文件或文件夹
/*
第一个参数:原文件夹名称,要求此路径是必须存在的
第二个参数:新文件夹名称
*/
err := os.Rename("D:/godir", "D:/godir1")
if err != nil {
fmt.Println("重命名文件夹失败,", err)
return
}
fmt.Println("文件夹重命名成功")
/*
重命名文件和重命名文件夹用法相同
*/
err = os.Rename("D:/godir1/test.txt", "D:/godir1/test1.txt")
if err != nil {
fmt.Println("重命名文件失败,", err)
return
}
fmt.Println("文件重命名成功")
* 获取文件(夹)信息
f, err := os.Open("D:/godir1/test1.txt")
defer f.Close() //文件打开后要关闭,释放资源
if err != nil {
fmt.Println("打开文件失败", err)
return
}
fileInfo, err := f.Stat()
if err != nil {
fmt.Println("获取文件信息失败", err)
return
}
fmt.Println(fileInfo.Name()) //文件名
fmt.Println(fileInfo.IsDir()) //是否是文件夹,返回bool,true表示文件夹,false表示文件
fmt.Println(fileInfo.Mode()) //文件权限
fmt.Println(fileInfo.ModTime()) //修改时间
fmt.Println(fileInfo.Size()) //文件大小
* 删除文件或文件夹
/*
只要文件夹存在,删除文件夹.
无论文件夹是否有内容都会删除
如果删除目标是文件,则删除文件
*/
err := os.RemoveAll("D:/godir1/a.txt")
if err != nil {
fmt.Println("删除失败", err)
return
}
fmt.Println("删除成功")
二、输入流
* 流(stream)是应用程序和外部资源进行数据交互的纽带
* 流分为输入流和输出流,输入和输出都是相对于程序,把外部数据传入到程序中叫做输入,反之叫做输出流
* 输入流(Input Stream)和输出流(Output Stream) 就是平时所说的I/O流
* 在Go语言标准库中io包下的Reader接口表示输入流,只要实现这个接口就属于输入流
* 可以使用strings包下的NewReader创建字符串流
r := strings.NewReader("hello 世界")
b := make([]byte, r.Size())//创建字节切片,存放流中数据,根据流数据大小创建切片大小
n, err := r.Read(b)//把流中数据读取到切片中
if err != nil {
fmt.Println("读取失败,", err)
return
}
fmt.Println("读取数据长度,", n)
fmt.Println("流中数据",string(b))//以字符串形式输入切片中数据
* 最常用的是文件流,把外部文件中数据读取到程序中
f, err := os.Open("D:/go.txt")//打开文件
defer f.Close()
if err != nil {
fmt.Println("文件读取失败,", err)
return
}
fileInfo, err := f.Stat()//获取文件信息
if err != nil {
fmt.Println("文件信息获取失败,", err)
return
}
b := make([]byte, fileInfo.Size())//根据文件中数据大小创建切片
_, err = f.Read(b)//读取数据到切片中
if err != nil {
fmt.Println("文件流读取失败:", err)
return
}
fmt.Println("文件中内容为:", string(b))//以字符串形式输入切片中数据
三、输出流
* 输出流就是把程序中数据写出到外部资源
* Go语言标准库中输出流是Writer接口
* 注意:输出流时不要使用os.Open(),因为这种方式获取的文件是只读的
fp := "D:/go.txt"
/*
第三个参数表示文件权限
第 1 位在权限中总是为 0
第 2 位为 0 表示文件不可以被读, 为 1 表示可以被读
第 3 位为 0 表示文件不可以被写, 为 1 表示可以被写
第 4 位为 0 表示文件不可以被执行, 为 1 表示可以被执行
整理如下:
0(0000): 不可读写,不能被执行
1(0001): 不可读写,能被执行
2(0010): 可写不可读,不能被执行
3(0011): 可写不可读,能被执行
4(0100): 可读不可写,不能被执行
5(0101): 可读不可写,能被执行
6(0110): 可读写,不能执行
7(0111): 可读写,可执行
0666:
第一个 0 表示这个数是 八进制
第一个 6 表示文件拥有者有读写权限,但没有执行权限
第二个 6 表示文件拥有者同组用户有读写权限,但没有执行权限
第三个 6 表示其它用户有读写权限,但没有执行权限
*/
//第二个参数表示文件内容追加
//第三个参数表示创建文件时文件权限
f, err := os.OpenFile(fp, os.O_APPEND, 0660)
defer f.Close()
if err != nil {
fmt.Println("文件不存在,创建文件")
f, _ = os.Create(fp)
}
/*
内容中识别特殊字符
\r\n 换行
\t 缩进
*/
// 使用文件对象重写的Writer接口,参数是[]byte
f.Write([]byte("使用Writer接口写数据\r\n"))
// 使用WriteString接口的方法,参数是字符串,使用更方便
f.WriteString("写了\t一段\r\n内容123")
fmt.Println("程序执行结束")
四、ioutil包
* ioutil包下提供了对文件读写的工具函数,通过这些函数快速实现文件的读写操作
* ioutil包下提供的函数比较少,但是都是很方便使用的函数
func NopCloser(r io.Reader) io.ReadCloser
func ReadAll(r io.Reader) ([]byte, error)
func ReadFile(filename string) ([]byte, error)
func WriteFile(filename string, data []byte, perm os.FileMode) error
func ReadDir(dirname string) ([]os.FileInfo, error)
func TempDir(dir, prefix string) (name string, err error)
func TempFile(dir, prefix string) (f *os.File, err error)
* 打开完文件后可以使用ReadAll把文件中所有内容都读取到
f, err := os.Open("D:/go.txt")
defer f.Close()
if err != nil {
fmt.Println(err)
return
}
b, err := ioutil.ReadAll(f)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("文件中内容:\n", string(b))
* 也可以直接读取文件中内容
b, err := ioutil.ReadFile("D:/go.txt")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(b))
* 写文件也很简单,直接使用WriteFile函数即可,但是源码中已经规定此文件只能是可写状态,且不是尾加数据
err := ioutil.WriteFile("D:/abc.txt", []byte("内容123123"), 0666)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("数据写入成功")
* 还提供了快速获取某个文件夹中所有文件信息的函数
fs,_:=ioutil.ReadDir("D:/")
for _,n := range fs {
fmt.Println(n.Name())
}
边栏推荐
- [JetsonNano] [教程] [入门系列] [一] 如何开启VNC共享
- VR全景添加对比功能,让差异化效果展示更直观!
- Temperature measuring instrument based on STM32 single chip microcomputer
- How to open a futures account safely? Which futures companies are more reliable now?
- JVM常见问题
- Pyth-Solana链上联通现实的桥梁
- Four tips tell you how to use SMS to promote business sales?
- 英语没学好到底能不能做coder,别再纠结了先学起来
- ABAQUS 2022最新版——完善的现实仿真解决方案
- 如何使用物联网低代码平台进行服务管理?
猜你喜欢

设计电商秒杀系统

力扣------统计包含给定前缀的字符串

VoIP Push 在海外音视频业务中的应用

Application of VoIP push in overseas audio and video services

SSM整合流程(整合配置、功能模块开发、接口测试)

小小笔记-整型提升(C语言)

将 EMQX Cloud 数据通过公网桥接到 AWS IoT

WordPress 博客使用火山引擎 veImageX 进行静态资源 CDN 加速(免费)

History, selection strategy and in-depth evaluation of note taking software

Makefile笔记(一文学会Makefile)
随机推荐
VR全景拍摄为什么要加盟?巧借资源实现共赢
Safe holidays without holidays, VR traffic makes children travel safely | Guangzhou Sinovel viewpoint
There are three ways to create instances by reflection (2022.6.6-6.12)
Develop those things: how to add text watermarks to videos?
一文详解|Go 分布式链路追踪实现原理
sql连续登录问题
Go language learning tutorial (10)
Gateway服务网关
连接实验室服务器
MQ的选择(2022.5.9-5.15)
MySQL function to get the full path
Promise from recognition to use
Brief introduction of Feature Engineering in machine learning
为什么越来越多的人选择云渲染?
Is it safe to open an account for mobile phone stock trading!?
How to configure webrtc video stream format playback in the new version of easygbs?
MQ selection (2022.5.9-5.15)
哪个券商佣金的佣金最低?另外,手机开户安全么?
虚拟主机什么时候适合更换成云主机?
Understanding of event queue, micro task and macro task and interview questions