为了账号安全,请及时绑定邮箱和手机立即绑定

写操作后得到 errno

写操作后得到 errno

Go
隔江千里 2021-09-13 16:48:20
查看完整描述

2 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

我有以下 Go 代码,它们最终会填满磁盘并失败ENOSPC(只是一个概念证明)。我如何从err返回的结果中os.Write确定它确实失败了ENOSPC(所以我需要一种errno在写操作后抓取的方法)?


package main


import (

    "log"

    "os"

)


func main() {

    fd, _ := os.Create("dump.txt")


    defer fd.Close()


    for {

        buf := make([]byte, 1024)


        _, err := fd.Write(buf)

        if err != nil {

            log.Fatalf("%T %v", err, err)

        }

    }

}

编辑:按照@FUZxxl 的建议更新程序:


package main


import (

    "log"

    "os"

    "syscall"

)


func main() {

    fd, _ := os.Create("dump.txt")


    defer fd.Close()


    for {

        buf := make([]byte, 1024)


        _, err := fd.Write(buf)

        if err != nil {


            log.Printf("%T %v\n", err, err)

            errno, ok := err.(syscall.Errno)


            if ok {

                log.Println("type assert ok")

                if errno == syscall.ENOSPC {

                    log.Println("got ENOSPC")

                }

            } else {

                log.Println("type assert not ok")

            }

            break

        }

    }

}

但是,我没有得到预期的结果。这是输出:


2015/02/15 10:13:27 *os.PathError write dump.txt: no space left on device

2015/02/15 10:13:27 type assert not ok


查看完整回答
反对 回复 2021-09-13
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

文件操作通常返回一个*os.PathError; 强制err转换os.PathError并使用该Err字段来检查根本原因,如下所示:


patherr, ok := err.(*os.PathError)

if ok && patherr.Err == syscall.ENOSPC {

    log.Println("Out of disk space!")

}


查看完整回答
反对 回复 2021-09-13
  • 2 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信