golang写文件异常invalid argument

1
2
3
dst, err := os.OpenFile(path, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0644)
defer dst.Close()
n, err := dst.Write(buffer.Buffer[0:n])

上面是一段很简单的代码,但是在频繁调用的时候报错了了:invalid argument

这个错误着实太误导人了,让我以为是使用的姿势不对,后来发现没有问题,于是开始debug,后来在下面一段代码中发现了真正的问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
func CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) {
r0, _, e1 := Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0)
handle = Handle(r0)
if handle == InvalidHandle {
if e1 != 0 {

err = errnoErr(e1)
} else {
err = EINVAL
}
}
return
}

这里给出了真正的原因:

1
err = errnoErr(e1)//这个地方给出了真正的错误:ERROR_SHARING_VIOLATION (32)

查询微软https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-文档,

这个错误是因为:

1
The process cannot access the file because it is being used by another process.

也就是说,在OpenFile一个文件的时候,之前使用的这个文件的file descriptor 并真正没有释放,所以出错了。

而Golang上层的错误并没有给出明确的错误。

golang写文件异常invalid argument

https://jingzhouzhao.github.io/archives/848ae75e.html

作者

太阳当空赵先生

发布于

2019-09-11

更新于

2022-02-22

许可协议

评论