是否可以打开一个文件,允许其他进程删除此文件?

时间:2014-05-27 19:11:26

标签: windows go

默认的os.Open调用似乎允许其他进程写入已打开的文件,但不能删除它。是否也可以启用删除?在.NET中,可以使用FileShare.Delete标志来完成,Go中是否有模拟?

1 个答案:

答案 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不会那样。

根据标记和@ Not_a_Golfer的优秀观察结果进行修改:

您应该能够将syscall.FILE_SHARE_DELETE作为标记传递给Windows上的os.OpenFile,如果这样可以解决您的问题。

如果您需要组合多个标志,您可以将它们组合在一起:

syscall.FILE_SHARE_DELETE | syscall.SOME_OTHER_FLAG | syscall.AND_A_THIRD_FLAG

(但是,请注意,由您来构建一个连贯的标志)