一、打开文件和关闭文件
//一、打开文件和关闭文件
//使用的函数和方法
//打开文件
//func Open(name string) (file *File, err error)
//关闭文件
//func (f *File) Close() error
package main
import (
"fmt"
"os"
)
func main() {
//file的叫法
//file叫file对象
//file叫file指针
//file叫文件句柄
//打开c:/test.txt
file, err := os.Open("c:/test.txt")
if err != nil {
fmt.Println("open file err=", err)
}
//输出文件,可以看出file是一个指针*File
fmt.Printf("file=%v", file)
//关闭文件
err = file.Close()
if err != nil {
fmt.Println("close file err=", err)
}
}
运行如下:
二、读文件操作
//二、读文件操作(适用于文件较大)
//读取文件的内容并且显示在终端(带缓冲区方式),使用os.Open,file.Close,bufio.NewReader(),reader.ReadString函数和方法
//代码实现
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
//打开文件
file, err := os.Open("c:/test.txt")
if err!= nil {
fmt.Printf("open file err=%v",err)
}
//注意:当函数退出时,要及时关闭file,否则有内存泄露
defer file.Close()
//创建一个 *Reader , 带缓冲区的
reader := bufio.NewReader(file)
//循环读取文件的内容
for {
str, err := reader.ReadString('\n') //读到换行就结束
if err == io.EOF{ //io.EOF表示文件的末尾
break
}
//输出内容
fmt.Print(str)
}
fmt.Println("文件读取结束")
}
运行代码如下:
三、另外,还有一种方法适用于读取文件并不大的情况。
//三、读文件操作(适用于文件不大的情况)
//相关方法和函数(ioutil.ReadFile)
package main
import (
"fmt"
"io/ioutil"
)
func main() {
//使用ioutil.ReadFile一次性将文件读取到位
file := "c:/test.txt"
content, err := ioutil.ReadFile(file)
if err != nil {
fmt.Printf("read file err=%v", err)
}
//把读取到的内容显示到终端
fmt.Printf("%v",string(content)) //[]byte
}
运行结果如下:
四、写文件操作
//四、写文件操作
//func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
//第二个参数:文件打开模式(可以组合)
//第三个参数:权限控制
//创建一个新文件,写入5句 "hello,world!"
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
//创建一个新文件,写入5句 "hello,world!"
//打开文件 "c:/test.txt"
filepath := "c:/test.txt"
file, err := os.OpenFile(filepath, os.O_WRONLY | os.O_CREATE, 0666)
if err != nil {
fmt.Printf("open file err= %v\n", err)
return
}
//及时关闭file
defer file.Close()
//准备写入5句"hello,world!"
str := "hello,world!\r\n"
//使用带缓存的*Writer
writer := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
writer.WriteString(str)
}
//因为writer是带缓存,因此在调用WriterString方法时,内容是先写到缓存的,所以需要
//调用Flush方法,将缓存的数据真正写到文件中
writer.Flush()
}
运行成功后打开
"c:/test.txt"
可以看到里面的内容如下:
五、打开一个存在的文件,将原来的内容覆盖成成5句 "晚上好!"
//五、打开一个存在的文件,将原来的内容覆盖成成5句 "晚上好!"
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
//五、打开一个存在的文件,将原来的内容覆盖成5句 "晚上好!"
//打开已经存在的文件 "c:/test.txt"
filepath := "c:/test.txt"
file, err := os.OpenFile(filepath, os.O_WRONLY | os.O_TRUNC, 0666)
if err != nil {
fmt.Printf("open file err= %v\n", err)
return
}
//及时关闭file
defer file.Close()
//准备写入5句 "晚上好!"
str := "晚上好!\r\n"
//使用带缓存的*Writer
writer := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
writer.WriteString(str)
}
writer.Flush()
}
运行成功后打开
"c:/test.txt"
可以看到里面的内容如下:
六、打开一个存在的文件,在原来的内容追加 "study golang!"
//六、打开一个存在的文件,在原来的内容追加 "study golang!"
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
//六、打开一个存在的文件,在原来的内容追加 "study golang!"
//打开已经存在的文件 "c:/test.txt"
filepath := "c:/test.txt"
file, err := os.OpenFile(filepath, os.O_WRONLY | os.O_APPEND, 0666)
if err != nil {
fmt.Printf("open file err= %v\n", err)
return
}
//及时关闭file
defer file.Close()
//准备追加 "study golang!"
str := "study golang!\r\n"
//使用带缓存的*Writer
writer := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
writer.WriteString(str)
}
writer.Flush()
}
运行成功后打开
"c:/test.txt"
可以看到里面的内容如下:
七、将一个文件的内容写入到另外一个文件(这两个文件已经存在了)
//七、将一个文件的内容写入到另外一个文件(这两个文件已经存在了)
//使用ioutil.ReadFile/ioutil.WriteFile
package main
import (
"fmt"
"io/ioutil"
)
func main() {
//将"c:/test.txt" 文件导入到"c:/test2.txt"
file1path := "c:/test.txt"
file2path := "c:/test2.txt"
data, err := ioutil.ReadFile(file1path)
if err != nil {
fmt.Printf("read file err=%v\n",err)
return
}
err = ioutil.WriteFile(file2path, data, 0666)
if err != nil {
fmt.Printf("write file err=%v\n", err)
}
}
运行成功后打开
"c:/test2.txt"
可以看到里面的内容如下:
八、将一张图片/电影/MP3拷贝到另外一个文件 这里将图片 "c:/test.jpg" 拷贝到 "c:/test2.jpg"
//八、将一张图片/电影/MP3拷贝到另外一个文件 "c:/test2.jpg"
//func Copy(dst Writer, src Reader)(written int64, err error)
//Copy函数是 io 包提供
package main
import (
"bufio"
"fmt"
"io"
"os"
)
//编写一个函数,接收两个文件路径
func CopyFile(dstFileName string, srcFileName string)(written int64, err error) {
srcFile, err := os.Open(srcFileName)
if err != nil {
fmt.Printf("open file err=%v",err)
}
defer srcFile.Close()
//通过srcfile, 获取到Reader
reader := bufio.NewReader(srcFile)
//打开dstFileName
dstFile, err := os.OpenFile(dstFileName,os.O_WRONLY | os.O_CREATE, 0666)
if err != nil {
fmt.Printf("open file err=%v\n",err)
return
}
//通过dstFile, 获取到Writer
writer := bufio.NewWriter(dstFile)
defer dstFile.Close()
return io.Copy(writer, reader)
}
func main() {
//将文件"c:/test.jpg" 拷贝到 "c:/test2.jpg"
//调用CopyFile完成拷贝
srcFile := "c:/test.jpg"
dstFile := "c:/test2.jpg"
_, err := CopyFile(dstFile, srcFile)
if err == nil {
fmt.Printf("拷贝完成\n")
}else {
fmt.Printf("拷贝错误 err=%v\n", err)
}
}
运行成功后可以看到
已经成功拷贝 test.jpg
参考:http://www.atguigu.com/qklsp.shtml
欢迎大家指正补充,感谢阅读。