Go_文件/目录创建、写入、追加、读取、缓冲区、Stat、IsNotExist、Copy

操作目录

创建目录

  • Mkdir:创建单个目录
  • MkdirAll:创建多级目录
func main() {err := os.Mkdir("/Users/itzhuzhu/Desktop/笔记/英语/a", os.ModePerm)if err != nil {fmt.Println("创建失败", err)} else {fmt.Println("创建成功")}err = os.MkdirAll("/Users/itzhuzhu/Desktop/笔记/英语/a/b/c", os.ModePerm)if err != nil {fmt.Println("创建失败", err)} else {fmt.Println("创建成功")}
}

删除文件或目录

  • Remove:删除文件或空目录
  • RemoveAll:删除文件或目录(包含所有子目录)
func main() {str := "/Users/itzhuzhu/Desktop/NewTest.txt"err := os.Remove(str)if err != nil {fmt.Println("删除失败", err)} else {fmt.Println("删除成功")}str2 := "/Users/itzhuzhu/Desktop/笔记/a"err = os.RemoveAll(str2)if err != nil {fmt.Println("删除失败", err)} else {fmt.Println("删除成功")}
}

Create创建文件:

os.Create:文件不存在则创建,存在则删除文件中的内容

语法:

file:创建文件的指针
err:创建文件出现异常后的信息file, err := os.Create("创建文件存放的路径")

演示:

func main() {file, err := os.Create("/Users/itzhuzhu/Desktop/笔记/test.txt")if err != nil {fmt.Println("创建失败  ", err)} else {fmt.Println("创建成功")}defer file.Close() // 关流(不关流会长时间占用内存)
}

写入数据:

Write写数据:

func main() {file, err := os.Create("/Users/itzhuzhu/Desktop/笔记/test.txt")if err != nil {fmt.Println("创建失败", err)}// 返回值参数1是写的字符长度,参数2是异常信息str := "我是写进去的数据"len, err := file.Write([]byte(str)) //将字符串转换成字节切片if err != nil {fmt.Println("写入失败", err)} else {fmt.Println("写入成功,写入长度为:", len, "字节")}defer file.Close()
}

WriteString写数据:

WriteString底层也是调用的Write,但是Write需要转换字节数组,比较麻烦,WriteString不需要手动转换,比较方便

func main() {file, err := os.Create("/Users/itzhuzhu/Desktop/笔记/test.txt")if err != nil {fmt.Println("创建失败", err)}str := "我是写进去的数据"len, err := file.WriteString(str)if err != nil {fmt.Println("写入失败", err)} else {fmt.Println("写入成功,写入长度为:", len, "字节")}defer file.Close()
}

WriteAt写数据:在指定的位置写入数据

func main() {file, err := os.Create("/Users/itzhuzhu/Desktop/笔记/test.txt")if err != nil {fmt.Println("创建失败", err)}defer file.Close()str := "WriteAt写入的数据"/*参数1:在原数据后要加的空格数参数2:将数据追加到源文件末尾返回值1:返回文件中原数据的长度,如参数1为非0,也会算做源文件长度,是先加上空格再计算的返回值2:错误信息*/num, err := file.Seek(0, io.SeekEnd)fmt.Println("写入数据前的长度为:", num)/*参数1:要写的数据参数2:是要写入数据的开始索引,上面引用了io.SeekEnd可以计算出原数据的长度,然后就可以在原数据基础上追加数据,如果写0会从0索引覆盖原数据返回值1:写入的字符长度返回值2:异常信息*/len, err := file.WriteAt([]byte(str), num)if err != nil {fmt.Println(err)}fmt.Println("写入后的长度为:", len)
}

OpenFile追加数据:

文件里已经有数据的情况下,用上面的三种方式去写,会出现覆盖的效果,WriteAt可以指定索引,但是比较麻烦, os.OpenFile()可以打开已有文件进行操作

OpenFile有三个参数:

  • 参数1:打开文件的路径
  • 参数2:模式,常见的模式有
