2 回答
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
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!")
}
- 2 回答
- 0 关注
- 159 浏览
添加回答
举报