李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
GO
正文
29.Golang写入文件
Leefs
2022-07-24 PM
3717℃
0条
[TOC] ### 前言  ### 一、写入文件操作 #### 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
工具
35
其它
25
GO
48
NLP
8
标签云
Kafka
算法
Filter
Quartz
Java编程思想
Java工具类
Hbase
Elasticsearch
gorm
Spark Core
链表
Hive
高并发
Golang基础
锁
栈
Yarn
BurpSuite
国产数据库改造
MyBatisX
二叉树
Tomcat
Shiro
Thymeleaf
数据结构
正则表达式
Http
JavaScript
数学
SQL练习题
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