参数说明
O_RDONLY只读方式打开
O_WRONLY只写方式打开
O_RDWR读写方式打开
O_APPEND追加方式打开
O_CREATE不存在,则创建
O_EXCL如果文件存在,且标定了O_CREATE的话,则产生一个错误
O_TRUNC如果文件存在,且它成功地被打开为只写或读写方式,将其长度裁剪唯一(覆盖)
O_NOCTTY如果文件名代表一个终端设备,则不把该设备设为调用进程的控制设备
O_NONBLOCK如果文件名代表一个FIFO,或一个块设备,字符设备文件,则在以后的文件及I/O操作中置为非阻塞模式
O_SYNC当进行一系列写操作时,每次都要等待上次的I/O操作完成再进行
  • 参数3:表示权限,取值范围(0-7),和linux里操作文件那个权限一样

0:没有任何权限
1:执行权限(如果是可执行文件,是可以运行的)
2:写权限
3:写权限与执行权限
4:读权限
5:读权限与执行权限
6:读权限与写权限
7:读权限,写权限,执行权限

演示:

func main() {file, err := os.OpenFile("/Users/itzhuzhu/Desktop/笔记/test.txt", os.O_APPEND, 6)if err != nil {fmt.Println("打开失败", err)}defer file.Close()len, err := file.WriteString("我追加了吗")if err != nil {fmt.Println("追加失败", err)}fmt.Println("追加后数据的长度为:", len)
}

输出:原因是OpenFile第二个参数只有读和写的权限,还有有一个打开的权限

追加失败 write /Users/itzhuzhu/Desktop/笔记/Golang/Golang延迟调用defer.md: bad file descriptor
追加后数据的长度为: 0

修改后:

func main() {file, err := os.OpenFile("/Users/itzhuzhu/Desktop/笔记/test.txt", os.O_APPEND|os.O_WRONLY, 6)if err != nil {fmt.Println("打开失败", err)}defer file.Close()len, err := file.WriteString("我追加了吗")if err != nil {fmt.Println("追加失败", err)}fmt.Println("追加后数据的长度为:", len)
}

Open读取文件数据:

Open底层调用的是OpenFile方法,但是参数是写死了(只读模式),源码如下

func Open(name string) (*File, error) {return OpenFile(name, O_RDONLY, 0)
}

演示:

func main() {// 追加写数据file, err := os.Open("/Users/itzhuzhu/Desktop/笔记/test.txt")if err != nil {fmt.Println(err)}defer file.Close()// 读数据,定义一个切片存储文件读取的数据buffer := make([]byte, 1024)len, err := file.Read(buffer) // len:读取文件中的数据长度if err != nil {fmt.Println(err)}fmt.Println("读取数据的长度为:", len)//fmt.Println(buffer) // 直接打印都是数字(ascii码值)fmt.Println("内容为:", string(buffer))       // 将类型转换为string,可以展示出内容fmt.Println("内容为:", string(buffer[:len])) //初始化切片的长度是1024,数据没满的时候就会用默认值0代替,可以使用切片截取操作
}

ReadBytes缓冲区读取:

在使用ReadBytes( )函数读取数据时,需要用到缓冲区,所谓缓冲区就是存储数据的区域,也就是先将从文件中读取的数据存储在该区域内,然后在将区域中的数据取出来,写到磁盘上。

提供缓冲区的原因是:

为了缓和 CPU 与 磁盘设备之间速度不匹配矛盾。文件缓冲区是用以暂时存放读写期间的文件数据而在内存区预留的一定空间。

演示:

func main() {// 追加写数据file, err := os.Open("/Users/itzhuzhu/Desktop/filetest/OpenFileTest.txt")if err != nil {fmt.Println(err)}defer file.Close()// 读数据,定义一个切片存储文件读取的数据r := bufio.NewReader(file)for {buf, err := r.ReadBytes('\n')if err == io.EOF { // io.EOF表示读取到文件末尾break}fmt.Println(err)fmt.Println("buf", string(buf))}
}

Stat

查看文件属性

