1、输入输出流

golang windows api 监控文件变化_打开文件


2、os.FIle用于表示一个打开的文件对象,在文件的操作中都需要使用File

golang windows api 监控文件变化_文件读取_02


2.1、打开文件和关闭文件

golang windows api 监控文件变化_文件读取_03

func main() {
	//1、文件入门 -打开一个文件
	file, err := os.Open("e:/test.txt")
	if err != nil {
		fmt.Println("open file err=", err)
	}
	//输出文件 ,file是一个指针 *File
	fmt.Printf("file=%v", file)
	//关闭文件
	err = file.Close()
	if err != nil {
		fmt.Println("close file err=", err)
	}
}

结果:可见file是一个指针

golang windows api 监控文件变化_打开文件_04

3、文件读取操作

func main(){
//1、创建file对象
	file, err := os.Open("e:/test.txt")
	if err != nil {
		fmt.Println("open file error:", err)
	}
	//defer延迟机制 当函数执行完再执行defer后的语句
	//关闭文件
	defer file.Close()

	//2、创建 *Reader 读文件对象 (带缓冲)
	const (
		//设置默认的缓冲区为4096
		defaultBufSize = 4096
	)
	reader := bufio.NewReader(file)
	//4、循环读取文件内容
	for {
		//当读到一个换行本次读取结束
		str, err := reader.ReadString('\n')
		//io.EOF表示文件的末尾
		if err == io.EOF {
			break
		}
		fmt.Println(str)
	}
	fmt.Println("文件读取结束")
}

结果:中文乱码,后面再解决

golang windows api 监控文件变化_文件读取_05

4、os.OpenFile函数

golang windows api 监控文件变化_golang_06


练习:创建一个新文件并写入 hello golang

func main(){
//3、创建一个新文件并写入 hello golang

	filePath := "e:/test.txt"
	//os.O_WRONLY|os.O_CREATE只写模式打开文件,若文件不存在则创建文件
	//file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)
	//os.O_TRUNC:打开文件时清空文件内容
	//file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_TRUNC, 0666)
	//os.O_APPEND:将要写入的内容添加的文件末尾
	file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		fmt.Println("openFile err", err)
		//结束函数
		return
	}
	//及时关闭file语柄
	defer file.Close()
	str := "hello golang\n"
	//带缓存的wirter
	writer := bufio.NewWriter(file)
	//向test.txt中写入五次 hello golang
	for i := 0; i < 5; i++ {
		writer.WriteString(str)
	}
	//因为writer是带缓存的,因此在调用writerstring方法是,其实先将内容写到缓存中,
	//需要调用flush方法,将缓冲的数据真正的写入到文件中
	writer.Flush()
}

结果:

golang windows api 监控文件变化_打开文件_07


5、ioutil.ReadFile/ioutil.WriteFile 向文件读取/写入数据

练习:将一个文件中的内容复制到另一个文件中

//4、将一个文件中的内容复制到另一个文件中
	filePath := "e:/test.txt"
	fileCopyPath := "e:/testCopy.txt"
	//读取源文件中的内容
	data, err := ioutil.ReadFile(filePath)
	if err != nil {
		fmt.Println("read file err:", err)
		return
	}
	//判断文件是否存在
	str, err := os.Stat(fileCopyPath)
	if err != nil {
		fmt.Println("file isnot found", err)

	}
	err = ioutil.WriteFile(fileCopyPath, data, 0666)
	if err != nil {
		fmt.Println("write data err:", err)

	}

结果:

从控制台可见文件不存在,但outil.WriteFile()会在文件不存在时会创建文件

golang windows api 监控文件变化_golang_08


golang windows api 监控文件变化_文件读取_09

6、func Copy(dst Writer,srcReader)(written int 64,err error) io包提供的文件copy函数
使用:

func main(){
//5、文件copy
	filePath := "e:/iu.jpg"
	fileCopyPath := "e:/iuCopy.jpg"

	//打开文件  
	file, err := os.Open(filePath)
	if err != nil {
		fmt.Println("openFile err:", err)
		return
	}
	fileCopy, err := os.OpenFile(fileCopyPath, os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
		fmt.Println("openFile err:", err)
		return
	}
	//延时关闭文件
	defer file.Close()
	defer fileCopy.Close()
	//创建读写流
	reader := bufio.NewReader(file)
	writer := bufio.NewWriter(fileCopy)

	//复制操作
	intVal, err := io.Copy(writer, reader)
	if err != nil {
		fmt.Println("复制失败", err)
	} else {
		fmt.Println("复制成功,源文件大小:", intVal)
	}

}

结果:

golang windows api 监控文件变化_golang_10