英文:
Is it possible to open a file allowing another processes to delete this file?
问题
似乎默认的os.Open
调用允许其他进程写入已打开的文件,但不能删除它。是否可以同时启用删除功能?在.NET中,可以使用FileShare.Delete
标志来实现这一点,Go语言中是否有类似的功能?
英文:
It seems the default os.Open
call allows another processes to write the opened file, but not to delete it. Is it possible to enable deletion as well? In .NET this can be done using FileShare.Delete
flag, is there any analog in Go?
答案1
得分: 6
os.Open
将以设置了O_RDONLY
标志的文件描述符返回,这意味着只读。你可以使用os.OpenFile
来指定自己的标志。
O_RDONLY int = syscall.O_RDONLY // 以只读方式打开文件。
O_WRONLY int = syscall.O_WRONLY // 以只写方式打开文件。
O_RDWR int = syscall.O_RDWR // 以读写方式打开文件。
O_APPEND int = syscall.O_APPEND // 写入时将数据追加到文件末尾。
O_CREATE int = syscall.O_CREAT // 如果文件不存在,则创建一个新文件。
O_EXCL int = syscall.O_EXCL // 与O_CREATE一起使用,文件必须不存在。
O_SYNC int = syscall.O_SYNC // 以同步I/O方式打开。
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开文件时将其截断。
然而,这些模式都不允许在单个文件上有多个写入者。你可以通过exec
或fork
来共享文件描述符,但是从两个进程中直接写入文件将导致操作系统决定如何同步这些写入,这通常不是你想要的结果。
在类Unix系统上,当一个进程拥有一个文件描述符时,删除该文件并不会产生影响。不过,我假设Windows可能不会喜欢这样做。
鉴于[标签:windows]标签和@Not_a_Golfer的优秀观察:
如果这是解决你的问题的方法,你应该能够将syscall.FILE_SHARE_DELETE
作为一个标志传递给os.OpenFile
。
如果你需要组合多个标志,可以通过按位或操作符将它们组合在一起:
syscall.FILE_SHARE_DELETE | syscall.SOME_OTHER_FLAG | syscall.AND_A_THIRD_FLAG
(注意,你需要构建一个一致的标志)。
英文:
os.Open
will get you a file descriptor with flag O_RDONLY
set; that means read only. You can specify your own flag by using 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.
None of these modes, however, will allow you to have multiple writers on a single file. You can share the file descriptor by exec
-ing or fork
-ing but naively writing to the file from both processes will result in the OS deciding how to synchronise those writes -- which is almost never what you want.
Deleting a file while a process has a FD on it doesn't matter on unix-like systems. I'll go ahead and assume Windows won't like that, though.
Edit given the [tag:windows] tag and @Not_a_Golfer's excellent observations:
You should be able to pass syscall.FILE_SHARE_DELETE
as a flag to os.OpenFile
on Windows, if that is what solves your problem.
If you need to combine several flags you can do so by or-ing them together:
syscall.FILE_SHARE_DELETE | syscall.SOME_OTHER_FLAG | syscall.AND_A_THIRD_FLAG
(note, however, that it's up to you to build a coherent flag)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论