ioutil.TempFile和umask

时间:2016-02-11 10:41:47

标签: go io

在我的Go应用程序中,而不是直接写入文件,我想写一个临时文件,在完成所有操作后重命名为最终文件。这是为了避免在应用程序崩溃时将部分写入的内容留在文件中。

目前我使用ioutil.TempFile,但问题是它使用0600权限创建文件,而不是0666.因此,使用典型的umask值获得0600权限,而不是预期0644或0660.这不是问题,是目标文件已经存在,因为我可以将临时权限修复为现有文件,但如果该文件不存在,那么我需要以某种方式推断出当前的umask。

我想我可以复制ioutil.TempFile实现将0666传递给os.OpenFile,但这听起来不太好。那么问题是有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用ioutil.TempDir获取应存储临时文件的文件夹,而不是使用正确的权限自行创建文件。

答案 1 :(得分:1)

我不太了解你的问题。

临时文件必须以尽可能紧密的权限创建,因为拥有它们的全部想法是为您的应用程序提供安全临时存储数据的方法大到适合内存(或将生成的文件交给另一个进程)。 (请注意,在POSIX系统上,打开的文件被视为对它的实时引用,甚至习惯于在打开文件时立即删除该文件,以便除了从创建它的进程写入数据之外无法修改其数据。)

所以在我看来,你正在尝试使用错误的解决方案解决问题。

所以我在像你这样的案件中做的是:

  1. 创建一个与旧文件同名但附加了“.temp”后缀的文件。
  2. 在那里写数据。
  3. 关闭,将其重命名为旧文件。
  4. 如果您觉得使用固定后缀是蹩脚的,您可以“窃取”从ioutil.TempFile()中挑选唯一的非冲突文件名的实施。但是,IMO会过度使用。