GO语言学习之路19

本文详细介绍了Go语言中进行文件操作的各种方法,包括打开、关闭文件,使用bufio进行缓冲读取,使用ioutil一次性读取文件内容,以及如何写入文件和检查文件是否存在。示例代码涵盖了文件读写的基本操作,适用于处理不同大小的文件。
2022/02/10

 //主要讲了文件操作,看看几个包就熟悉了
package main

import (
	"fmt"
	"os"
)

//os.File 封装所有文件相关的操作,File是一个结构体
func main() {

	//1.
	/*
		打开和关闭文件
	*/
	//打开文件
	file, err := os.Open("e:/go.txt")
	if err != nil {
		fmt.Println("打开文件失败", err)
	}
	fmt.Println(file)
	//关闭文件
	file.Close()

	//如果文件存在就打开成功,文件不存在就打开失败



}
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

//os.File 封装所有文件相关的操作,File是一个结构体
func main() {

	//1.
	/*
		打开和关闭文件
	*/
	//打开文件
	file, err := os.Open("e:/go.txt")
	if err != nil {
		fmt.Println("打开文件失败", err)
	}
	fmt.Println(file)
	//defer 在函数运行结束后运行
	defer file.Close()

	/*
		NewReader 带缓冲,不是一次性读取完,读一部分处理一部分
		适合读取文件数据比较大的文件
	*/
	reader := bufio.NewReader(file)
	for { //str是具体的读取的内容, err是读取产生的错误信息
		str, err := reader.ReadString('\n') //读到一个换行就结束一次
		if err == io.EOF {                  //表示读到文件末尾,就结束读取
			return
		}
		fmt.Print(str) //默认会读取换行符
	}

}
package main

import (
	"fmt"
	"io/ioutil"
)

func main() {

	/*
		ReadFile 一次性读取
		适合读取文件数据比较小的文件
		方法内部会自己打开和关闭文件,直接读取即可
		open 和 close 已经被封装在ReadFile内部
	*/
	file := "e:/go.txt"

	content, err := ioutil.ReadFile(file)
	if err != nil {
		fmt.Println("读取失败", err)
		return
	}
	fmt.Println(string(content))
}
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	/*
		写文件操作应用实例
		使用  OpenFile函数
		func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
		//FileMode只有在Linux下面有用
		const (
			O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
			O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
			O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
			O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
			O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
			O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在
			O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
			O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件
		)
	*/

	//1.创建一个新文件,写入内容,五句"hello,world"
	filePath := "e:/go.txt"
	file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
		fmt.Println("打开文件错误")
	}
	defer file.Close() //!!!一定要记得关闭文件
	str := "hello, world\n"
	//写入时,使用带缓存的 *Writer
	writer := bufio.NewWriter(file)
	for i := 0; i < 5; i++ {
		writer.WriteString(str)
	}
	//!!!!!!!重要!!!!!目前只是写入缓存,
	//需要用writer.Flush()写入磁盘文件
	writer.Flush()
	//写文件有多重方式
}
package main

import (
	"fmt"
	"os"
)

/*
	判断文件是否存在
*/

func PathExits(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil { //文件存在
		return true, nil
	}
	if os.IsNotExist(err) { //文件不存在
		return false, nil
	}
	return false, err
}

func main() {
	exits, err := PathExits("e:/go.txt")
	if exits {
		fmt.Println("存在这个文件夹")
	} else {
		fmt.Println("不存在这个文件夹", err)

	}
}
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

//拷贝文件
//func Copy(dst Writer, src Reader) (written int64, err error)

//编写一个函数,接收两个文件路径,to  from
func Copy(to string, from string) (written int64, err error) {
	fromFile, err := os.Open(from)
	if err != nil {
		fmt.Println("打开文件失败")
	}
	defer fromFile.Close()
	//获取from的reader
	reader := bufio.NewReader(fromFile)

	toFile, err := os.OpenFile(to, os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
		fmt.Println("打开文件错误")
	}
	defer toFile.Close()
	writer := bufio.NewWriter(toFile)

	return io.Copy(writer, reader)
}

func main() {
	_, err := Copy("d:/go.txt", "e:/go.txt")
	if err != nil {
		fmt.Println("拷贝错误")
		return
	}
	fmt.Println("拷贝成功")
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值