李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
GO
正文
29.Golang写入文件
Leefs
2022-07-24 PM
2853℃
0条
[TOC] ### 前言 ![29.Golang写入文件01.png](https://lilinchao.com/usr/uploads/2022/07/1483075597.png) ### 一、写入文件操作 #### 1.1 os.OpenFile()函数 + **语法** ``` func OpenFile(name string, flag int, perm uint32) (file *File, err Error) ``` **参数** + **name**:要文件路径+文件名; + **flag**:打开文件的模式,只读、读写等; + **perm**:文件权限,一个八进制数。r(读)04,W(写)02,x(执行)01。 `os.OpenFile()`函数能够以指定模式打开文件,从而实现文件写入相关功能。 + **模式flag种类** | 模式 | 含义 | | ----------- | ----------------------- | | os.O_WRONLY | 只写 | | os.O_CREATE | 如果不存在文件,创建文件 | | os.O_RDONLY | 只读 | | os.O_RDWR | 可读可写 | | os.O_TRUNC | 打开时清空文件原先内容 | | os.O_APPEND | 追加 | 若同时想用多种可用`|`拼接不同模式。 + **文件权限perm** 使用`4位8进制数`来表示三种类型用户的权限,首位取0,形式即`0XXX`。 + 第一个X表示的是**文件所有者**的权限; + 第二个X表示的是**组用户**的权限; + 第三个X表示的是**其他用户**的权限。 每位数字所代表的权限:`读r=4,写w=2,可执行x=1` | 数字 | r | w | x | 权限 | | ---- | ---- | ---- | ---- | ------------------ | | 0 | - | - | - | 所有权限均无 | | 1 | - | - | x | 可执行 | | 2 | - | w | - | 可写 | | 3 | - | w | x | 可写,可执行 | | 4 | r | - | - | 可读 | | 5 | r | - | x | 可读,可执行 | | 6 | r | w | - | 可读,可写 | | 7 | r | w | x | 可读,可写,可执行 | 常使用的`0644`(`-rw-r--r--`),表示文件所有者可读写,同组用户及其他用户只可读。 #### 1.2 Write和WriteString 方式写入 + **Write语法** ```go func (file *File) Write(b []byte) (n int, err Error) ``` **参数** + **file**:文件对象 + **b**:要写入的文件内容 **返回值** + **n**: 成功写入的字节数 + **err**:写入失败,则返回错误信息 使用 Write 方法写文件,接受的 **参数** 是一个要写入的文件内容的 **字节** 数组。如果写入成功,返回成功写入的字节数,如果写入失败,返回 **error** 信息。 **WriteString语法** ```go func (f *File) WriteString(s string) (n int, err error) ``` **参数** + **f**:文件对象 + **s**:要写入的文件内容 **返回值** + **n**:成功写入的字节数 + **err**:写入失败,则返回错误信息 使用 WriteString 方法写文件,接受的参数是一个要写入的文件内容的 **字符串**。如果写入成功,返回成功写入的字节数,如果写入失败,返回 error 信息。 **示例** ```go package main import ( "fmt" "os" ) //创建并写入数据 //Write 和 WriteString func main() { //os.O_CREATE|os.O_RDWR:如果不存在文件,创建文件,可读可写 //0666对应:-rw-rw-rw- file, err := os.OpenFile("D:/bb.txt", os.O_CREATE|os.O_RDWR, 0666) if err != nil { fmt.Println("open file failed,err:",err) return } defer file.Close() str := "Hello Golang\r\n" file.Write([]byte(str)) //写入字节切片数据 file.WriteString("直接写入的字符串数据") //直接写入字符串数据 } ``` #### 1.3 bufio.NewWriter + **语法** - **创建writer实例** ```go func NewWriter(w io.Writer) *Writer ``` + **将信息写入缓存** ```go func (b *Writer) WriteString(s string) (int, error) ``` + **将缓冲写入文件** ```go func (b *Writer) Flush() error ``` 将要写入的内容写入缓存中,在执行flush的时候才会被写到磁盘。 **示例** ```go package main import ( "bufio" "fmt" "os" ) //bufio.NewWriter func main() { //1、打开文件 file,err := os.OpenFile("D:/cc.txt",os.O_CREATE|os.O_TRUNC|os.O_WRONLY,0666) if err != nil { fmt.Println("open file failed,err:",err) return } //5、关闭文件流 defer file.Close() //2、创建writer对象 writer := bufio.NewWriter(file) for i := 0; i < 10; i++ { writer.WriteString("Hello Golang\r\n") //3、将数据先写入缓存 } writer.Flush() //4、将缓存中的内容写入文件 } ``` #### 1.4 ioutil.WriteFile + **语法** ```go func WriteFile(filename string, data []byte, perm os.FileMode) error ``` **参数** + **filename**:文件路径+文件名称 + **data**:要写入的文件内容 + **perm**:文件权限 **返回值** + **err**:写入失败,则返回错误信息 使用 WriteFile 方法写文件,接受的第一个 **参数** 是一个 **string 类型** 的文件名,第二个参数是一个要写入的文件内容的 **byte** 数组,最后一个参数是文件的权限。如果写入成功,返回空的 **error** 信息,如果写入失败,返回 error 信息。 **示例** ```go package main import ( "fmt" "io/ioutil" ) //ioutil.WriteFile func main() { str := "Hello Golang" err := ioutil.WriteFile("D:/dd.txt", []byte(str), 0666) if err != nil { fmt.Println("write file failed,err:",err) return } } ``` ### 二、复制文件 #### 2.1 通过ioutil进行复制 ```go package main import ( "fmt" "io/ioutil" ) //复制文件 //ioutil 进行复制 //编写一个函数,接收两个文件路径 srcFileName dstFileName func CopyFile(srcFileName string,dstFileName string)(err error){ input, err := ioutil.ReadFile(srcFileName) if err != nil { fmt.Println(err) return err } err = ioutil.WriteFile(dstFileName, input, 0644) if err != nil { fmt.Println("Error creating",dstFileName) fmt.Println(err) return err } return nil } func main() { srcFile := "D:/aa.zip" dstFile := "D:/bb.zip" err := CopyFile(srcFile, dstFile) if err == nil { fmt.Printf("拷贝完成\n") }else { fmt.Printf("拷贝错误 err=%v\n",err) } } ``` #### 2.2 以文件流的方式复制文件 ```go package main import ( "fmt" "io" "os" ) //复制数据 func CopyFile(srcFileName string,dstFileName string)(err error){ source, _ := os.Open(srcFileName) destination, _ := os.OpenFile(dstFileName, os.O_CREATE|os.O_WRONLY, 0666) buf := make([]byte, 128) for { n, err := source.Read(buf) if err != nil && err != io.EOF { return err } if n == 0 { break } if _,err := destination.Write(buf[:n]); err != nil { return err } } return nil } func main() { srcFile := "D:/aa.zip" dstFile := "D:/bb.zip" err := CopyFile(srcFile, dstFile) if err == nil { fmt.Printf("拷贝完成\n") }else { fmt.Printf("拷贝错误 err=%v\n",err) } } ``` ### 三、其他操作 ```go package main import ( "fmt" "os" ) func main() { //文件重命名 err01 := os.Rename("D:/aa.txt","D:/ee.txt") //只能同盘操作 if err01 != nil { fmt.Println(err01) } //创建目录 err02 := os.Mkdir("D:/aa", 0666) if err02 != nil { fmt.Println(err02) } //一次创建多个目录 err03 := os.MkdirAll("D:/aa/bb/cc",0666) //创建多级目录 if err03 != nil { fmt.Println(err03) } //删除目录和文件 err04 := os.Remove("D:/ee.txt") if err04 != nil { fmt.Println(err04) } //一次删除多个目录或者文件 err05 := os.RemoveAll("D:/aa") if err05 != nil { fmt.Println(err05) } } ``` *附参考文章链接* *https://blog.csdn.net/lena7/article/details/120121503*
标签:
Golang基础
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2265.html
上一篇
28.Golang读取文件
下一篇
30.Golang之错误和异常处理
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
nginx
数学
JavaWEB项目搭建
Yarn
Linux
容器深入研究
DataWarehouse
MyBatis
JavaSE
CentOS
Beego
DataX
LeetCode刷题
JavaScript
队列
Kafka
Typora
Livy
查找
Elasticsearch
Tomcat
Zookeeper
RSA加解密
SpringCloud
栈
微服务
BurpSuite
正则表达式
Java
机器学习
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