Go_ioutil包

1. ioutil包的方法

// Discard 是一个 io.Writer 接口,调用它的 Write 方法将不做任何事情
// 并且始终成功返回。
var Discard io.Writer = devNull(0)

// ReadAll 读取 r 中的所有数据,返回读取的数据和遇到的错误。
// 如果读取成功,则 err 返回 nil,而不是 EOF,因为 ReadAll 定义为读取
// 所有数据,所以不会把 EOF 当做错误处理。
func ReadAll(r io.Reader) ([]byte, error)

// ReadFile 读取文件中的所有数据,返回读取的数据和遇到的错误。
// 如果读取成功,则 err 返回 nil,而不是 EOF
func ReadFile(filename string) ([]byte, error)

// WriteFile 向文件中写入数据,写入前会清空文件。
// 如果文件不存在,则会以指定的权限创建该文件。
// 返回遇到的错误。
func WriteFile(filename string, data []byte, perm os.FileMode) error

// ReadDir 读取指定目录中的所有目录和文件(不包括子目录)。
// 返回读取到的文件信息列表和遇到的错误,列表是经过排序的。
func ReadDir(dirname string) ([]os.FileInfo, error)

// NopCloser 将 r 包装为一个 ReadCloser 类型,但 Close 方法不做任何事情。
func NopCloser(r io.Reader) io.ReadCloser

// TempFile 在 dir 目录中创建一个以 prefix 为前缀的临时文件,并将其以读
// 写模式打开。返回创建的文件对象和遇到的错误。
// 如果 dir 为空,则在默认的临时目录中创建文件(参见 os.TempDir),多次
// 调用会创建不同的临时文件,调用者可以通过 f.Name() 获取文件的完整路径。
// 调用本函数所创建的临时文件,应该由调用者自己删除。
func TempFile(dir, prefix string) (f *os.File, err error)

// TempDir 功能同 TempFile,只不过创建的是目录,返回目录的完整路径。
func TempDir(dir, prefix string) (name string, err error)
package main

import (
	"io/ioutil"
	"fmt"
	"os"
)

func main() {
	/*
	ioutil包:
		ReadFile()
		WriteFile()
		ReadDir()
		..
	 */

	//1.读取文件中的所有的数据
	fileName := "/Users/ruby/Documents/pro/a/aa.txt"
	data, err := ioutil.ReadFile(fileName) //不需要打开和关闭文件
	fmt.Println(err)
	fmt.Println(data)
	fmt.Println(string(data))

	//2.写出数据
	fileName := "/Users/ruby/Documents/pro/a/bbb.txt"
	s1 := "床前明月光,地上鞋三双"
	//会清空原来的内容
	//写的数据要求的一个字节类型的切片
	err := ioutil.WriteFile(fileName, []byte(s1), os.ModePerm)
	fmt.Println(err)

	//3.ReadAll() //ReadFile的底层就是调用ReadAll
	s2 := "王二狗和李小花是两个好朋友,Ruby就是我,也是他们的朋友"
	r1 := strings.NewReader(s2)
	data, err := ioutil.ReadAll(r1)
	fmt.Println(err)
	fmt.Println(data)
	fmt.Println(string(data))

	//4.ReadDir(),读取一个目录下的子内容:子文件和子目录,但是只能读取一层
	dirName := "/Users/ruby/Documents/pro"
	fileInfos, err := ioutil.ReadDir(dirName)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(len(fileInfos))
	for i := 0; i < len(fileInfos); i++ {
		//fmt.Printf("%T
",fileInfos[i])
		fmt.Printf("第 %d 个:名称:%s,是否是目录:%t
", i, fileInfos[i].Name(), fileInfos[i].IsDir())
	}

	//5.临时目录和临时文件
	dir, err := ioutil.TempDir("/Users/ruby/Documents/pro/a", "Test")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer os.Remove(dir)
	fmt.Println(dir)

	file, err := ioutil.TempFile(dir, "Test")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer os.Remove(file.Name())
	fmt.Println(file.Name())

}

2. 遍历文件夹

package main

import (
	"io/ioutil"
	"log"
	"fmt"
)

func main() {
	/**
	遍历文件夹:
	 */
	dirname := "/Users/ruby/Documents/pro"
	listFiles(dirname, 0)

}
func listFiles(dirname string, level int) {
	//level用来记录当前递归的层次,生成带有层次感的空格
	s := "|--"
	for i := 0; i < level; i++ {
		s = "|  " + s
	}
	fileInfos, err := ioutil.ReadDir(dirname)
	if err != nil {
		log.Fatal(err)
	}
	for _, fi := range fileInfos {
		filename := dirname + "/" + fi.Name() //拼接目录结构
		fmt.Printf("%s%s
", s, filename)
		if fi.IsDir() {
			//递归调用方法
			listFiles(filename, level+1) //如果是文件夹
		}
	}
}
原文地址:https://www.cnblogs.com/yzg-14/p/12251405.html