Golang 文件操作

★基本介绍

  1)打开一个文件进行操作:

    os.Open(name string) ( *File,error)

  2)关闭一个文件

    File.Close()

★读文件

1)带缓冲区的读取方式

读取文件的内容并显示在终端(带缓冲区的方式),使用os.Open,file.Close,bufio.NewReader(),reader.ReadString 函数和方法

复制代码
package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
)
func main(){
    file ,err :=os.Open("d:/test.txt")
    if err != nil {
        fmt.Println("open file err=",err)
    }
    //当函数退出时,要及时的关闭file
    //否则会有内存泄漏
    defer file.Close()
    reader := bufio.NewReader(file)
    //循环的读取文件内容
    for{
        str, err := reader.ReadString('\n')
        if err == io.EOF{//io.EOF 表示文件的末尾
            break
        }
        //输出内容
        fmt.Printf(str)
    }

}
复制代码

 2)一次性读取文件

适用于小文件

复制代码
package main
import (
    "fmt"
    "io/ioutil"
)

func main(){
    //使用ioutil.ReadFile 一次性将文件读取到位
    file := "d:/test.txt"
    content,err := ioutil.ReadFile(file)
    if err != nil {
        fmt.Printf("read file err =%v",err)
    }
    fmt.Printf("%v",string(content))
}
复制代码

 ★写文件

  基本介绍

func OpenFile(name string,flag int,per FileModel) (file *File,err error)

  说明:os.OpenFile 是一个更一般性的文件打开函数,他会使用指定的选项、指定的模式打开i指定名称的文件,如果操作成功,返回的文件对象可用于I/O,如果出错,错误底层类型是 *PathError

  第二个参数:文件打开模式(可以组合用):

复制代码
    const{
        O_RDONLY int = syscall.O_RDONLY//只读模式打开文件
        O_WRONLY int = syscall.O_WRONLY//只写模式打开文件
        O_RDWR int = syscall.O_RDWR//读写模式打开文件
        O_APPEND int = syscall.O_APPEND//写操作时将数据附加到文件尾部
        O_CREATE int = syscall.O_CREATE//如果不存在则创建一个新文件
        O_EXCL int = sysycall.O_EXCL//和O_CREATE 配合使用,文件必须不存在
        O_SYNC int = syscall.O_SYNC//打开文件用于同步I/O
        O_TRUNC int = syscall.O_TRUNC//如果可能,打开时清空文件
    }
复制代码

  第三个参数:权限控制(Linux)

案例一:创建一个新文件,写入内容5 句“hello,Gardon”

复制代码
package main

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

func main(){
    //创建一个新文件,写入内容 5句 “hello,Gardon”
    //1.打开文件 d:/abc.txt
    filePath :="d:/abc.txt"
    file, err := os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE,0666)
    if err != nil {
        fmt.Printf("open file err=%v\n",err)
        return
    }
    //及时关闭file句柄
    defer file.Close()
    //准备写入5句 “hello,Gardon”
    str := "hello,Gardon\n"
    //写入时,使用带缓存的 *Writer
    writer := bufio.NewWriter(file)
    for i := 0;i < 5; i++{
        writer.WriteString(str)
    }
    //因为writer是带缓存,因此在调用writerSting方法时,其实
    //内容是先写入到缓存的,所以需要调用Flus方法,将缓冲的数据
    //真正写入到文件中,否则文件中会没有数据
    writer.Flush()
}
复制代码

案例二:打开一个存在的文件,将原来的内容覆盖成新的内容 10句“你好,创客未来”

复制代码
package main

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

func main() {
    //创建一个新文件,写入内容 5句 “hello,Gardon”
    //1.打开文件 d:/abc.txt
    filePath := "d:/test.txt"
    file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_TRUNC, 0666)
    if err != nil {
        fmt.Printf("open file err=%v\n", err)
        return
    }
    //及时关闭file句柄
    defer file.Close()
    //准备写入10句 “你好,创客未来”
    str := "你好,创客未来\n"
    //写入时,使用带缓存的 *Writer
    writer := bufio.NewWriter(file)
    for i := 0; i < 10; i++ {
        writer.WriteString(str)
    }
    //因为writer是带缓存,因此在调用writerSting方法时,其实
    //内容是先写入到缓存的,所以需要调用Flus方法,将缓冲的数据
    //真正写入到文件中,否则文件中会没有数据
    writer.Flush()
}
复制代码

案例三:将文件A导入(复制)到文件B

复制代码
package main

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

func main() {
    //将d:/test.txt 文件内容导入到 e:/kkk.txt
    //1. 首先将 d:/text.txt 内容读取到内存
    //2. 将读取到的内容写入 d:/kkk.txt
    file1Path := "d:/text.txt"
    file2Path := "d:/kkk.txt"
    data,err := ioutil.ReadFile(file1Path)
    if err != nil {
        //说明文件读取有错误
        fmt.Printf("read file err=v%\n",err)
        return
    } 
    err = ioutil.WriteFile(file2Path,data,0666)
    if err != nil {
        fmt.Printf("write file error=%v\n",err)
    }
}
复制代码

★判断文件是否存在

golang判断文件或文件夹是否存在的方法为使用 os.Stat()函数返回的错误值进行判断:

1)如果返回的错误为null,说明文件或文件夹存在

2)如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在

3)如果返回的错误为其他类型,则不确定是否存在

复制代码
func PathExists(path string)(bool,error){
    _,err := os.Stat(path)
    if err == nil {
        return true,nil
    }
    if os.IsNotExist(err){
        return false,nil
    }
    return false,err
}
复制代码

 

posted @   创客未来  阅读(175)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示