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

举报
愚公搬代码 发表于 2022/08/31 21:23:45 2022/08/31
【摘要】 前言文件的操作在计算机是必不可少的,比如word、excel、ppt,txt等等在日常办公中都是很常用的。文件的操作主要包含:创建文件、打开文件、读取文件、写入文件、关闭文件、打包/解包、压缩/解压缩、改变文件权限、删除文件、移动文件、重命名文件等。Go语言官方库:os、io/ioutil、bufio涵盖了文件操作的所有场景。os提供了对文件IO直接调用的方法,bufio提供缓冲区操作文件...

前言

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

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

一、文件操作

1.文件的基础操作

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

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

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

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: 读权限,写权限,执行权限
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.文件的读取

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: 关闭文件
}

在这里插入图片描述

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.案例

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: 关闭文件
}

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。