在我的 Go 应用程序中,而不是直接写入文件,我想写入一个临时文件,当一切都完成后,该文件被重命名为最终文件。这是为了避免在应用程序崩溃时将部分写入的内容留在文件中。目前我使用 ioutil.TempFile,但问题是它创建的文件具有 0600 权限,而不是 0666。因此,使用典型的 umask 值可以获得 0600 权限,而不是 0644 或 0660。这不是目标文件的问题已经存在,因为我可以将临时权限修复到现有的大部分,但是如果文件不存在,那么我需要以某种方式推断当前的 umask。我想我可以复制 ioutil.TempFile 实现以将 0666 传递到 os.OpenFile,但这听起来不太好。所以问题是有没有更好的方法?
2 回答
弑天下
TA贡献1818条经验 获得超8个赞
我不太明白你的问题。
必须以尽可能严格的权限创建临时文件,因为拥有它们的整个想法是为您的应用程序提供安全的方式来临时存储太大而无法放入内存的数据(或将生成的文件交给另一个进程) . (请注意,在 POSIX 系统上,打开的文件算作对它的实时引用,甚至习惯于在打开文件时立即删除文件,这样除了从创建它的进程中写入数据之外,没有其他方法可以修改它的数据.)
所以在我看来,您正在尝试使用错误的解决方案来解决您的问题。
所以我在像你这样的情况下做的是:
创建一个与旧文件同名但附加“.temp”后缀的文件。
在那里写数据。
关闭,将其重命名为旧的。
如果您觉得使用固定后缀很蹩脚,您可以“窃取”从ioutil.TempFile()
. 但 IMO 这将是过度设计。
- 2 回答
- 0 关注
- 245 浏览
添加回答
举报
0/150
提交
取消