【Go】高级语法学习

1 文件操作

1.1 简介

import "os"
在这里插入图片描述

1.2 常用的操作API
// File代表一个打开的文件对象
type File struct {
   
    // 内含隐藏或非导出字段
}

// 打开文件
func Open(name string) (file *File, err error)

// 关闭文件
func (f *File) Close() error
1.3 读写操作

带缓冲的读取

func readFile()  {
   
	// [1] 打开
	file, err := os.Open("E:\\ShareDir\\Code\\GoCode\\src\\go_code\\proj07_file\\test.txt")
	if err != nil{
   
		fmt.Printf("err:%s\n", err)
	}
	// [end] 延时关闭
	defer file.Close()

	// 创建一个带缓冲的*Read 默认大小:4096
	reader := bufio.NewReader(file)
	// 循环读取
	for{
   
		readString, err := reader.ReadString('\n') // 按换行符读取
		if err == io.EOF{
   
			break // 读取完毕
		}
		// 输出内容
		fmt.Printf("%s", readString)
	}
}

一次性读取

一次将文件内容全部读取到内存中

func readFileInOnece()  {
   
	filePath := "E:\\ShareDir\\Code\\GoCode\\src\\go_code\\proj07_file\\test.txt"

	// func ReadFile(filename string) ([]byte, error)
	file, _ := ioutil.ReadFile(filePath)
	str := string(file)
	fmt.Println(str)
}

创建文件并写内容

在这里插入图片描述

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  // 如果可能,打开时清空文件
)
func writeToFile()  {
   
	filePath := "E:\\ShareDir\\Code\\GoCode\\src\\go_code\\proj07_file\\newtest.txt"
	// 打开创建新文件
	file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0666)
	if err != nil{
   
		fmt.Printf("err:%s\n", err)
	}

	// 延时关闭
	defer file.Close()

	// 循环写入  使用带缓冲的写
	writer := bufio.NewWriter(file)
	for i := 0; i < 5; i++{
   
		writer.WriteString(fmt.Sprintf("xhh[%d]\r\n", i))
		fmt.Println("ok---")
	}
	// 需要将缓存刷入文件
	writer.Flush()
}
1.4 判断文件(夹)是否存在
// Stat返回一个描述name指定的文件对象的FileInfo。
// 如果出错,返回的错误值为*PathError类型。
func Stat(name string) (fi FileInfo, err error)

type FileInfo interface {
   
    Name() string       // 文件的名字(不含扩展名)
    Size() int64        // 普通文件返回值表示其大小;其他文件的返回值含义各系统不同
    Mode() FileMode     // 文件的模式位
    ModTime() time.Time // 文件的修改时间
    IsDir() bool        // 等价于Mode().IsDir()
    Sys() interface{
   }   // 底层数据来源(可以返回nil)
}

在这里插入图片描述

1.5 拷贝文件
  • 文本
func copyFile()  {
   
	var srcPath = "E:\\ShareDir\\Code\\GoCode\\src\\go_code\\proj07_file\\test.txt"

	// find 后缀位置
	var pointIndex = strings.LastIndex(srcPath, ".")
	var newPath = srcPath[:pointIndex] + "backup" + srcPath[pointIndex:]

	fmt.Println(srcPath)
	fmt.Println(newPath)

	// [1] openSrc
	openFile, err := os.OpenFile(srcPath, os.O_RDONLY, 0666)
	if err != nil{
   
		fmt.Println("open err : ", err)
		return
	}
	// 延时关闭
	defer openFile.Close()
	reader := bufio.NewReader(openFile)

	// [2] openDst
	writeFile, err := os.OpenFile(newPath, os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil{
   
		fmt.Println("open err : ", err)
		return
	}
	defer writeFile.Close()
	writer := bufio.NewWriter(writeFile)

	// [3] 循环读写
	for{
   
		// 读取
		readString, err := reader.ReadString('\n')
		if err == io.EOF{
   
			// 读取完毕
			break
		}
		// 写入和刷盘
		_, err = writer.WriteString(readString)
		if err != nil{
   
			fmt.Println("writer err : ", err)
			return
		}

		err = writer.Flush()
		if err != nil{
   
			fmt.Println("writer.Flush() err : ", err)
			return
		}
	}
	fmt.Printf("copy success!\n")
}
  • 图片或者视频
// 从src拷贝n个字节数据到dst,直到在src上到达EOF或发生错误。
// 返回复制的字节数和遇到的第一个错误。
// 对成功的调用,返回值err为nil而非EOF,因为Copy定义为从src读取直到EOF,它不会将读取到EOF视为应报告的错误。
// 如果src实现了WriterTo接口,本函数会调用src.WriteTo(dst)进行拷贝;否则如果dst实现了ReaderFrom接口,本函数会调用dst.ReadFrom(src)进行拷贝。
func Copy(dst Writer, src Reader) (written int64, err error)
func copyImg()  {
   
	var srcPath = "E:\\ShareDir\\Code\\GoCode\\src\\go_code\\proj07_file\\src.jpg"

	// find 后缀位置
	var pointIndex = strings.LastIndex(srcPath, ".")
	var dstPath = srcPath[:pointIndex] + "_bak" + srcPath[pointIndex:]

	// func Copy(dst Writer, src Reader) (written int64, err error)
	// [1] Reader
	readFile, err := os.Open(srcPath)
	if err != nil{
   
		fmt.Println("Open err : ", err)
		return
	}
	defer readFile.Close()
	reader := bufio.NewReader(readFile)

	// [2] Writer
	writeFile, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil{
   
		fmt.Println("OpenFile err : ", err)
		return
	}
	defer writeFile.Close()
	writer := bufio.NewWriter(writeFile)

	// [3] copy
	_, err = io.Copy(writer, reader)
	if err != 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值