Loading

golang文件和目录操作

读取文件

通过Read方法读取
import (
	"fmt"
	"os"
)

func main() {
	/*
		打开文件
	*/

	// 以只读的方式打开文件,返回一个文件指针类型的对象和error
	file, err := os.Open("./test.txt")
	// 文件打开操作完之后必须关闭文件流,可以使用defer 延迟关闭
	defer file.Close()

	// err 非nil,说明有错误
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(file) // &{0xc00006a180}

	/*
		读取文件
	*/
  
	// 通过Read方法读取
	// Read参数是一个字节切片,该切片用于接收读取文件的字节
  // 定义接收读取到的文件字节的切片
	var tempSlice = make([]byte, 128) // 128容量表示每次读取多少字节
  
  // 有容量的切片接收字节,可能无法接收全部内容,再定义一个切片,通过循环存储每次读取的内容
	var strSlice []byte
	for {
		// 返回两个参数,第一个是读取到的字节数量,第二个是error
		n, err := file.Read(tempSlice)

		// 由于是一个死循环,当文件读取完毕没有内容读取了,会抛出一个io.EOF错误
		if err == io.EOF {
			fmt.Println("读取完毕")
			break
		}

		if err != nil {
			fmt.Println("读取失败")
			return
		}
		fmt.Printf("读取到了%v字节\n", n)
	   // 把每次读取到的内容追加到strSlice中,每次读取128个字节,可能最后的时候不够128字节,会出现空字节的问题
		// n是每次读取到的字节数,通过[:n]切片获取每次读取成功的字节追加
		strSlice = append(strSlice, tempSlice[:n]...)
	}

	fmt.Println(string(tempSlice)) // 读取到的文件内容,通过string把字节切片转换成文本
  
  

通过bufio读取文件

bufio 是在 file 的基础上封装了一层 API,支持更多的功能

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

func main() {
	/*
		打开文件
	*/

	// 以只读的方式打开文件,返回一个文件指针类型的对象和error
	file, err := os.Open("./test.txt")
	// 文件打开操作完之后必须关闭文件流,可以使用defer 延迟关闭
	defer file.Close()

	// err 非nil,说明有错误
	if err != nil {
		fmt.Println(err)
		return
	}

	// 创建读取对象
	reader := bufio.NewReader(file)

	// 通过for循环读取全部内容
	var allStr string
	for {
		// 通过reader.ReadString读取文件,参数是一个字节类型的分割符,\n表示每次读取一行
		// 返回的是读取到的字符串和err
		str, err := reader.ReadString('\n')

		if err == io.EOF {
			// 标记结束后,可能最后还会有返回值没有拼接上,所以再结束时再拼接一次,,Read不会有该问题
			allStr += str
			fmt.Println("读取完毕")
			break
		}
		if err != nil {
			fmt.Println(err)
			return
		}

		allStr += str

	}
	fmt.Println(allStr)

}

ioutil读取全部文件
// Go 1.16 开始会废弃 io/ioutil 包

import (
	"fmt"
	"io/ioutil"
)

func main() {

	// 读取整个文件,一行一行读取
	// 返回一个字节切片和err
	byteStr, err := ioutil.ReadFile("./test.txt")
	if err != nil {
		return
	}
	fmt.Println(string(byteStr))

}
io.ReadAll读取全部文件

ioutil新版本已废弃,可以使用io.ReadAll代替

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

func main() {

	file, err := os.Open("./test.txt")
	defer file.Close()

	byteStr, err := io.ReadAll(file)
	if err != nil {
		return
	}
	fmt.Println(string(byteStr))

}
 

写入文件

指定模式打开文件

os.Open()以只读的模式打开文件,无法写入文件,可以使用os.OpenFile()以指定模式打开文件

os.OpenFile()接收三个参数:

  1. Name:文件名

  2. falg:打开文件的模式

    • os.O_WRONLY 只写

    • os.O_CREATE 创建文件

    • os.O_RDONLY 只读

    • os.O_RDWR 读写

    • os.O_TRUNC 清空

    • os.O_APPEND 追加

  3. perm:文件权限,一个八进制数。(读)04,(写)02,(执行)01,可以直接用0666、0766表示全部权限

  • image-20240225211025701
func main() {

	// 在./路径下创建test.txt文件、写入、每次打开文件清空之前内容
	file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
	defer file.Close()
	fmt.Println(file)
	fmt.Println(err)
	if err != nil {
		return
	}
	
Write WriteString 写入文件

wtite写入字节类型的切片,WriteString写入字符串

import (
	"fmt"
	"os"
)

func main() {

	// 每次在./路径下创建test.txt文件、写入模式、每次打开文件清空之前内容
	file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
	defer file.Close()
	if err != nil {
		return
	}

	// 直接写入字符串,返回写入字节的数量和err
	n, _ := file.WriteString("写入一行字符串\n")
	fmt.Println(n)

	// 写入byte切片的数据
	strByte := []byte("写入一行byte数据")
	n1, _ := file.Write(strByte)
	fmt.Println(n1)
}

bufio写入文件
import (
	"bufio"
	"os"
)

func main() {

	// 在./路径下创建test.txt文件、写入、每次打开文件清空之前内容
	file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
	defer file.Close()
	if err != nil {
		return
	}

	// 创建writer对象
	writer := bufio.NewWriter(file)
	// 将数据写入缓存
	writer.WriteString("写入一行数据")
	// 将缓存的数据写入文件
	writer.Flush()

}

通过ioutil写入文件
// Go 1.16 开始会废弃 io/ioutil 包
import "io/ioutil"

func main() {
	str := "123123123"
	ioutil.WriteFile("./test.txt", []byte(str), 0666)
}

os.WriteFile写入文件

io/ioutil 包写入文件的代替方案

func main() {

	os.WriteFile("./test.txt", []byte("写入写入"), 0666)
}

文件复制

func main() {
	// 读取文件内容
	byteStr, e := os.ReadFile("./test.txt")
	if e != nil {
		return
	}

	// 读取到的内容写入到指定路径
	e1 := os.WriteFile("./calc/test.txt", byteStr, 0666)
	fmt.Println(e1)

}

/*
本质上就是读取文件内容写入一个新文件,也可以用其他方式循环读取文件流,追加循环写入新文件

*/

创建文件目录

func main() {
	// 创建单级目录,返回一个err
	os.Mkdir("./python", 0666)

	// 创建多级目录,返回一个err,mac 0666会提示权限不足
	os.MkdirAll("./Java/demo/01", 0766)

}

删除文件和目录

func main() {
	// 删除文件
	os.Remove("./test.txt")
	// 删除目录,只能删除最底层的嵌套目录,不能删除上级目录
	os.Remove("./Java/demo/01")

	// 删除包含Java在内的以及Java层级下的所有文件和目录
	os.RemoveAll("./Java")

}

文件重命名


import "os"

func main() {
	
	os.Rename("./test.txt", "te.txt")

}

posted @ 2024-02-25 21:32  木子七  阅读(27)  评论(0编辑  收藏  举报