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



    前言

    文件的操作在计算机是必不可少的,比如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)
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    在这里插入图片描述

    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)
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    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()
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    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)
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这里插入图片描述

    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)
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在这里插入图片描述

    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: 关闭文件
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这里插入图片描述

    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]))
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这里插入图片描述

    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: 关闭文件
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    在这里插入图片描述

  • 相关阅读:
    Technical Support
    Istio Ambient Mesh 介绍
    23.10.15 《CLR via C#》 笔记6
    Electron中加载百度地图api调用其中方法报错:Uncaught ReferenceError: md5 is not defined
    Java基础——final关键字
    Java、servlet、Tomcat实现文件上传操作
    一文梳理z-index和层叠上下文
    艾美捷试剂级SM-102解决方案
    mysql 使用idb文件恢复数据
    ElasticSearch从入门到精通:基础知识
  • 原文地址:https://blog.csdn.net/aa2528877987/article/details/126312022