当前位置:网站首页>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())
}
边栏推荐
猜你喜欢

sql连续登录问题

20220607 fell below the recommended retail price, and the GPU market is moving towards oversupply

Abaqus 2022软件安装包和安装教程

The project is configured with eslint. When the editor does not close the eslint function, the eslint does not take effect

连接实验室服务器

Four tips tell you how to use SMS to promote business sales?

BeanUtils.copyProperties() 对比 mapstruct

科大讯飞活跃竞赛汇总!(12个)

程序员女友给我做了一个疲劳驾驶检测

Year after year, why is breaking the data island still the primary task of enterprise development
随机推荐
Force deduction ----- count the string containing the given prefix
MQ selection (2022.5.9-5.15)
[multithreading] use the thread pool to implement a simple thread pool
MySQL recursion
Browser window switch activation event visibilitychange
配置服务器环境
Entropy - conditional entropy - joint entropy - mutual information - cross entropy
ros advertise 发布数据小技巧--latch配置
20220528 [talk about fake chips] those who are greedy for cheap often suffer heavy losses. Take stock of those fake memory cards and solid state drives
The project is configured with eslint. When the editor does not close the eslint function, the eslint does not take effect
LinkedList的简单用法(2022.6.13-6.19)
VoIP Push 在海外音视频业务中的应用
嵌入式软件开发新趋势:DevOps
如何利用 xUnit 框架对测试用例进行维护?
Cobbler is easy to use
ROS advertisement data publishing tips - latch configuration
连接实验室服务器
Business Intelligence BI and business management decision-making thinking 4: business cost analysis
Makefile笔记(一文学会Makefile)
Gateway服务网关