解决go文件操作报错bad file descriptor

发布时间:2024年01月18日

?目录

问题解决

常见的打开模式


问题解决

出现于调用os.Open来打开的文件进行写操作时报的错,原因在于Open函数:

func Open(name string) (*File,error) {
? ? return OpenFile(name, O_RDONLY, 0)
}

Open调用了OpenFile,而OpenFile默认以只读方式来打开文件(参数2为O_RDONLY),因此这时候基于Open要想写就不行了

正确操作(携带的打开模式根据实际情况来):

writerFile, err := os.OpenFile(writerFilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModeAppend) // 读写O_RDWR ? 仅写os.O_WRONLY

常见的打开模式

os.O_CREATE表示文件无则创建

os.O_APPEND:写入时有则追加

os.O_WRONLY:只写模式(write-only)

O_RDONLY:只读模式(read-only)

O_RDWR:读写模式(read-write)

O_EXCL:与 O_CREATE 一起用,构成一个新建文件的功能,它要求文件必须不存在(used with O_CREATE, file must not exist)

O_SYNC:同步方式打开,即不使用缓存,直接写入硬盘

O_TRUNC:打开并清空文件

源码中给出的打开方式有:

// Flags to OpenFile wrapping those of the underlying system. Not all
// flags may be implemented on a given system.
const (
?? ?// Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.
?? ?O_RDONLY int = syscall.O_RDONLY // open the file read-only.
?? ?O_WRONLY int = syscall.O_WRONLY // open the file write-only.
?? ?O_RDWR ? int = syscall.O_RDWR ? // open the file read-write.
?? ?// The remaining values may be or'ed in to control behavior.
?? ?O_APPEND int = syscall.O_APPEND // append data to the file when writing.
?? ?O_CREATE int = syscall.O_CREAT ?// create a new file if none exists.
?? ?O_EXCL ? int = syscall.O_EXCL ? // used with O_CREATE, file must not exist.
?? ?O_SYNC ? int = syscall.O_SYNC ? // open for synchronous I/O.
?? ?O_TRUNC ?int = syscall.O_TRUNC ?// truncate regular writable file when opened.
)

os.ModeAppend为第三个参数,参数3为FileMode:

// The defined file mode bits are the most significant bits of the FileMode.
// The nine least-significant bits are the standard Unix rwxrwxrwx permissions.
// The values of these bits should be considered part of the public API and
// may be used in wire protocols or disk representations: they must not be
// changed, although new bits might be added.
const (
?? ?// The single letters are the abbreviations
?? ?// used by the String method's formatting.
?? ?ModeDir ? ? ? ?= fs.ModeDir ? ? ? ?// d: is a directory
?? ?ModeAppend ? ? = fs.ModeAppend ? ? // a: append-only
?? ?ModeExclusive ?= fs.ModeExclusive ?// l: exclusive use
?? ?ModeTemporary ?= fs.ModeTemporary ?// T: temporary file; Plan 9 only
?? ?ModeSymlink ? ?= fs.ModeSymlink ? ?// L: symbolic link
?? ?ModeDevice ? ? = fs.ModeDevice ? ? // D: device file
?? ?ModeNamedPipe ?= fs.ModeNamedPipe ?// p: named pipe (FIFO)
?? ?ModeSocket ? ? = fs.ModeSocket ? ? // S: Unix domain socket
?? ?ModeSetuid ? ? = fs.ModeSetuid ? ? // u: setuid
?? ?ModeSetgid ? ? = fs.ModeSetgid ? ? // g: setgid
?? ?ModeCharDevice = fs.ModeCharDevice // c: Unix character device, when ModeDevice is set
?? ?ModeSticky ? ? = fs.ModeSticky ? ? // t: sticky
?? ?ModeIrregular ?= fs.ModeIrregular ?// ?: non-regular file; nothing else is known about this file

?? ?// Mask for the type bits. For regular files, none will be set.
?? ?ModeType = fs.ModeType

?? ?ModePerm = fs.ModePerm // Unix permission bits, 0o777
)

文章来源:https://blog.csdn.net/HYZX_9987/article/details/135556710
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。