type FileInfo interface {Name() string       // 文件名称Size() int64        // 文件大小(字节)Mode() FileMode     // 权限ModTime() time.Time // 修改时间IsDir() bool        // 是否为目录Sys() any           // 底层数据源,不知道这是干嘛的
}

演示:

func main() {path := "/Users/itzhuzhu/Desktop/笔记/test.txt"stat, _ := os.Stat(path)fmt.Println("文件名称:", stat.Name())fmt.Println("文件大小:", stat.Size(), "字节")fmt.Println("当前权限:", stat.Mode())fmt.Println("修改时间:", stat.ModTime())fmt.Println("是否为目录:", stat.IsDir())fmt.Println("底层数据源:", stat.Sys())
}

IsNotExist

判断文件是否存在

func main() {_, err := os.Stat("/Users/itzhuzhu/Desktop/笔记/test.txt")if os.IsNotExist(err) {fmt.Println("文件不存在")} else {fmt.Println("文件存在")}
}

Copy

func main() {// 打开原数据文件oldFile, err := os.Open("/Users/itzhuzhu/Desktop/笔记/test.txt")if err != nil {fmt.Println("打开源文件失败", err)}defer oldFile.Close()// 打开新文件newFile, err := os.OpenFile("/Users/itzhuzhu/Desktop/笔记/NewTest.txt", os.O_RDWR|os.O_CREATE, 0777)if err != nil {fmt.Println("打开新文件失败", err)}defer newFile.Close()written, err := io.Copy(newFile, oldFile)if err != nil {fmt.Println("复制失败", err)} else {fmt.Println("复制成功,共", written, "字节")}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【bzoj3343】教主的魔法 (分块 + 二分)

传送门(权限题) 题目分析 题意为:给定一个数列,修改和查询两种操作,修改每次给定一个区间,区间的所有元素都加上一个给定值,查询询问一段区间的数权值大于等于给定值的数有多少个。 首先对原序列分块,然后将…

Golang——string字符串常用函数(Contains、join、Index、Repeat、Replace、Split、Trim、Fields)

更多的还是去官方文档里去看:https://studygolang.com/pkgdoc Contains: 判断字符串中是否包含指定字符串 演示: func main() {str1 : "itzhuzhu"result : strings.Contains(str1, "zhu")fmt.Println(result) }join&a…

[flask 优化] 由flask-bootstrap,flask-moment引起的访问速度慢的原因及解决办法

一周时间快速阅读了400页的《javascript基础教程》,理解了主要概念。解决了一个很久之前的疑问。 我的网站是使用flask框架搭建的,介绍flask web的一本著名的书(之前提到过)作者搭建个人博客时,向读者推荐了flask-boot…

Go_关键字、编译、转义字符

关键字: 关键字是指被go语言赋予了特殊含义的单词,共25个,关键字不能用于自定义名字,只能在特定语法结构中使用。 breakdefaultfuncinterfaceselectcasedefergomapstructchanelsegotopackageswitchconstfallthroughifrangetypec…

NFS服务配置

NFS会经常用到,用于在网络上共享存储。举一个例子来说明一下NFS是用来做什么的。假如有三台机器A, B, C,它们需要访问同一个目录,目录中都是图片,传统的做法是把这些图片分别放到A, B, C. 但是使用NFS只需要放到A上,然…

Go_数据类型转换(Sprintf、Format、Append方式转换)

数据类型转换: 类型转换是将一种数据类型的变量转为另一种类型的变量Go强制要求使用显式类型转换。所以语法更能确定语句及表达式的明确含义转换的时候如果大的转给小的,会有精度损失(数据溢出)比如int64转int8 转换格式&#xff…

Mybayis的项目使用的Mapping文件使用总结参考(一)

作者:longgangbai 以前用过ibatis2,但是听说ibatis3有较大的性能提升,而且设计也更合理,他不兼容ibatis2.尽管ibatis3还是beta10的状态,但还是打算直接使用ibatis3.0, ibatis3.0应该更简单高效.最近还自己写了个ibatis3.0与spring集成的bean&…

并发编程概念、程序线程进程、线程同步、互斥量、读写锁、协程并发

多线程: 多线程就是同时执行多个应用程序,需要硬件的支持同时执行:不是某个时间段同时,cpu切换的比较快,所有用户会感觉是在同时运行 并发与并行: 并行(parallel):指在同一时刻,有多…

第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)

