默认的os.Open
调用似乎允许其他进程写入已打开的文件,但不能删除它。是否也可以启用删除?在.NET中,可以使用FileShare.Delete
标志来完成,Go中是否有模拟?
答案 0 :(得分:4)
os.Open
将为您提供标记为O_RDONLY
的文件描述符;这意味着只读。您可以使用os.OpenFile
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.
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 // if possible, truncate file when opened.
但是,这些模式都不允许您在单个文件上使用多个写入程序。您可以通过exec
- 或fork
来共享文件描述符,但天真地从两个进程写入文件将导致操作系统决定如何同步这些写入 - 这几乎不是你的想。
当进程上有FD时删除文件并不像unix类系统那么重要。我会继续并假设Windows不会那样。
根据windows标记和@ Not_a_Golfer的优秀观察结果进行修改:
您应该能够将syscall.FILE_SHARE_DELETE
作为标记传递给Windows上的os.OpenFile
,如果这样可以解决您的问题。
如果您需要组合多个标志,您可以将它们组合在一起:
syscall.FILE_SHARE_DELETE | syscall.SOME_OTHER_FLAG | syscall.AND_A_THIRD_FLAG
(但是,请注意,由您来构建一个连贯的标志)