前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【愚公系列】2022年08月 Go教学课程 039-文件操作

【愚公系列】2022年08月 Go教学课程 039-文件操作

作者头像
愚公搬代码
发布2022-09-21 14:38:03
1570
发布2022-09-21 14:38:03
举报
文章被收录于专栏:历史专栏

文章目录


前言

文件的操作在计算机是必不可少的,比如word、excel、ppt,txt等等在日常办公中都是很常用的。文件的操作主要包含:创建文件、打开文件、读取文件、写入文件、关闭文件、打包/解包、压缩/解压缩、改变文件权限、删除文件、移动文件、重命名文件等。

Go语言官方库:os、io/ioutil、bufio涵盖了文件操作的所有场景。os提供了对文件IO直接调用的方法,bufio提供缓冲区操作文件的方法,io/ioutil也提供对文件IO直接调用的方法。

一、文件操作

1.文件的基础操作

代码语言:javascript
复制
package main

import (
	"log"
	"os"
)

func main() {
	// 创建文件
	f, err := os.Create("test.txt")
	if err != nil {
		log.Fatalf("create file failed err=%s\n", err)
	}
	// 获取文件信息
	fileInfo, err := f.Stat()
	if err != nil {
		log.Fatalf("get file info failed err=%s\n", err)
	}

	log.Printf("File Name is %s\n", fileInfo.Name())
	log.Printf("File Permissions is %s\n", fileInfo.Mode())
	log.Printf("File ModTime is %s\n", fileInfo.ModTime())

	// liunx改变文件权限
	//err = f.Chmod(0777)
	//if err != nil {
	//	log.Fatalf("chmod file failed err=%s\n", err)
	//}

	// 改变拥有者
	//err = f.Chown(os.Getuid(), os.Getgid())
	//if err != nil {
	//	log.Fatalf("chown file failed err=%s\n", err)
	//}

	// 再次获取文件信息 验证改变是否正确
	fileInfo, err = f.Stat()
	if err != nil {
		log.Fatalf("get file info second failed err=%s\n", err)
	}
	log.Printf("File change Permissions is %s\n", fileInfo.Mode())

	// 关闭文件
	err = f.Close()
	if err != nil {
		log.Fatalf("close file failed err=%s\n", err)
	}

	// 删除文件
	err = os.Remove("test.txt")
	if err != nil {
		log.Fatalf("remove file failed err=%s\n", err)
	}
}
在这里插入图片描述
在这里插入图片描述

2.文件的写入的三种方式

2.1 WriteString

代码语言:javascript
复制
package main

import (
	"fmt"
	"os"
)

func main() {
	file, err := os.Create("b.txt")
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()
	// 写入数据
	n, err := file.WriteString("Hello World")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(n)
}
在这里插入图片描述
在这里插入图片描述

2.2 Write

代码语言:javascript
复制
package main

import (
	"fmt"
	"os"
)

func main() {
	file, err := os.Create("c.txt")
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()
	var str string = "Hello World"
	n, err := file.Write([]byte(str)) // 需要将字符串转成字节切片
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(n)
	//file.WriteString()
}
在这里插入图片描述
在这里插入图片描述

2.3 WriteAt

代码语言:javascript
复制
package main

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

func main() {
	file, err := os.Create("d.txt")
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()
	file.WriteString("Hello World")
	var str string = "aaa"
	num, _ := file.Seek(10, io.SeekEnd) // 将光标定位到文件中原有内容的后面,返回文件中原有数据的长度
	fmt.Println("num=", num)
	n, err := file.WriteAt([]byte(str), num) // 第二个参数:表示在指定位置写入数据。
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(n)

}
在这里插入图片描述
在这里插入图片描述

3.文件的打开

OpenFile( )这个函数有三个参数:

  • 第一个参数表示:打开文件的路径
  • 第二个参数表示:模式,常见的模式有 O_RDONLY(只读模式),O_WRONLY(只写模式), O_RDWR(可读可写模式),O_APPEND(追加模式)。
  • 第三个参数表示: 权限,取值范围(0-7)
    • 表示如下:
      • 0:没有任何权限
      • 1:执行权限(如果是可执行文件,是可以运行的)
      • 2:写权限
      • 3: 写权限与执行权限
      • 4:读权限
      • 5: 读权限与执行权限
      • 6: 读权限与写权限
      • 7: 读权限,写权限,执行权限
代码语言:javascript
复制
package main

import (
	"os"
	"fmt"
)

//OpenFile()这个函数有三个参数:
//第一个参数表示:打开文件的路径
//第二个参数表示:模式,常见的模式有
//O_RDONLY(只读模式),O_WRONLY(只写模式), O_RDWR( 可读可写模式),O_APPEND(追加模式)。
//
//第三个参数表示:  权限,取值范围(0-7)
//表示如下:
//0:没有任何权限
//1:执行权限(如果是可执行文件,是可以运行的)
//2: 写权限
//3: 写权限与执行权限
//4: 读权限
//5:  读权限与执行权限
//6:  读权限与写权限
//7:  读权限,写权限,执行权限
func main() {
	file, err := os.OpenFile("c:/Test/c.txt", os.O_APPEND, 6)
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()
	// 通过文件指针向文件中写入数据,读取数据
	n, err := file.WriteString("愚公搬代码")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(n)

}
在这里插入图片描述
在这里插入图片描述

4.文件的读取

代码语言:javascript
复制
package main

import (
	"fmt"
	"os"
)

func main() {
	// 1: 打开要读取的文件
	file, err := os.Open("c.txt") // 注意:OpenFile方法的区别
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()
	// 2: 进行文件内容读取
	// 定义一个字符类型切片,存储从文件中读取的数据
	buffer := make([]byte, 1024*2) // 大小为2kb
	n, err := file.Read(buffer)    // 将从文件中读取的数据保存到字符切片中, n:表示从文件中读取的数据的长度
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(string(buffer[:n]))
	fmt.Println("读取数据的长度:", n)
	// 3: 关闭文件
}
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
package main

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

func main() {
	file, err := os.Open("c.txt")
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()
	buffer := make([]byte, 10)
	for {
		n, err := file.Read(buffer)
		if err == io.EOF { // 表示达到文件末尾了。
			break
		}

		fmt.Print(string(buffer[:n]))
	}

}
在这里插入图片描述
在这里插入图片描述

5.案例

代码语言:javascript
复制
package main

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

//文件拷贝,将已有的文件复制一份,同时重新命名。
func main()  {
  // 1: 打开原有文件(file.txt)
  file1,err:=os.Open("c.txt")
  if err!=nil{
  	fmt.Println(err)
  }
  // 2: 创建一个新的文件
  file2,err:=os.Create("file2.txt")
  if err!=nil{
  	fmt.Println(err)
  }
  defer file1.Close()
  defer  file2.Close()
  // 3: 将原有文件中的内容读取出来,然后写入到新的文件中。
  buffer:=make([]byte,1024*2)
	for  {
		n,err:=file1.Read(buffer)
		if err==io.EOF {
			break
		}
		file2.Write(buffer[:n])
	}

  // 4: 关闭文件
}
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
  • 一、文件操作
    • 1.文件的基础操作
      • 2.文件的写入的三种方式
        • 2.1 WriteString
        • 2.2 Write
        • 2.3 WriteAt
      • 3.文件的打开
        • 4.文件的读取
          • 5.案例
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档