zoukankan      html  css  js  c++  java
  • Go语言文件操作

    基本介绍

    1. 输入流和输出流
      文件IO流

    2. os.File 封装所有文件相关操作,File是一个结构体

    官方文档

    文件操作

    打开文件和关闭文件

    打开文件使用的是os包下的Open,OpenFile函数

    func Open(name string) (file *File, err error)
    

    Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError。

    func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
    

    OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。

    import "os"
    
    func OpenFileTest() {
    	file, err := os.Open("D:\GoWorkplace\src\project01\resources\test.txt") // 用open函数直接打开
    	if err != nil {
    		fmt.Println("open file err: ", err)
    		return
    	}
    
    	fmt.Println("file: %v", file)
    
    	err = file.Close()
    	if err != nil {
    		fmt.Println("close file err: ", err)
    	}
    }
    
    func OpenFileTest2() {
    	file, err := os.OpenFile("D:\GoWorkplace\src\project01\resources\test.txt", os.O_WRONLY | os.O_CREATE, 0666) // 用openFile函数直接打开
    	if err != nil {
    		fmt.Println("open file err: ", err)
    		return
    	}
    
    	fmt.Println("file: %v", file)
    
    	err = file.Close()
    	if err != nil {
    		fmt.Println("close file err: ", err)
    	}
    }
    

    关闭文件用Close函数,一般会结合defer,在函数执行完毕后自动释放文件句柄

    读取文件内容

    读取文件内容可以用bufio,ioutil两个包

    func FileReaderTest() {
    
    	file, err := os.Open("D:\GoWorkplace\src\project01\resources\test.txt")
    	if err != nil {
    		fmt.Println("open file err: ", err)
    		return
    	}
    
    	defer file.Close()
    
    	reader := bufio.NewReader(file)
    
    	for {
    
    		str, err := reader.ReadString('
    ')
    		fmt.Print(str)
    		if err == io.EOF {
    			break
    		}
    	}
    
    	fmt.Println("read finish...")
    }
    
    func IOUtilTest() {
    
    	file := "../resources/test.txt"
    	content, err := ioutil.ReadFile(file)
    	if err != nil {
    		fmt.Printf("read file err = %v 
    ", err)
    	}
    	fmt.Println(string(content))
    }
    

    修改文件内容

    可以用bufio包下的write函数,也可以使用ioutil包下的write函数

    
    func WriteFileTest3() {
    	filePath := "../resources/test.txt"
    	file, err := os.OpenFile(filePath, os.O_WRONLY | os.O_APPEND, 0666) // 需要选择模式
    	if err != nil {
    		fmt.Printf("oped file err = %v 
    ", err)
    		return
    	}
    	defer file.Close()
    
    	str := "ABC! ENGLISH 
    "
    	writer := bufio.NewWriter(file)
    
    	for i := 0; i < 5; i++ {
    		writer.WriteString(str)
        }
        
        // bufio.writer 是缓存写入,所以需要Flush才能真正写入到文件
    	writer.Flush()
    
    }
    
    
    func ReadAndWriteFileTest() {
    
    	a := "../resources/a.txt"
    	test := "../resources/test.txt"
    
    	content, _ := ioutil.ReadFile(test)
    
    	ioutil.WriteFile(a, content, 0666) // 一次性创建清空写入文件
    }
    
    

    判断文件或文件夹是否存在

    可以使用os.Stat()函数返回单额错误值进行判断

    func Exists(path string) (bool error) {
        _, err := os.Stat(path)
        iif err == nil {
            return true, nil
        } 
        if os.IsNotExist(err) {
            return false, nil
        }
        return false, err
    }
    

    拷贝文件

    缺少很多err的判断

    func CopyFileTest(){
    	a := "../resources/a.txt"
    	b := "../resources/b.txt"
    
    	fa, _ := os.Open(a)
    	fb, _ := os.OpenFile(b, os.O_WRONLY | os.O_CREATE, 0666)
    
    	defer fa.Close()
    	defer fb.Close()
    
    	reader := bufio.NewReader(fa)
    	writer := bufio.NewWriter(fb)
    
    	io.Copy(writer, reader)
    }
    
  • 相关阅读:
    vue项目中,设置所有的input框不能输入空格
    自定义vue-baidu-map 组件的信息窗体infowindow(百度地图信息窗体)
    协程
    线程池--进程池--回调函数
    线程基本内容
    进程基本内容
    锁--互斥锁
    socketserver模块实现并发
    tcp的粘包现象
    一些内置的魔术方法
  • 原文地址:https://www.cnblogs.com/lxlhelloworld/p/14286045.html
Copyright © 2011-2022 走看看