本章学习如何启动第一个应用程序 1.在前面的分析中我们了解到,在init进程中内核挂接到根文件系统之后,会开始启动第一个应用程序: kernel_init函数代码如下: static int __init kernel_init(void * unused) //进入init进程 …

Golang并发——并发技术Goroutine和channel的使用、定时器、生产者消费者、条件变量、select

Goroutine: goroutine是Go并行设计的核心。goroutine说到底其实就是协程,它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些goroutine之间的内存共享。执行goroutine只需极少的栈内存(大概是4~5KB)&#x…

Golang——死锁、互斥锁、读写锁的实现

死锁: 什么是锁呢?就是某个协程(线程)在访问某个资源时先锁住,防止其它协程的访问,等访问完毕解锁后其他协程再来加锁进行访问。这和我们生活中加锁使用公共资源相似,例如:公共卫生间…

Oozie协作框架

Oozie协作框架 一:概述 1.大数据协作框架 2.Hadoop的任务调度 3.Oozie的三大功能 Oozie Workflow jobs Oozie Coordinator jobs Oozie Bundle 4.Oozie的架构 控制流节点 起始,分支,并发,汇合,结束 动作节点action 5.O…

11.4 专利法与反不正当竞争法解读

第六条是对于职务作品的一个定性.它这个职务作品、职务发明创造和我们前面著作法所讲到的职务作品的处理方式基本一致.就是如果认定某一个作品它是属于职务作品、职务发明创造,那么这一个作品它的专利权应该是属于单位而不是个人.只有认定这个创造为非职务发明创造的时候,申请的…

一文入门网络编程:常见协议、通信过程、Socket、CS/BS、TCP/UDP

网络编程三要素:ip地址、端口、协议,在网络通信协议下,不同计算机上运行的程序,可以进行数据传输 常见协议: 传输层 常见协议有TCP/UDP协议。应用层 常见的协议有HTTP协议,FTP协议。网络层 常见协议有IP协议…

【Linux笔记(000) 】-- 系统启动过程

索引: 目录索引 一. 启动流程 BIOS --> MBR(Boot Code) --> 引导程序(GRUB) --> 加载内核 --> 执行Init --> runlevel 二. 内容详解 BIOS: Basic Input Output System , 基本输入输出系统 ,负责检查硬件,查找启动设备, 可启动设备在BIOS中定义。…

Mac安装Netcat教程

Netcat可以用于测试通信连接 Mac安装Netcat方式: 打开终端输入: brew install netcat安装好以后测试,输入: nc可以看到是这样的: itzhuzhuitzhuzhudeMacBook-Pro ~ % brew install netcat > Downloading https:…

Golang——TCP、UDP实现并发(服务端与客户端)

Server端常用函数、接口: Listen函数:func Listen(network, address string) (Listener, error)network:选用的协议:TCP、UDP, 如:“tcp”或 “udp”address:IP地址端口号, 如:…

java中 将字符串时间 '2015-9-8 17:05:06' 转化为格式 '2015-09-08 17:05:06'

/** * 将字符串时间2015-9-8 17:05:06转化为格式2015-09-08 17:05:06 */import java.text.SimpleDateFormat; public class TestDate{ public static void main(String[] args) throws Exception{ String time "2015-9-8 17:05:06";//注意:时分秒必须都…

详解TCP协议三次握手四次挥手

三次握手: 三次握手表示建立通信阶段,在TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠,由于这种面向连接的特性, TCP协议可以保证传输数据的安全,…

Visual Paradigm中文乱码

http://blog.csdn.net/microrain/article/details/1201661?_t_t_t0.8160515017611372 转载于:https://www.cnblogs.com/mkxzy/p/7420463.html