golang学习(十七):文件编程

本文详细介绍Go语言中的文件操作,包括文件的打开与关闭、读取与写入、复制及权限控制等核心功能。通过实例演示如何使用不同函数进行高效文件处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、打开文件和关闭文件
//一、打开文件和关闭文件
//使用的函数和方法
//打开文件
//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

 


欢迎大家指正补充,感谢阅读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值